This is an automated email from the ASF dual-hosted git repository. lhotari pushed a commit to branch branch-4.0 in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit 6d812924514bee525557aa4d2ce955c04cbdaf5d Author: Yunze Xu <[email protected]> AuthorDate: Mon Feb 16 18:03:41 2026 +0800 [fix][meta] Metadata cache refresh might not take effect (#25246) (cherry picked from commit 24eba102031e3696e87ca6f5b14d96cd84f1b96a) --- .../pulsar/metadata/cache/impl/MetadataCacheImpl.java | 7 ------- .../org/apache/pulsar/metadata/MetadataCacheTest.java | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/cache/impl/MetadataCacheImpl.java b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/cache/impl/MetadataCacheImpl.java index ca165f0464e..b1f6f0a4f50 100644 --- a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/cache/impl/MetadataCacheImpl.java +++ b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/cache/impl/MetadataCacheImpl.java @@ -153,13 +153,6 @@ public class MetadataCacheImpl<T> implements MetadataCache<T>, Consumer<Notifica return FutureUtils.value(Optional.<CacheGetResult<T>>empty()); } final var res = optRes.get(); - final var cachedFuture = objCache.getIfPresent(path); - if (cachedFuture != null && cachedFuture != future) { - if (log.isDebugEnabled()) { - log.debug("A new read on key {} is in progress or completed, ignore this one", path); - } - return cachedFuture; - } try { T obj = serde.deserialize(path, res.getValue(), res.getStat()); if (log.isDebugEnabled()) { diff --git a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataCacheTest.java b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataCacheTest.java index fade12e07ca..c3ae22aeb54 100644 --- a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataCacheTest.java +++ b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataCacheTest.java @@ -33,6 +33,7 @@ import com.github.benmanes.caffeine.cache.AsyncLoadingCache; import java.io.IOException; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -69,6 +70,7 @@ import org.apache.pulsar.metadata.api.NotificationType; import org.apache.pulsar.metadata.api.Stat; import org.apache.pulsar.metadata.api.extended.CreateOption; import org.apache.pulsar.metadata.cache.impl.MetadataCacheImpl; +import org.apache.pulsar.metadata.impl.LocalMemoryMetadataStore; import org.awaitility.Awaitility; import org.mockito.stubbing.Answer; import org.testng.annotations.Test; @@ -739,4 +741,18 @@ public class MetadataCacheTest extends BaseMetadataStoreTest { assertTrue(backoff.isMandatoryStopMade()); assertEquals(backoff.getFirstBackoffTimeInMillis(), 0); } + + @Test + public void testRefreshRace() throws Exception { + @Cleanup final var store = new LocalMemoryMetadataStore("memory:local", MetadataStoreConfig.builder().build()); + final var cache = store.getMetadataCache(String.class); + for (int i = 0; i < 500; i++) { + final var key = "/key" + i; + assertTrue(cache.get(key).get().isEmpty()); + + store.put(key, "\"value\"".getBytes(StandardCharsets.UTF_8), Optional.empty()).get(); + Awaitility.await().pollInterval(Duration.ofMillis(1)).atMost(Duration.ofSeconds(3)).untilAsserted(() -> + assertTrue(cache.get(key).get().isPresent(), "Failed at key " + key)); + } + } }
