From 5570ae77e51ba29a03be4a8f6b5fc765a0067004 Mon Sep 17 00:00:00 2001 From: ajay_maddi Date: Thu, 19 Jan 2023 14:16:15 +0530 Subject: [PATCH] added changes for issue#2742 --- .../internal/store/tiering/CacheStore.java | 5 ++- .../store/tiering/CacheStoreTest.java | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/impl/src/main/java/org/ehcache/internal/store/tiering/CacheStore.java b/impl/src/main/java/org/ehcache/internal/store/tiering/CacheStore.java index 22a9838dfb..0a326aa808 100644 --- a/impl/src/main/java/org/ehcache/internal/store/tiering/CacheStore.java +++ b/impl/src/main/java/org/ehcache/internal/store/tiering/CacheStore.java @@ -439,7 +439,10 @@ public NoopCachingTier(final AuthoritativeTier authoritativeTier) { @Override public ValueHolder getOrComputeIfAbsent(final K key, final Function> source) throws CacheAccessException { final ValueHolder apply = source.apply(key); - authoritativeTier.flush(key, apply); + if (apply != null) { + //immediately flushes any entries faulted from authority as this tier has no capacity + authoritativeTier.flush(key, apply); + } return apply; } diff --git a/impl/src/test/java/org/ehcache/internal/store/tiering/CacheStoreTest.java b/impl/src/test/java/org/ehcache/internal/store/tiering/CacheStoreTest.java index a5e468d288..b64c65ec75 100644 --- a/impl/src/test/java/org/ehcache/internal/store/tiering/CacheStoreTest.java +++ b/impl/src/test/java/org/ehcache/internal/store/tiering/CacheStoreTest.java @@ -639,6 +639,44 @@ public void run() { org.mockito.Matchers.any(), org.mockito.Matchers.>>anyObject()); } + @Test + public void AuthoritativeTierNullCheckDuringFlush() throws CacheAccessException, BrokenBarrierException, InterruptedException { + + + final CachingTier cachingTier = mock(CachingTier.class); + final AuthoritativeTier authoritativeTier = mock(AuthoritativeTier.class); + + final CacheStore cacheStore = new CacheStore(cachingTier, authoritativeTier); + + final CyclicBarrier barrier = new CyclicBarrier(2); + + doAnswer(new Answer() { + @Override + public Void answer(final InvocationOnMock invocation) throws Throwable { + barrier.await(); + barrier.await(); + return null; + } + }).when(authoritativeTier).clear(); + Thread t = new Thread(new Runnable() { + @Override + public void run() { + try { + cacheStore.clear(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + + t.start(); + barrier.await(); + cacheStore.get("foo"); + barrier.await(); + t.join(); + verify(stringAuthoritativeTier, never()).flush("foo", null); + } + public Map.Entry newMapEntry(Number key, CharSequence value) { return new AbstractMap.SimpleEntry(key, value); }