Index: main/java/org/apache/jackrabbit/oak/plugins/document/DiffCache.java =================================================================== --- main/java/org/apache/jackrabbit/oak/plugins/document/DiffCache.java (revision 1865736) +++ main/java/org/apache/jackrabbit/oak/plugins/document/DiffCache.java (working copy) @@ -70,6 +70,11 @@ */ @NotNull abstract Iterable getStats(); + + /** + * Invalidates all the entries in the cache. + */ + abstract void invalidateAll(); /** * Parses the jsop diff returned by Index: main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreMBean.java =================================================================== --- main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreMBean.java (revision 1865736) +++ main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreMBean.java (working copy) @@ -23,6 +23,8 @@ import org.apache.jackrabbit.oak.api.jmx.Description; import org.apache.jackrabbit.oak.api.jmx.Name; +import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats; +import org.jetbrains.annotations.Nullable; @SuppressWarnings("UnusedDeclaration") public interface DocumentNodeStoreMBean { @@ -76,4 +78,14 @@ @Description("The id of an inactive cluster node.") @Name("clusterId") int clusterId); + + @Description("Invalidates all the caches used by the DocumentNodeStore: DiffCache, NodeCache and NodeChildrenCache.") + String cleanAllCaches(); + + @Description("Invalidates the specified cache: DiffCache, NodeCache or NodeChildrenCache.\n" + + "Note: The values are case insensitive.") + String cleanIndividualCache( + @Description("Possible values are: DIFF, NODE, NODECHILDREN") + @Name("name") + String name); } Index: main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreMBeanImpl.java =================================================================== --- main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreMBeanImpl.java (revision 1865736) +++ main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreMBeanImpl.java (working copy) @@ -30,8 +30,10 @@ import org.apache.jackrabbit.api.stats.TimeSeries; import org.apache.jackrabbit.oak.commons.PathUtils; import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean; +import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats; import org.apache.jackrabbit.oak.plugins.document.util.Utils; import org.apache.jackrabbit.stats.TimeSeriesStatsUtil; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -239,4 +241,29 @@ final String from = Utils.getKeyLowerLimit(pathRef); return nodeStore.getDocumentStore().query(Collection.NODES, from, to, 10000); } + + @Override + public String cleanAllCaches() { + nodeStore.getDiffCache().invalidateAll(); + nodeStore.getNodeCache().invalidateAll(); + nodeStore.getNodeChildrenCache().invalidateAll(); + return "Caches invalidated."; + } + + @Override + public String cleanIndividualCache(String name) { + switch(name.toUpperCase()) { + case "DIFF": + nodeStore.getDiffCache().invalidateAll(); + return "DiffCache invalidated."; + case "NODE": + nodeStore.getNodeCache().invalidateAll(); + return "NodeCache invalidated."; + case "NODECHILDREN": + nodeStore.getNodeChildrenCache().invalidateAll(); + return "NodeChildrenCache invalidated."; + default: + return "ERROR: Invalid cache name received."; + } + } } Index: main/java/org/apache/jackrabbit/oak/plugins/document/JournalDiffLoader.java =================================================================== --- main/java/org/apache/jackrabbit/oak/plugins/document/JournalDiffLoader.java (revision 1865736) +++ main/java/org/apache/jackrabbit/oak/plugins/document/JournalDiffLoader.java (working copy) @@ -307,5 +307,10 @@ Iterable getStats() { return cache.getStats(); } + + @Override + public void invalidateAll() { + cache.invalidateAll(); + } } } Index: main/java/org/apache/jackrabbit/oak/plugins/document/LocalDiffCache.java =================================================================== --- main/java/org/apache/jackrabbit/oak/plugins/document/LocalDiffCache.java (revision 1865736) +++ main/java/org/apache/jackrabbit/oak/plugins/document/LocalDiffCache.java (working copy) @@ -111,6 +111,11 @@ public Iterable getStats() { return Collections.singleton(diffCacheStats); } + + @Override + public void invalidateAll() { + diffCache.invalidateAll(); + } //-----------------------------< internal >--------------------------------- Index: main/java/org/apache/jackrabbit/oak/plugins/document/MemoryDiffCache.java =================================================================== --- main/java/org/apache/jackrabbit/oak/plugins/document/MemoryDiffCache.java (revision 1865736) +++ main/java/org/apache/jackrabbit/oak/plugins/document/MemoryDiffCache.java (working copy) @@ -107,6 +107,11 @@ public Iterable getStats() { return Collections.singleton(diffCacheStats); } + + @Override + public void invalidateAll() { + diffCache.invalidateAll(); + } protected class MemoryEntry implements Entry { Index: main/java/org/apache/jackrabbit/oak/plugins/document/TieredDiffCache.java =================================================================== --- main/java/org/apache/jackrabbit/oak/plugins/document/TieredDiffCache.java (revision 1865736) +++ main/java/org/apache/jackrabbit/oak/plugins/document/TieredDiffCache.java (working copy) @@ -97,4 +97,10 @@ public Iterable getStats() { return Iterables.concat(localCache.getStats(), memoryCache.getStats()); } + + @Override + public void invalidateAll() { + localCache.invalidateAll(); + memoryCache.invalidateAll(); + } } Index: test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java =================================================================== --- test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java (revision 1865736) +++ test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java (working copy) @@ -64,4 +64,9 @@ public Iterable getStats() { return Collections.emptyList(); } + + @Override + public void invalidateAll() { + // Nothing to do + } }