Skip to content

JNI Java_org_rocksdb_RocksDB_getPropertiesOfTablesInRange should return jhash_map instead jrange_slice_handles #13643

Open
@peterxcli

Description

@peterxcli

Java_org_rocksdb_RocksDB_getPropertiesOfAllTables(JNIEnv* env, jclass, jlong jdb_handle, jlong jcf_handle) does convert table_properties_collection to HashMapJni type and return.

// convert to Java type
jobject jhash_map = ROCKSDB_NAMESPACE::HashMapJni::construct(
env, static_cast<uint32_t>(table_properties_collection.size()));
if (jhash_map == nullptr) {
// exception occurred
return nullptr;
}
const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<
const std::string,
const std::shared_ptr<const ROCKSDB_NAMESPACE::TableProperties>, jobject,
jobject>
fn_map_kv =
[env](const std::pair<const std::string,
const std::shared_ptr<
const ROCKSDB_NAMESPACE::TableProperties>>&
kv) {
jstring jkey = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
env, &(kv.first), false);
if (env->ExceptionCheck()) {
// an error occurred
return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
}
jobject jtable_properties =
ROCKSDB_NAMESPACE::TablePropertiesJni::fromCppTableProperties(
env, *(kv.second.get()));
if (jtable_properties == nullptr) {
// an error occurred
env->DeleteLocalRef(jkey);
return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
}
return std::unique_ptr<std::pair<jobject, jobject>>(
new std::pair<jobject, jobject>(
static_cast<jobject>(jkey),
static_cast<jobject>(jtable_properties)));
};
if (!ROCKSDB_NAMESPACE::HashMapJni::putAll(
env, jhash_map, table_properties_collection.begin(),
table_properties_collection.end(), fn_map_kv)) {
// exception occurred
return nullptr;
}
return jhash_map;


But jobject Java_org_rocksdb_RocksDB_getPropertiesOfTablesInRange(JNIEnv* env, jclass, jlong jdb_handle, jlong jcf_handle, jlongArray jrange_slice_handles) return its input paramater jrange_slice_handles as output? Which leads IncompatibleClassChange Class [J does not implement the requested interface java.util.Map error in java

/*
* Class: org_rocksdb_RocksDB
* Method: getPropertiesOfTablesInRange
* Signature: (JJ[J)Ljava/util/Map;
*/
jobject Java_org_rocksdb_RocksDB_getPropertiesOfTablesInRange(
JNIEnv* env, jclass, jlong jdb_handle, jlong jcf_handle,
jlongArray jrange_slice_handles) {
auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
if (jcf_handle == 0) {
cf_handle = db->DefaultColumnFamily();
} else {
cf_handle =
reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
}
const jsize jlen = env->GetArrayLength(jrange_slice_handles);
jlong* jrange_slice_handle =
env->GetLongArrayElements(jrange_slice_handles, nullptr);
if (jrange_slice_handle == nullptr) {
// exception occurred
return nullptr;
}
const size_t ranges_len = static_cast<size_t>(jlen / 2);
auto ranges = std::unique_ptr<ROCKSDB_NAMESPACE::Range[]>(
new ROCKSDB_NAMESPACE::Range[ranges_len]);
for (jsize i = 0, j = 0; i < jlen; ++i) {
auto* start =
reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jrange_slice_handle[i]);
auto* limit =
reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jrange_slice_handle[++i]);
ranges[j++] = ROCKSDB_NAMESPACE::Range(*start, *limit);
}
ROCKSDB_NAMESPACE::TablePropertiesCollection table_properties_collection;
auto s = db->GetPropertiesOfTablesInRange(cf_handle, ranges.get(), ranges_len,
&table_properties_collection);
if (!s.ok()) {
// error occurred
env->ReleaseLongArrayElements(jrange_slice_handles, jrange_slice_handle,
JNI_ABORT);
ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
return nullptr;
}
// cleanup
env->ReleaseLongArrayElements(jrange_slice_handles, jrange_slice_handle,
JNI_ABORT);
return jrange_slice_handles;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions