@@ -240,27 +240,35 @@ public void close() {
240240 @ API (status = MAINTAINED , since = "6.0" )
241241 public <K , V > Object computeIfAbsent (N namespace , K key , Function <? super K , ? extends V > defaultCreator ) {
242242 Preconditions .notNull (defaultCreator , "defaultCreator must not be null" );
243- CompositeKey < N > compositeKey = new CompositeKey <>(namespace , key );
244- StoredValue storedValue = getStoredValue (compositeKey );
243+ var compositeKey = new CompositeKey <>(namespace , key );
244+ var storedValue = getStoredValue (compositeKey );
245245 var result = StoredValue .evaluateIfNotNull (storedValue );
246246 if (result == null ) {
247- StoredValue newStoredValue = this .storedValues .compute (compositeKey , (__ , oldStoredValue ) -> {
248- if (StoredValue .evaluateIfNotNull (oldStoredValue ) == null ) {
249- rejectIfClosed ();
250- var computedValue = Preconditions .notNull (defaultCreator .apply (key ),
251- "defaultCreator must not return null" );
252- return newStoredValue (() -> {
253- rejectIfClosed ();
254- return computedValue ;
255- });
247+ var value = storedValues .compute (compositeKey ,
248+ (__ , currentValue ) -> currentValue == null || currentValue .equals (storedValue )
249+ ? storeNewValue (key , defaultCreator )
250+ : currentValue );
251+ try {
252+ return requireNonNull (value .evaluate ());
253+ }
254+ catch (Throwable t ) { // remove failed entry to allow retry.
255+ if (value .equals (storedValues .get (compositeKey ))) {
256+ storedValues .remove (compositeKey , value );
256257 }
257- return oldStoredValue ;
258- });
259- return requireNonNull (newStoredValue .evaluate ());
258+ throw t ;
259+ }
260260 }
261261 return result ;
262262 }
263263
264+ private <K , V > StoredValue storeNewValue (K key , Function <? super K , ? extends V > defaultCreator ) {
265+ rejectIfClosed ();
266+ return newStoredValue (new MemoizingSupplier (() -> {
267+ rejectIfClosed ();
268+ return requireNonNull (defaultCreator .apply (key ));
269+ }));
270+ }
271+
264272 /**
265273 * Get the value stored for the supplied namespace and key in this store or
266274 * the parent store, if present, or call the supplied function to compute it
0 commit comments