@@ -362,22 +362,21 @@ CompletionStage<List<V>> invokeLoader(List<K> keys, List<Object> keyContexts, bo
362
362
// and then fill in their values
363
363
//
364
364
CompletionStage <List <V >> batchLoad = invokeLoader (cacheMissedKeys , cacheMissedContexts );
365
- CompletionStage <List < V >> assembledValues = batchLoad .thenApply (batchedValues -> {
365
+ CompletionStage <CacheMissedData < K , V >> assembledValues = batchLoad .thenApply (batchedValues -> {
366
366
assertResultSize (cacheMissedKeys , batchedValues );
367
367
368
368
for (int i = 0 ; i < batchedValues .size (); i ++) {
369
369
K missedKey = cacheMissedKeys .get (i );
370
370
V v = batchedValues .get (i );
371
371
valuesInKeyOrder .put (missedKey , v );
372
372
}
373
- return new ArrayList <>(valuesInKeyOrder .values ());
373
+
374
+ return new CacheMissedData <>(cacheMissedKeys , batchedValues , new ArrayList <>(valuesInKeyOrder .values ()));
374
375
});
375
376
//
376
377
// fire off a call to the ValueCache to allow it to set values into the
377
378
// cache now that we have them
378
- assembledValues = setToValueCache (keys , assembledValues );
379
-
380
- return assembledValues ;
379
+ return setToValueCache (assembledValues );
381
380
}
382
381
});
383
382
}
@@ -454,27 +453,39 @@ private CompletableFuture<List<Try<V>>> getFromValueCache(List<K> keys) {
454
453
}
455
454
}
456
455
457
- private CompletionStage <List <V >> setToValueCache (List <K > keys , CompletionStage <List <V >> assembledValues ) {
456
+ static class CacheMissedData <K , V > {
457
+ final List <K > missedKeys ;
458
+ final List <V > missedValues ;
459
+ final List <V > assembledValues ;
460
+
461
+ CacheMissedData (List <K > missedKeys , List <V > missedValues , List <V > assembledValues ) {
462
+ this .missedKeys = missedKeys ;
463
+ this .missedValues = missedValues ;
464
+ this .assembledValues = assembledValues ;
465
+ }
466
+ }
467
+
468
+ private CompletionStage <List <V >> setToValueCache (CompletionStage <CacheMissedData <K , V >> assembledValues ) {
458
469
try {
459
470
boolean completeValueAfterCacheSet = loaderOptions .getValueCacheOptions ().isCompleteValueAfterCacheSet ();
460
471
if (completeValueAfterCacheSet ) {
461
- return assembledValues .thenCompose (values -> nonNull (valueCache
462
- .setValues (keys , values ), () -> "Your ValueCache.setValues function MUST return a non null promise" )
472
+ return assembledValues .thenCompose (cacheMissedData -> nonNull (valueCache
473
+ .setValues (cacheMissedData . missedKeys , cacheMissedData . missedValues ), () -> "Your ValueCache.setValues function MUST return a non null promise" )
463
474
// we dont trust the set cache to give us the values back - we have them - lets use them
464
475
// if the cache set fails - then they wont be in cache and maybe next time they will
465
- .handle ((ignored , setExIgnored ) -> values ));
476
+ .handle ((ignored , setExIgnored ) -> cacheMissedData . assembledValues ));
466
477
} else {
467
- return assembledValues .thenApply (values -> {
478
+ return assembledValues .thenApply (cacheMissedData -> {
468
479
// no one is waiting for the set to happen here so if its truly async
469
480
// it will happen eventually but no result will be dependant on it
470
- valueCache .setValues (keys , values );
471
- return values ;
481
+ valueCache .setValues (cacheMissedData . missedKeys , cacheMissedData . missedValues );
482
+ return cacheMissedData . assembledValues ;
472
483
});
473
484
}
474
485
} catch (RuntimeException ignored ) {
475
486
// if we cant set values back into the cache - so be it - this must be a faulty
476
487
// ValueCache implementation
477
- return assembledValues ;
488
+ return assembledValues . thenApply ( cacheMissedData -> cacheMissedData . assembledValues ) ;
478
489
}
479
490
}
480
491
0 commit comments