Fix the problem that wrong Key may be passed when using CompactRange JAVA API (#12328)

Summary:
When using the Rocksdb Java API.

When we use Java code to call `db.compactRange (columnFamilyHandle, start, null)` which means we hope to perform range compaction on keys bigger than **start**.
we expected call to the corresponding C++ code : `db->compactRange (columnFamilyHandle, &start, nullptr)`
But in reality, what is being called is
`db ->compactRange (columnFamilyHandle,start,"")`

The problem here is the `null` in Java are not converted to `nullptr`, but rather to `""`, which may result in some unexpected results

Pull Request resolved: https://github.com/facebook/rocksdb/pull/12328

Reviewed By: jowlyzhang

Differential Revision: D53432749

Pulled By: cbi42

fbshipit-source-id: eeadd19d05667230568668946d2ef1d5b2568268
This commit is contained in:
马越
2024-02-05 11:05:57 -08:00
committed by Facebook GitHub Bot
parent 6e88126dd3
commit 3a287796e3
+10 -7
View File
@@ -3056,17 +3056,20 @@ void Java_org_rocksdb_RocksDB_compactRange(JNIEnv* env, jclass,
}
ROCKSDB_NAMESPACE::Status s;
if (jbegin_len > 0 || jend_len > 0) {
const ROCKSDB_NAMESPACE::Slice begin(str_begin);
const ROCKSDB_NAMESPACE::Slice end(str_end);
s = db->CompactRange(*compact_range_opts, cf_handle, &begin, &end);
} else {
s = db->CompactRange(*compact_range_opts, cf_handle, nullptr, nullptr);
}
std::unique_ptr<ROCKSDB_NAMESPACE::Slice> begin;
std::unique_ptr<ROCKSDB_NAMESPACE::Slice> end;
if (jbegin_len > 0) {
begin.reset(new ROCKSDB_NAMESPACE::Slice(str_begin));
}
if (jend_len > 0) {
end.reset(new ROCKSDB_NAMESPACE::Slice(str_end));
}
s = db->CompactRange(*compact_range_opts, cf_handle, begin.get(), end.get());
if (jcompact_range_opts_handle == 0) {
delete compact_range_opts;
}
ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
}