diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java index cb2e369ea0..d55c474c59 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java @@ -971,8 +971,8 @@ public synchronized void close() throws Exception { this.closeTx(); } finally { this.closed = true; - this.storeProvider.close(); LockUtil.destroy(this.name); + this.storeProvider.close(); } // Make sure that all transactions are closed in all threads if (!tx.closed()) { diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendSessionPool.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendSessionPool.java index 6af54ff46a..d7e681bb7c 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendSessionPool.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/store/BackendSessionPool.java @@ -141,7 +141,7 @@ public boolean close() { this.doClose(); } } - LOG.debug("Now(after close({})) session count is: {}, " + + LOG.error("Now(after close({})) session count is: {}, " + "current session reference is: {}", this, result.getLeft(), result.getRight()); return result.getLeft() == 0; diff --git a/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStdSessions.java b/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStdSessions.java index bcbe37b7c3..480609372c 100644 --- a/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStdSessions.java +++ b/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStdSessions.java @@ -216,6 +216,14 @@ public void reloadRocksDB() throws RocksDBException { this.walPath); } + public boolean forceCLose() { + if (!this.rocksdb.isOwningHandle()) { + return false; + } + this.rocksdb().close(); + return true; + } + @Override public void forceCloseRocksDB() { this.rocksdb().close(); @@ -343,6 +351,14 @@ protected synchronized void doClose() { this.rocksdb.close(); } + public synchronized void forceClose() { + if (!this.rocksdb.isOwningHandle()) { + return; + } + this.refCount.set(0); + this.rocksdb.close(); + } + private void checkValid() { E.checkState(this.rocksdb.isOwningHandle(), "It seems RocksDB has been closed"); diff --git a/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStore.java b/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStore.java index 283baa622a..eb89656168 100644 --- a/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStore.java +++ b/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStore.java @@ -423,6 +423,16 @@ public void close() { this.closeSessions(); } + public void forceClose() { + try { + this.checkOpened(); + this.closeSessions(); + } catch (Throwable ignore) { + return; + } + ((RocksDBStdSessions)this.sessions).forceCLose(); + } + @Override public boolean opened() { this.checkDbOpened(); diff --git a/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStoreProvider.java b/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStoreProvider.java index 2e5006a54c..44041125f1 100644 --- a/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStoreProvider.java +++ b/hugegraph-server/hugegraph-rocksdb/src/main/java/org/apache/hugegraph/backend/store/rocksdb/RocksDBStoreProvider.java @@ -19,13 +19,18 @@ import java.io.File; +import org.apache.hugegraph.backend.BackendException; import org.apache.hugegraph.backend.store.AbstractBackendStoreProvider; import org.apache.hugegraph.backend.store.BackendStore; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.util.ConfigUtil; +import org.apache.hugegraph.util.Log; +import org.slf4j.Logger; public class RocksDBStoreProvider extends AbstractBackendStoreProvider { + private static final Logger LOG = Log.logger(RocksDBStoreProvider.class); + protected String database() { return this.graph().toLowerCase(); } @@ -68,6 +73,29 @@ protected BackendStore newSystemStore(HugeConfig config, String store) { return new RocksDBStore.RocksDBSystemStore(this, this.database(), store); } + @Override + public void close() throws BackendException { + super.close(); + if (this.stores == null) { + return; + } + this.stores.values().forEach(store -> { + try { + if (!store.opened()) { + return; + } + } catch (Throwable ignore) { + return; + } + try { + ((RocksDBStore)store).forceClose(); + } catch (Exception e) { + LOG.error("Failed to close store '%s'", store.store(), e); + throw new BackendException("Failed to close store '%s'", store.store(), e); + } + }); + } + @Override public String type() { return "rocksdb";