You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2015/03/04 16:20:25 UTC
svn commit: r1664038 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/document/
main/java/org/apache/jackrabbit/oak/plugins/document/cache/
main/java/org/apache/jackrabbit/oak/plugins/document/memory/
main/java/org/a...
Author: chetanm
Date: Wed Mar 4 15:20:24 2015
New Revision: 1664038
URL: http://svn.apache.org/r1664038
Log:
OAK-2572 - Include cache invalidation stats in logs related to background operations
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java (with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java Wed Mar 4 15:20:24 2015
@@ -74,6 +74,7 @@ import org.apache.jackrabbit.oak.commons
import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob;
import org.apache.jackrabbit.oak.plugins.blob.MarkSweepGarbageCollector;
import org.apache.jackrabbit.oak.plugins.document.Checkpoints.Info;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
import org.apache.jackrabbit.oak.plugins.document.mongo.MongoBlobReferenceIterator;
import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
import org.apache.jackrabbit.oak.plugins.document.persistentCache.PersistentCache;
@@ -1526,14 +1527,14 @@ public final class DocumentNodeStore
long writeTime = clock.getTime() - time;
time = clock.getTime();
// pull in changes from other cluster nodes
- backgroundRead(true);
+ BackgroundReadStats readStats = backgroundRead(true);
long readTime = clock.getTime() - time;
- String msg = "Background operations stats (clean:{}, split:{}, write:{}, read:{})";
+ String msg = "Background operations stats (clean:{}, split:{}, write:{}, read:{} {})";
if (clock.getTime() - start > TimeUnit.SECONDS.toMillis(10)) {
// log as info if it took more than 10 seconds
- LOG.info(msg, cleanTime, splitTime, writeTime, readTime);
+ LOG.info(msg, cleanTime, splitTime, writeTime, readTime, readStats);
} else {
- LOG.debug(msg, cleanTime, splitTime, writeTime, readTime);
+ LOG.debug(msg, cleanTime, splitTime, writeTime, readTime, readStats);
}
} catch (RuntimeException e) {
if (isDisposed.get()) {
@@ -1587,11 +1588,13 @@ public final class DocumentNodeStore
* @param dispatchChange whether to dispatch external changes
* to {@link #dispatcher}.
*/
- void backgroundRead(boolean dispatchChange) {
+ BackgroundReadStats backgroundRead(boolean dispatchChange) {
+ BackgroundReadStats stats = new BackgroundReadStats();
+ long time = clock.getTime();
String id = Utils.getIdFromPath("/");
NodeDocument doc = store.find(Collection.NODES, id, asyncDelay);
if (doc == null) {
- return;
+ return stats;
}
Map<Integer, Revision> lastRevMap = doc.getLastRev();
@@ -1624,9 +1627,14 @@ public final class DocumentNodeStore
}
}
+ stats.readHead = clock.getTime() - time;
+ time = clock.getTime();
+
if (!externalChanges.isEmpty()) {
// invalidate caches
- store.invalidateCache();
+ stats.cacheStats = store.invalidateCache();
+ stats.cacheInvalidationTime = clock.getTime() - time;
+ time = clock.getTime();
// TODO only invalidate affected items
docChildrenCache.invalidateAll();
@@ -1649,8 +1657,36 @@ public final class DocumentNodeStore
} finally {
backgroundOperationLock.writeLock().unlock();
}
+ stats.dispatchChanges = clock.getTime() - time;
+ time = clock.getTime();
}
revisionComparator.purge(revisionPurgeMillis());
+ stats.purge = clock.getTime() - time;
+
+ return stats;
+ }
+
+ private static class BackgroundReadStats {
+ CacheInvalidationStats cacheStats;
+ long readHead;
+ long cacheInvalidationTime;
+ long dispatchChanges;
+ long purge;
+
+ @Override
+ public String toString() {
+ String cacheStatsMsg = "NOP";
+ if (cacheStats != null){
+ cacheStatsMsg = cacheStats.summaryReport();
+ }
+ return "ReadStats{" +
+ "cacheStats:" + cacheStatsMsg +
+ ", head:" + readHead +
+ ", cache:" + cacheInvalidationTime +
+ ", dispatch:" + dispatchChanges +
+ ", purge:" + purge +
+ '}';
+ }
}
/**
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java Wed Mar 4 15:20:24 2015
@@ -23,6 +23,7 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.cache.CacheStats;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
/**
* The interface for the backend storage for documents.
@@ -213,7 +214,8 @@ public interface DocumentStore {
/**
* Invalidate the document cache.
*/
- void invalidateCache();
+ @CheckForNull
+ CacheInvalidationStats invalidateCache();
/**
* Invalidate the document cache for the given key.
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java?rev=1664038&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java Wed Mar 4 15:20:24 2015
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.document.cache;
+
+public interface CacheInvalidationStats {
+
+ String summaryReport();
+}
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java Wed Mar 4 15:20:24 2015
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.plugins
import com.google.common.base.Splitter;
import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
/**
* Emulates a MongoDB store (possibly consisting of multiple shards and
@@ -298,8 +299,8 @@ public class MemoryDocumentStore impleme
}
@Override
- public void invalidateCache() {
- // there is no cache, so nothing to invalidate
+ public CacheInvalidationStats invalidateCache() {
+ return null;
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java Wed Mar 4 15:20:24 2015
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.Collection;
import org.apache.jackrabbit.oak.plugins.document.Document;
import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -65,7 +66,7 @@ abstract class CacheInvalidator {
return new SimpleInvalidator(documentStore);
}
- static class InvalidationResult {
+ static class InvalidationResult implements CacheInvalidationStats{
int invalidationCount;
int upToDateCount;
int cacheSize;
@@ -84,6 +85,11 @@ abstract class CacheInvalidator {
", cacheEntriesProcessedCount=" + cacheEntriesProcessedCount +
'}';
}
+
+ @Override
+ public String summaryReport() {
+ return toString();
+ }
}
private static class SimpleInvalidator extends CacheInvalidator {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java Wed Mar 4 15:20:24 2015
@@ -58,6 +58,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Operation;
import org.apache.jackrabbit.oak.plugins.document.UpdateUtils;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
import org.apache.jackrabbit.oak.plugins.document.cache.ForwardingListener;
import org.apache.jackrabbit.oak.plugins.document.cache.NodeDocOffHeapCache;
import org.apache.jackrabbit.oak.plugins.document.cache.OffHeapCache;
@@ -260,10 +261,10 @@ public class MongoDocumentStore implemen
}
@Override
- public void invalidateCache() {
+ public CacheInvalidationStats invalidateCache() {
//TODO Check if we should use LinearInvalidator for small cache sizes as
//that would lead to lesser number of queries
- CacheInvalidator.createHierarchicalInvalidator(this).invalidateCache();
+ return CacheInvalidator.createHierarchicalInvalidator(this).invalidateCache();
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Wed Mar 4 15:20:24 2015
@@ -64,6 +64,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Operation;
import org.apache.jackrabbit.oak.plugins.document.UpdateUtils;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
import org.apache.jackrabbit.oak.plugins.document.util.StringValue;
import org.slf4j.Logger;
@@ -261,8 +262,9 @@ public class RDBDocumentStore implements
}
@Override
- public void invalidateCache() {
+ public CacheInvalidationStats invalidateCache() {
nodesCache.invalidateAll();
+ return null;
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java Wed Mar 4 15:20:24 2015
@@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.DocumentStore;
import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -221,10 +222,10 @@ public class LoggingDocumentStoreWrapper
}
@Override
- public void invalidateCache() {
+ public CacheInvalidationStats invalidateCache() {
try {
logMethod("invalidateCache");
- store.invalidateCache();
+ return store.invalidateCache();
} catch (Exception e) {
logException(e);
throw convert(e);
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java Wed Mar 4 15:20:24 2015
@@ -26,6 +26,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.Document;
import org.apache.jackrabbit.oak.plugins.document.DocumentStore;
import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
/**
* Implements a <code>DocumentStore</code> wrapper which synchronizes on all
@@ -98,8 +99,8 @@ public class SynchronizingDocumentStoreW
}
@Override
- public synchronized void invalidateCache() {
- store.invalidateCache();
+ public synchronized CacheInvalidationStats invalidateCache() {
+ return store.invalidateCache();
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java Wed Mar 4 15:20:24 2015
@@ -34,6 +34,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.DocumentStore;
import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
/**
* A MicroKernel wrapper that can be used to log and also time MicroKernel
@@ -249,11 +250,12 @@ public class TimingDocumentStoreWrapper
}
@Override
- public void invalidateCache() {
+ public CacheInvalidationStats invalidateCache() {
try {
long start = now();
- base.invalidateCache();
+ CacheInvalidationStats result = base.invalidateCache();
updateAndLogTimes("invalidateCache", start, 0, 0);
+ return result;
} catch (Exception e) {
throw convert(e);
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java?rev=1664038&r1=1664037&r2=1664038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java Wed Mar 4 15:20:24 2015
@@ -56,6 +56,7 @@ import com.google.common.collect.Sets;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
import org.apache.jackrabbit.oak.plugins.document.util.TimingDocumentStoreWrapper;
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
@@ -89,10 +90,11 @@ public class DocumentNodeStoreTest {
DocumentStore docStore = new MemoryDocumentStore();
DocumentStore testStore = new TimingDocumentStoreWrapper(docStore) {
@Override
- public void invalidateCache() {
+ public CacheInvalidationStats invalidateCache() {
super.invalidateCache();
semaphore.acquireUninterruptibly();
semaphore.release();
+ return null;
}
};
final DocumentNodeStore store1 = new DocumentMK.Builder().setAsyncDelay(0)