From e86965efa7e737a54efeca8c65827e6c579d0c92 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sat, 9 Apr 2022 16:31:32 +0200 Subject: [PATCH] Avoid closing things that have already been closed --- .../disk/LLLocalKeyValueDatabase.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java b/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java index 694b55c..b7429ae 100644 --- a/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java +++ b/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java @@ -471,27 +471,47 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { private void flushAndCloseDb(RocksDB db, List handles) throws RocksDBException { + if (!db.isOwningHandle()) { + return; + } flushDb(db, handles); + if (!db.isOwningHandle()) { + return; + } for (ColumnFamilyHandle handle : handles) { try { - handle.close(); + if (handle.isOwningHandle()) { + handle.close(); + } } catch (Exception ex) { logger.error("Can't close column family", ex); } } + if (!db.isOwningHandle()) { + return; + } try { db.closeE(); } catch (RocksDBException ex) { if ("Cannot close DB with unreleased snapshot.".equals(ex.getMessage())) { snapshotsHandles.forEach((id, snapshot) -> { try { + if (!db.isOwningHandle()) { + return; + } + if (!snapshot.isOwningHandle()) { + return; + } db.releaseSnapshot(snapshot); } catch (Exception ex2) { // ignore exception logger.debug("Failed to release snapshot " + id, ex2); } }); + if (!db.isOwningHandle()) { + return; + } db.closeE(); } throw ex; @@ -897,6 +917,12 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { if (dbSnapshot == null) { throw new IOException("Snapshot " + snapshot.getSequenceNumber() + " not found!"); } + if (!db.isOwningHandle()) { + return null; + } + if (!dbSnapshot.isOwningHandle()) { + return null; + } db.releaseSnapshot(dbSnapshot); return null; })