@@ -1929,18 +1929,6 @@ public void run() {
1929
1929
accessOrderWindowDeque ().offerLast (node );
1930
1930
}
1931
1931
}
1932
-
1933
- // Ensure that in-flight async computation cannot expire (reset on a completion callback)
1934
- if (isComputingAsync (node .getValue ())) {
1935
- synchronized (node ) {
1936
- if (!Async .isReady ((CompletableFuture <?>) node .getValue ())) {
1937
- long expirationTime = expirationTicker ().read () + ASYNC_EXPIRY ;
1938
- setVariableTime (node , expirationTime );
1939
- setAccessTime (node , expirationTime );
1940
- setWriteTime (node , expirationTime );
1941
- }
1942
- }
1943
- }
1944
1932
}
1945
1933
}
1946
1934
@@ -2311,6 +2299,9 @@ public void putAll(Map<? extends K, ? extends V> map) {
2311
2299
node = nodeFactory .newNode (key , keyReferenceQueue (),
2312
2300
value , valueReferenceQueue (), newWeight , now );
2313
2301
setVariableTime (node , expireAfterCreate (key , value , expiry , now ));
2302
+ long expirationTime = isComputingAsync (value ) ? (now + ASYNC_EXPIRY ) : now ;
2303
+ setAccessTime (node , expirationTime );
2304
+ setWriteTime (node , expirationTime );
2314
2305
}
2315
2306
prior = data .putIfAbsent (node .getKeyReference (), node );
2316
2307
if (prior == null ) {
@@ -2391,21 +2382,22 @@ public void putAll(Map<? extends K, ? extends V> map) {
2391
2382
varTime = expireAfterUpdate (prior , key , value , expiry , now );
2392
2383
}
2393
2384
2385
+ long expirationTime = isComputingAsync (value ) ? (now + ASYNC_EXPIRY ) : now ;
2394
2386
if (mayUpdate ) {
2395
2387
exceedsTolerance =
2396
2388
(expiresAfterWrite () && (now - prior .getWriteTime ()) > EXPIRE_WRITE_TOLERANCE )
2397
2389
|| (expiresVariable ()
2398
2390
&& Math .abs (varTime - prior .getVariableTime ()) > EXPIRE_WRITE_TOLERANCE );
2391
+ setWriteTime (prior , expirationTime );
2399
2392
2400
2393
prior .setValue (value , valueReferenceQueue ());
2401
2394
prior .setWeight (newWeight );
2402
- setWriteTime (prior , now );
2403
2395
2404
2396
discardRefresh (prior .getKeyReference ());
2405
2397
}
2406
2398
2407
2399
setVariableTime (prior , varTime );
2408
- setAccessTime (prior , now );
2400
+ setAccessTime (prior , expirationTime );
2409
2401
}
2410
2402
2411
2403
if (expired ) {
@@ -2422,9 +2414,6 @@ public void putAll(Map<? extends K, ? extends V> map) {
2422
2414
} else if (!onlyIfAbsent && exceedsTolerance ) {
2423
2415
afterWrite (new UpdateTask (prior , weightedDifference ));
2424
2416
} else {
2425
- if (mayUpdate ) {
2426
- setWriteTime (prior , now );
2427
- }
2428
2417
afterRead (prior , now , /* recordHit= */ false );
2429
2418
}
2430
2419
@@ -2548,9 +2537,11 @@ public boolean remove(Object key, Object value) {
2548
2537
n .setValue (value , valueReferenceQueue ());
2549
2538
n .setWeight (weight );
2550
2539
2540
+ long expirationTime = isComputingAsync (value ) ? (now [0 ] + ASYNC_EXPIRY ) : now [0 ];
2541
+ setAccessTime (n , expirationTime );
2542
+ setWriteTime (n , expirationTime );
2551
2543
setVariableTime (n , varTime );
2552
- setAccessTime (n , now [0 ]);
2553
- setWriteTime (n , now [0 ]);
2544
+
2554
2545
discardRefresh (k );
2555
2546
return n ;
2556
2547
}
@@ -2605,9 +2596,10 @@ public boolean replace(K key, V oldValue, V newValue, boolean shouldDiscardRefre
2605
2596
n .setValue (newValue , valueReferenceQueue ());
2606
2597
n .setWeight (weight );
2607
2598
2599
+ long expirationTime = isComputingAsync (newValue ) ? (now [0 ] + ASYNC_EXPIRY ) : now [0 ];
2600
+ setAccessTime (n , expirationTime );
2601
+ setWriteTime (n , expirationTime );
2608
2602
setVariableTime (n , varTime );
2609
- setAccessTime (n , now [0 ]);
2610
- setWriteTime (n , now [0 ]);
2611
2603
2612
2604
if (shouldDiscardRefresh ) {
2613
2605
discardRefresh (k );
@@ -2697,6 +2689,9 @@ public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
2697
2689
var created = nodeFactory .newNode (key , keyReferenceQueue (),
2698
2690
newValue [0 ], valueReferenceQueue (), weight [1 ], now [0 ]);
2699
2691
setVariableTime (created , expireAfterCreate (key , newValue [0 ], expiry (), now [0 ]));
2692
+ long expirationTime = isComputingAsync (newValue [0 ]) ? (now [0 ] + ASYNC_EXPIRY ) : now [0 ];
2693
+ setAccessTime (created , expirationTime );
2694
+ setWriteTime (created , expirationTime );
2700
2695
return created ;
2701
2696
}
2702
2697
@@ -2730,8 +2725,14 @@ public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
2730
2725
n .setWeight (weight [1 ]);
2731
2726
2732
2727
setVariableTime (n , varTime );
2733
- setAccessTime (n , now [0 ]);
2734
- setWriteTime (n , now [0 ]);
2728
+ if (isComputingAsync (newValue [0 ])) {
2729
+ long expirationTime = now [0 ] + ASYNC_EXPIRY ;
2730
+ setAccessTime (n , expirationTime );
2731
+ setWriteTime (n , expirationTime );
2732
+ } else {
2733
+ setAccessTime (n , now [0 ]);
2734
+ setWriteTime (n , now [0 ]);
2735
+ }
2735
2736
discardRefresh (k );
2736
2737
return n ;
2737
2738
}
@@ -2867,9 +2868,12 @@ public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
2867
2868
long varTime = expireAfterCreate (key , newValue [0 ], expiry , now [0 ]);
2868
2869
var created = nodeFactory .newNode (keyRef , newValue [0 ],
2869
2870
valueReferenceQueue (), weight [1 ], now [0 ]);
2871
+
2872
+ long expirationTime = isComputingAsync (newValue [0 ]) ? (now [0 ] + ASYNC_EXPIRY ) : now [0 ];
2873
+ setAccessTime (created , expirationTime );
2874
+ setWriteTime (created , expirationTime );
2870
2875
setVariableTime (created , varTime );
2871
- setAccessTime (created , now [0 ]);
2872
- setWriteTime (created , now [0 ]);
2876
+
2873
2877
discardRefresh (key );
2874
2878
return created ;
2875
2879
}
@@ -2920,9 +2924,11 @@ public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
2920
2924
n .setValue (newValue [0 ], valueReferenceQueue ());
2921
2925
n .setWeight (weight [1 ]);
2922
2926
2927
+ long expirationTime = isComputingAsync (newValue [0 ]) ? (now [0 ] + ASYNC_EXPIRY ) : now [0 ];
2928
+ setAccessTime (n , expirationTime );
2929
+ setWriteTime (n , expirationTime );
2923
2930
setVariableTime (n , varTime );
2924
- setAccessTime (n , now [0 ]);
2925
- setWriteTime (n , now [0 ]);
2931
+
2926
2932
discardRefresh (kr );
2927
2933
return n ;
2928
2934
}
0 commit comments