@@ -169,7 +169,6 @@ public void testCacheDifferentReaders() throws Exception {
169169 assertEquals (2 , requestCacheStats .stats ().getMissCount ());
170170 assertEquals (0 , requestCacheStats .stats ().getEvictions ());
171171 assertTrue (loader .loadedFromCache );
172- assertTrue (loader .loadedFromCache );
173172 assertEquals (1 , cache .count ());
174173 assertEquals (cacheSize , requestCacheStats .stats ().getMemorySize ().bytesAsInt ());
175174 assertEquals (1 , cache .numRegisteredCloseListeners ());
@@ -186,7 +185,6 @@ public void testCacheDifferentReaders() throws Exception {
186185 assertEquals (2 , requestCacheStats .stats ().getMissCount ());
187186 assertEquals (0 , requestCacheStats .stats ().getEvictions ());
188187 assertTrue (loader .loadedFromCache );
189- assertTrue (loader .loadedFromCache );
190188 assertEquals (0 , cache .count ());
191189 assertEquals (0 , requestCacheStats .stats ().getMemorySize ().bytesAsInt ());
192190
@@ -215,7 +213,7 @@ public void testEviction() throws Exception {
215213 new ShardId ("foo" , "bar" , 1 ));
216214 TestEntity secondEntity = new TestEntity (requestCacheStats , indexShard );
217215 Loader secondLoader = new Loader (secondReader , 0 );
218-
216+
219217 BytesReference value1 = cache .getOrCompute (entity , loader , reader , termQuery .buildAsBytes ());
220218 assertEquals ("foo" , value1 .streamInput ().readString ());
221219 BytesReference value2 = cache .getOrCompute (secondEntity , secondLoader , secondReader , termQuery .buildAsBytes ());
@@ -347,6 +345,74 @@ public BytesReference get() {
347345
348346 }
349347
348+ public void testInvalidate () throws Exception {
349+ ShardRequestCache requestCacheStats = new ShardRequestCache ();
350+ IndicesRequestCache cache = new IndicesRequestCache (Settings .EMPTY );
351+ Directory dir = newDirectory ();
352+ IndexWriter writer = new IndexWriter (dir , newIndexWriterConfig ());
353+
354+ writer .addDocument (newDoc (0 , "foo" ));
355+ DirectoryReader reader = ElasticsearchDirectoryReader .wrap (DirectoryReader .open (writer ),
356+ new ShardId ("foo" , "bar" , 1 ));
357+ TermQueryBuilder termQuery = new TermQueryBuilder ("id" , "0" );
358+ AtomicBoolean indexShard = new AtomicBoolean (true );
359+
360+ // initial cache
361+ TestEntity entity = new TestEntity (requestCacheStats , indexShard );
362+ Loader loader = new Loader (reader , 0 );
363+ BytesReference value = cache .getOrCompute (entity , loader , reader , termQuery .buildAsBytes ());
364+ assertEquals ("foo" , value .streamInput ().readString ());
365+ assertEquals (0 , requestCacheStats .stats ().getHitCount ());
366+ assertEquals (1 , requestCacheStats .stats ().getMissCount ());
367+ assertEquals (0 , requestCacheStats .stats ().getEvictions ());
368+ assertFalse (loader .loadedFromCache );
369+ assertEquals (1 , cache .count ());
370+
371+ // cache hit
372+ entity = new TestEntity (requestCacheStats , indexShard );
373+ loader = new Loader (reader , 0 );
374+ value = cache .getOrCompute (entity , loader , reader , termQuery .buildAsBytes ());
375+ assertEquals ("foo" , value .streamInput ().readString ());
376+ assertEquals (1 , requestCacheStats .stats ().getHitCount ());
377+ assertEquals (1 , requestCacheStats .stats ().getMissCount ());
378+ assertEquals (0 , requestCacheStats .stats ().getEvictions ());
379+ assertTrue (loader .loadedFromCache );
380+ assertEquals (1 , cache .count ());
381+ assertTrue (requestCacheStats .stats ().getMemorySize ().bytesAsInt () > value .length ());
382+ assertEquals (1 , cache .numRegisteredCloseListeners ());
383+
384+ // load again after invalidate
385+ entity = new TestEntity (requestCacheStats , indexShard );
386+ loader = new Loader (reader , 0 );
387+ cache .invalidate (entity , reader , termQuery .buildAsBytes ());
388+ value = cache .getOrCompute (entity , loader , reader , termQuery .buildAsBytes ());
389+ assertEquals ("foo" , value .streamInput ().readString ());
390+ assertEquals (1 , requestCacheStats .stats ().getHitCount ());
391+ assertEquals (2 , requestCacheStats .stats ().getMissCount ());
392+ assertEquals (0 , requestCacheStats .stats ().getEvictions ());
393+ assertFalse (loader .loadedFromCache );
394+ assertEquals (1 , cache .count ());
395+ assertTrue (requestCacheStats .stats ().getMemorySize ().bytesAsInt () > value .length ());
396+ assertEquals (1 , cache .numRegisteredCloseListeners ());
397+
398+ // release
399+ if (randomBoolean ()) {
400+ reader .close ();
401+ } else {
402+ indexShard .set (false ); // closed shard but reader is still open
403+ cache .clear (entity );
404+ }
405+ cache .cleanCache ();
406+ assertEquals (1 , requestCacheStats .stats ().getHitCount ());
407+ assertEquals (2 , requestCacheStats .stats ().getMissCount ());
408+ assertEquals (0 , requestCacheStats .stats ().getEvictions ());
409+ assertEquals (0 , cache .count ());
410+ assertEquals (0 , requestCacheStats .stats ().getMemorySize ().bytesAsInt ());
411+
412+ IOUtils .close (reader , writer , dir , cache );
413+ assertEquals (0 , cache .numRegisteredCloseListeners ());
414+ }
415+
350416 private class TestEntity extends AbstractIndexShardCacheEntity {
351417 private final AtomicBoolean standInForIndexShard ;
352418 private final ShardRequestCache shardRequestCache ;
0 commit comments