@@ -169,7 +169,6 @@ public void testCacheDifferentReaders() throws Exception {
169
169
assertEquals (2 , requestCacheStats .stats ().getMissCount ());
170
170
assertEquals (0 , requestCacheStats .stats ().getEvictions ());
171
171
assertTrue (loader .loadedFromCache );
172
- assertTrue (loader .loadedFromCache );
173
172
assertEquals (1 , cache .count ());
174
173
assertEquals (cacheSize , requestCacheStats .stats ().getMemorySize ().bytesAsInt ());
175
174
assertEquals (1 , cache .numRegisteredCloseListeners ());
@@ -186,7 +185,6 @@ public void testCacheDifferentReaders() throws Exception {
186
185
assertEquals (2 , requestCacheStats .stats ().getMissCount ());
187
186
assertEquals (0 , requestCacheStats .stats ().getEvictions ());
188
187
assertTrue (loader .loadedFromCache );
189
- assertTrue (loader .loadedFromCache );
190
188
assertEquals (0 , cache .count ());
191
189
assertEquals (0 , requestCacheStats .stats ().getMemorySize ().bytesAsInt ());
192
190
@@ -215,7 +213,7 @@ public void testEviction() throws Exception {
215
213
new ShardId ("foo" , "bar" , 1 ));
216
214
TestEntity secondEntity = new TestEntity (requestCacheStats , indexShard );
217
215
Loader secondLoader = new Loader (secondReader , 0 );
218
-
216
+
219
217
BytesReference value1 = cache .getOrCompute (entity , loader , reader , termQuery .buildAsBytes ());
220
218
assertEquals ("foo" , value1 .streamInput ().readString ());
221
219
BytesReference value2 = cache .getOrCompute (secondEntity , secondLoader , secondReader , termQuery .buildAsBytes ());
@@ -347,6 +345,74 @@ public BytesReference get() {
347
345
348
346
}
349
347
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
+
350
416
private class TestEntity extends AbstractIndexShardCacheEntity {
351
417
private final AtomicBoolean standInForIndexShard ;
352
418
private final ShardRequestCache shardRequestCache ;
0 commit comments