diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedGraphTransaction.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedGraphTransaction.java index 83ab7f51ad..29f6cc3f36 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedGraphTransaction.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedGraphTransaction.java @@ -133,7 +133,7 @@ private void listenChanges() { } return false; }; - this.store().provider().listen(this.storeEventListener); + this.store().provider().listenDataCacheClear(this.storeEventListener); // Listen cache event: "cache"(invalid cache item) this.cacheEventListener = event -> { diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedSchemaTransactionV2.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedSchemaTransactionV2.java index e6a5e78533..f5a23ffb35 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedSchemaTransactionV2.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/CachedSchemaTransactionV2.java @@ -105,7 +105,8 @@ private void listenChanges() { } return false; }; - this.graphParams().loadGraphStore().provider().listen(this.storeEventListener); + this.graphParams().loadGraphStore().provider() + .listenSchemaCacheClear(this.storeEventListener); // Listen cache event: "cache"(invalid cache item) this.cacheEventListener = event -> { diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/AbstractBackendStoreProvider.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/AbstractBackendStoreProvider.java index 906d795149..8938775fe3 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/AbstractBackendStoreProvider.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/AbstractBackendStoreProvider.java @@ -44,6 +44,8 @@ public abstract class AbstractBackendStoreProvider private final EventHub storeEventHub = new EventHub("store"); protected Map stores = null; + private static volatile boolean schemaCacheClearListened = false; + private static volatile boolean vertexEdgeCacheClearListened = false; protected final void notifyAndWaitEvent(String event) { Future future = this.storeEventHub.notify(event, this); @@ -70,6 +72,30 @@ public void listen(EventListener listener) { this.storeEventHub.listen(EventHub.ANY_EVENT, listener); } + @Override + public void listenSchemaCacheClear(EventListener listener) { + if (!schemaCacheClearListened) { + synchronized (AbstractBackendStoreProvider.class) { + if (!schemaCacheClearListened) { + listen(listener); + schemaCacheClearListened = true; + } + } + } + } + + @Override + public void listenDataCacheClear(EventListener listener) { + if (!vertexEdgeCacheClearListened) { + synchronized (AbstractBackendStoreProvider.class) { + if (!vertexEdgeCacheClearListened) { + listen(listener); + vertexEdgeCacheClearListened = true; + } + } + } + } + @Override public void unlisten(EventListener listener) { this.storeEventHub.unlisten(EventHub.ANY_EVENT, listener); diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendStoreProvider.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendStoreProvider.java index 44e58c2289..8302679ec0 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendStoreProvider.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendStoreProvider.java @@ -67,6 +67,12 @@ public interface BackendStoreProvider { void listen(EventListener listener); + default void listenSchemaCacheClear(EventListener listener) { + } + + default void listenDataCacheClear(EventListener listener) { + } + void unlisten(EventListener listener); EventHub storeEventHub();