You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2011/10/20 12:19:59 UTC

svn commit: r1186713 - in /jackrabbit/trunk: jackrabbit-api/src/main/java/org/apache/jackrabbit/api/stats/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/ jackrabbit-core/s...

Author: jukka
Date: Thu Oct 20 10:19:58 2011
New Revision: 1186713

URL: http://svn.apache.org/viewvc?rev=1186713&view=rev
Log:
JCR-3117: Stats for the PersistenceManager

Use AtomicLong counters and the TimeSeries mechanism for PM stats

Removed:
    jackrabbit/trunk/jackrabbit-api/src/main/java/org/apache/jackrabbit/api/stats/PersistenceManagerStat.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/PersistenceManagerStatCore.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/PersistenceManagerStatImpl.java
Modified:
    jackrabbit/trunk/jackrabbit-api/src/main/java/org/apache/jackrabbit/api/stats/RepositoryStatistics.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/RepositoryStatisticsImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/StatManager.java

Modified: jackrabbit/trunk/jackrabbit-api/src/main/java/org/apache/jackrabbit/api/stats/RepositoryStatistics.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-api/src/main/java/org/apache/jackrabbit/api/stats/RepositoryStatistics.java?rev=1186713&r1=1186712&r2=1186713&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-api/src/main/java/org/apache/jackrabbit/api/stats/RepositoryStatistics.java (original)
+++ jackrabbit/trunk/jackrabbit-api/src/main/java/org/apache/jackrabbit/api/stats/RepositoryStatistics.java Thu Oct 20 10:19:58 2011
@@ -24,8 +24,13 @@ package org.apache.jackrabbit.api.stats;
 public interface RepositoryStatistics {
 
     enum Type {
-        SESSION_READ_COUNTER(true), 
-        SESSION_READ_DURATION(true), 
+        BUNDLE_READ_COUNTER(true),
+        BUNDLE_READ_DURATION(true),
+        BUNDLE_WRITE_COUNTER(true),
+        BUNDLE_WRITE_DURATION(true),
+        BUNDLE_CACHE_COUNTER(true),
+        SESSION_READ_COUNTER(true),
+        SESSION_READ_DURATION(true),
         SESSION_WRITE_COUNTER(true),
         SESSION_WRITE_DURATION(true),
         SESSION_LOGIN_COUNTER(true),

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=1186713&r1=1186712&r2=1186713&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Thu Oct 20 10:19:58 2011
@@ -1332,11 +1332,7 @@ public class RepositoryImpl extends Abst
         try {
             PersistenceManager pm = pmConfig
                     .newInstance(PersistenceManager.class);
-            PMContext pmContext = new PMContext(homeDir, fs,
-                    context.getRootNodeId(), context.getNamespaceRegistry(),
-                    context.getNodeTypeRegistry(), context.getDataStore());
-            pmContext.setPersistenceManagerStatCore(context.getStatManager()
-                    .getPersistenceManagerStatCore());
+            PMContext pmContext = new PMContext(homeDir, fs, context);
             pm.init(pmContext);
             return pm;
         } catch (Exception e) {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java?rev=1186713&r1=1186712&r2=1186713&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java Thu Oct 20 10:19:58 2011
@@ -20,11 +20,12 @@ import java.io.File;
 
 import javax.jcr.NamespaceRegistry;
 
+import org.apache.jackrabbit.core.RepositoryContext;
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.id.NodeId;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
-import org.apache.jackrabbit.core.stats.PersistenceManagerStatCore;
+import org.apache.jackrabbit.core.stats.RepositoryStatisticsImpl;
 
 /**
  * A <code>PMContext</code> is used to provide context information for a
@@ -64,32 +65,26 @@ public class PMContext {
      */
     private final DataStore dataStore;
 
-    /**
-     * PersistenceManagerStatCore stats object for the PM.
-     */
-    private PersistenceManagerStatCore persistenceManagerStatCore;
+    /** Repository statistics collector. */
+    private final RepositoryStatisticsImpl stats;
 
     /**
      * Creates a new <code>PMContext</code>.
      *
      * @param homeDir the physical home directory
      * @param fs the virtual jackrabbit filesystem
-     * @param rootNodeId id of the root node
-     * @param nsReg        namespace registry
-     * @param ntReg        node type registry
+     * @param context repository component context
      */
     public PMContext(File homeDir,
                      FileSystem fs,
-                     NodeId rootNodeId,
-                     NamespaceRegistry nsReg,
-                     NodeTypeRegistry ntReg,
-                     DataStore dataStore) {
+                     RepositoryContext context) {
         this.physicalHomeDir = homeDir;
         this.fs = fs;
-        this.rootNodeId = rootNodeId;
-        this.nsReg = nsReg;
-        this.ntReg = ntReg;
-        this.dataStore = dataStore;
+        this.rootNodeId = context.getRootNodeId();
+        this.nsReg = context.getNamespaceRegistry();
+        this.ntReg = context.getNodeTypeRegistry();
+        this.dataStore = context.getDataStore();
+        this.stats = context.getRepositoryStatistics();
     }
 
 
@@ -144,17 +139,14 @@ public class PMContext {
         return dataStore;
     }
 
+
     /**
-     * Returns the PersistenceManagerStatCore stats object for the PM.
-     * 
-     * @return the PersistenceManagerStatCore stats object for the PM.
+     * Returns the repository statistics collector.
+     *
+     * @return repository statistics
      */
-    public PersistenceManagerStatCore getPersistenceManagerStatCore() {
-        return persistenceManagerStatCore;
+    public RepositoryStatisticsImpl getRepositoryStatistics() {
+        return stats;
     }
 
-    public void setPersistenceManagerStatCore(
-            PersistenceManagerStatCore persistenceManagerStatCore) {
-        this.persistenceManagerStatCore = persistenceManagerStatCore;
-    }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java?rev=1186713&r1=1186712&r2=1186713&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java Thu Oct 20 10:19:58 2011
@@ -23,9 +23,11 @@ import static org.apache.jackrabbit.spi.
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.jcr.PropertyType;
 
+import org.apache.jackrabbit.api.stats.RepositoryStatistics;
 import org.apache.jackrabbit.core.cache.Cache;
 import org.apache.jackrabbit.core.cache.CacheAccessListener;
 import org.apache.jackrabbit.core.cache.ConcurrentCache;
@@ -49,7 +51,7 @@ import org.apache.jackrabbit.core.state.
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
-import org.apache.jackrabbit.core.stats.PersistenceManagerStatCore;
+import org.apache.jackrabbit.core.stats.RepositoryStatisticsImpl;
 import org.apache.jackrabbit.core.util.StringIndex;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
@@ -133,8 +135,20 @@ public abstract class AbstractBundlePers
     /** default size of the bundle cache */
     private long bundleCacheSize = 8 * 1024 * 1024;
 
-    /** statistics object */
-    private PersistenceManagerStatCore pmStatCore;
+    /** Counter of read operations. */
+    private AtomicLong readCounter;
+
+    /** Counter of write operations. */
+    private AtomicLong writeCounter;
+
+    /** Duration of read operations. */
+    private AtomicLong readDuration;
+
+    /** Duration of write operations. */
+    private AtomicLong writeDuration;
+
+    /** Counter of bundle cache accesses. */
+    private AtomicLong cacheCounter;
 
     /**
      * Returns the size of the bundle cache in megabytes.
@@ -398,7 +412,19 @@ public abstract class AbstractBundlePers
         bundles = new ConcurrentCache<NodeId, NodePropBundle>(context.getHomeDir().getName() + "BundleCache");
         bundles.setMaxMemorySize(bundleCacheSize);
         bundles.setAccessListener(this);
-        pmStatCore = context.getPersistenceManagerStatCore();
+
+        // statistics
+        RepositoryStatisticsImpl stats = context.getRepositoryStatistics();
+        cacheCounter = stats.getCounter(
+                RepositoryStatistics.Type.BUNDLE_CACHE_COUNTER);
+        readCounter = stats.getCounter(
+                RepositoryStatistics.Type.BUNDLE_READ_COUNTER);
+        readDuration = stats.getCounter(
+                RepositoryStatistics.Type.BUNDLE_READ_DURATION);
+        writeCounter = stats.getCounter(
+                RepositoryStatistics.Type.BUNDLE_WRITE_COUNTER);
+        writeDuration = stats.getCounter(
+                RepositoryStatistics.Type.BUNDLE_WRITE_DURATION);
     }
 
     /**
@@ -675,17 +701,7 @@ public abstract class AbstractBundlePers
             return bundle;
         }
         // cache miss
-        if (pmStatCore != null && pmStatCore.isEnabled()) {
-            long t = System.currentTimeMillis();
-            try {
-                return getBundleCacheMiss(id);
-            } finally {
-                t = System.currentTimeMillis() - t;
-                pmStatCore.onReadCacheMiss(t);
-            }
-        } else {
-            return getBundleCacheMiss(id);
-        }
+        return getBundleCacheMiss(id);
     }
 
     /**
@@ -700,7 +716,11 @@ public abstract class AbstractBundlePers
      */
     private NodePropBundle getBundleCacheMiss(NodeId id)
             throws ItemStateException {
+        long time = System.nanoTime();
         NodePropBundle bundle = loadBundle(id);
+        readDuration.addAndGet(System.nanoTime() - time);
+        readCounter.incrementAndGet();
+
         if (bundle != null) {
             bundle.markOld();
             bundles.put(id, bundle, bundle.getSize());
@@ -729,15 +749,12 @@ public abstract class AbstractBundlePers
      * @throws ItemStateException if an error occurs
      */
     private void putBundle(NodePropBundle bundle) throws ItemStateException {
-
-        long time = System.currentTimeMillis();
+        long time = System.nanoTime();
         storeBundle(bundle);
+        writeDuration.addAndGet(System.nanoTime() - time);
+        writeCounter.incrementAndGet();
+
         bundle.markOld();
-        log.debug("stored bundle {} in {} ms", new Object[] { bundle.getId(),
-                System.currentTimeMillis() - time });
-        if (pmStatCore != null && pmStatCore.isEnabled()) {
-            pmStatCore.onBundleWrite(System.currentTimeMillis() - time);
-        }
 
         // only put to cache if already exists. this is to ensure proper
         // overwrite and not creating big contention during bulk loads
@@ -765,7 +782,7 @@ public abstract class AbstractBundlePers
 
     public void cacheAccessed(long accessCount) {
         logCacheStats();
-        pmStatCore.cacheAccessed(accessCount);
+        cacheCounter.addAndGet(accessCount);
     }
 
     private void logCacheStats() {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/RepositoryStatisticsImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/RepositoryStatisticsImpl.java?rev=1186713&r1=1186712&r2=1186713&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/RepositoryStatisticsImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/RepositoryStatisticsImpl.java Thu Oct 20 10:19:58 2011
@@ -48,6 +48,10 @@ public class RepositoryStatisticsImpl im
         getOrCreateRecorder(Type.SESSION_READ_DURATION);
         getOrCreateRecorder(Type.SESSION_WRITE_COUNTER);
         getOrCreateRecorder(Type.SESSION_WRITE_DURATION);
+        getOrCreateRecorder(Type.BUNDLE_READ_COUNTER);
+        getOrCreateRecorder(Type.BUNDLE_READ_DURATION);
+        getOrCreateRecorder(Type.BUNDLE_WRITE_COUNTER);
+        getOrCreateRecorder(Type.BUNDLE_WRITE_DURATION);
     }
 
     public synchronized Iterator<Entry<Type, TimeSeries>> iterator() {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/StatManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/StatManager.java?rev=1186713&r1=1186712&r2=1186713&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/StatManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/StatManager.java Thu Oct 20 10:19:58 2011
@@ -30,7 +30,6 @@ public class StatManager {
 
     public static String ALL_STATS_ENABLED_PROPERTY = "org.apache.jackrabbit.api.stats.ALL";
     public static String QUERY_STATS_ENABLED_PROPERTY = "org.apache.jackrabbit.api.stats.QueryStat";
-    public static String PM_STATS_ENABLED_PROPERTY = "org.apache.jackrabbit.api.stats.PersistenceManagerStat";
 
     private static final Logger log = LoggerFactory
             .getLogger(StatManager.class);
@@ -38,8 +37,6 @@ public class StatManager {
     /* STAT OBJECTS */
     private final QueryStatCore queryStat = new QueryStatImpl();
 
-    private final PersistenceManagerStatCore pmStat = new PersistenceManagerStatImpl();
-
     public StatManager() {
         init();
     }
@@ -48,17 +45,13 @@ public class StatManager {
         boolean allEnabled = getBoolean(ALL_STATS_ENABLED_PROPERTY);
         queryStat.setEnabled(allEnabled
                 || getBoolean(QUERY_STATS_ENABLED_PROPERTY));
-        pmStat.setEnabled(allEnabled || getBoolean(PM_STATS_ENABLED_PROPERTY));
         log.debug(
-                "Started StatManager. QueryStat is enabled {}, PersistenceManagerStat is enabled {}",
-                new Object[] { queryStat.isEnabled(), pmStat.isEnabled() });
+                "Started StatManager. QueryStat is enabled {}",
+                new Object[] { queryStat.isEnabled() });
     }
 
     public QueryStatCore getQueryStat() {
         return queryStat;
     }
 
-    public PersistenceManagerStatCore getPersistenceManagerStatCore() {
-        return pmStat;
-    }
 }