diff --git a/java/org/rocksdb/BackupableDB.java b/java/org/rocksdb/BackupableDB.java index 91607d4df..b85f792fc 100644 --- a/java/org/rocksdb/BackupableDB.java +++ b/java/org/rocksdb/BackupableDB.java @@ -31,6 +31,10 @@ public class BackupableDB extends RocksDB { BackupableDB bdb = new BackupableDB(RocksDB.open(opt, db_path)); bdb.open(bdb.db_.nativeHandle_, bopt.nativeHandle_); + // Prevent the RocksDB object from attempting to delete + // the underly C++ DB object. + bdb.db_.disOwnNativeObject(); + return bdb; } diff --git a/java/org/rocksdb/RocksDB.java b/java/org/rocksdb/RocksDB.java index 23dad1dc4..bc0390d9f 100644 --- a/java/org/rocksdb/RocksDB.java +++ b/java/org/rocksdb/RocksDB.java @@ -337,6 +337,18 @@ public class RocksDB extends RocksObject { opt.filter_ = null; } + /** + * Revoke ownership of the native object. + * + * This will prevent the object from attempting to delete the underlying + * native object in its finalizer. This must be used when another object + * (e.g. BackupableDB) takes over ownership of the native object or both + * will attempt to delete the underlying object when garbage collected. + */ + protected void disOwnNativeObject() { + nativeHandle_ = 0; + } + // native methods protected native void open( long optionsHandle, long cacheSize, String path) throws RocksDBException;