Index: lucene/core/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java =================================================================== --- lucene/core/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java (revision 1476634) +++ lucene/core/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java (working copy) @@ -199,6 +199,7 @@ CachingWrapperFilter filter = new CachingWrapperFilter(startFilter); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); + assertTrue(filter.sizeInBytes() > 0); assertEquals("[query + filter] Should find a hit...", 1, docs.totalHits); Index: lucene/core/src/java/org/apache/lucene/search/CachingWrapperFilter.java =================================================================== --- lucene/core/src/java/org/apache/lucene/search/CachingWrapperFilter.java (revision 1476634) +++ lucene/core/src/java/org/apache/lucene/search/CachingWrapperFilter.java (working copy) @@ -18,14 +18,17 @@ */ import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.WeakHashMap; import org.apache.lucene.index.AtomicReader; import org.apache.lucene.index.AtomicReaderContext; +import org.apache.lucene.util.Bits; import org.apache.lucene.util.FixedBitSet; -import org.apache.lucene.util.Bits; +import org.apache.lucene.util.RamUsageEstimator; /** * Wraps another {@link Filter}'s result and caches it. The purpose is to allow @@ -132,4 +135,21 @@ return null; } }; + + /** Returns total byte size used by cached filters. */ + public long sizeInBytes() { + + // Sync only to pull the current set of values: + List docIdSets; + synchronized(cache) { + docIdSets = new ArrayList(cache.values()); + } + + long total = 0; + for(DocIdSet dis : cache.values()) { + total += RamUsageEstimator.sizeOf(dis); + } + + return total; + } }