Skip to content

Commit 3e4e540

Browse files
rhubnerrkhachatryan
authored andcommitted
Fix exception on RocksDB.getColumnFamilyMetaData() (#12474)
Summary: facebook/rocksdb#12466 reported a bug when `RocksDB.getColumnFamilyMetaData()` is called on an existing database(With files stored on disk). As neilramaswamy mentioned, this was caused by facebook/rocksdb#11770 where the signature of `SstFileMetaData` constructor was changed, but JNI code wasn't updated. This PR fix JNI code, and also properly populate `fileChecksum` on `SstFileMetaData`. Pull Request resolved: facebook/rocksdb#12474 Reviewed By: jowlyzhang Differential Revision: D55811808 Pulled By: ajkr fbshipit-source-id: 2ab156f41eaf4a4f30c49e6df421b61e8451230e (cherry picked from commit a8035ebc0b22f079a447bdc6b0aeeb2f1cf09d47)
1 parent 703d00a commit 3e4e540

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

java/rocksjni/portal.h

+16-2
Original file line numberDiff line numberDiff line change
@@ -7569,7 +7569,8 @@ class SstFileMetaDataJni : public JavaClass {
75697569
}
75707570

75717571
jmethodID mid = env->GetMethodID(
7572-
jclazz, "<init>", "(Ljava/lang/String;Ljava/lang/String;JJJ[B[BJZJJ)V");
7572+
jclazz, "<init>",
7573+
"(Ljava/lang/String;Ljava/lang/String;JJJ[B[BJZJJ[B)V");
75737574
if (mid == nullptr) {
75747575
// exception thrown: NoSuchMethodException or OutOfMemoryError
75757576
return nullptr;
@@ -7609,6 +7610,17 @@ class SstFileMetaDataJni : public JavaClass {
76097610
return nullptr;
76107611
}
76117612

7613+
jbyteArray jfile_checksum = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
7614+
env, sst_file_meta_data->file_checksum);
7615+
if (env->ExceptionCheck()) {
7616+
// exception occurred creating java string
7617+
env->DeleteLocalRef(jfile_name);
7618+
env->DeleteLocalRef(jpath);
7619+
env->DeleteLocalRef(jsmallest_key);
7620+
env->DeleteLocalRef(jlargest_key);
7621+
return nullptr;
7622+
}
7623+
76127624
jobject jsst_file_meta_data = env->NewObject(
76137625
jclazz, mid, jfile_name, jpath,
76147626
static_cast<jlong>(sst_file_meta_data->size),
@@ -7617,13 +7629,14 @@ class SstFileMetaDataJni : public JavaClass {
76177629
jlargest_key, static_cast<jlong>(sst_file_meta_data->num_reads_sampled),
76187630
static_cast<jboolean>(sst_file_meta_data->being_compacted),
76197631
static_cast<jlong>(sst_file_meta_data->num_entries),
7620-
static_cast<jlong>(sst_file_meta_data->num_deletions));
7632+
static_cast<jlong>(sst_file_meta_data->num_deletions), jfile_checksum);
76217633

76227634
if (env->ExceptionCheck()) {
76237635
env->DeleteLocalRef(jfile_name);
76247636
env->DeleteLocalRef(jpath);
76257637
env->DeleteLocalRef(jsmallest_key);
76267638
env->DeleteLocalRef(jlargest_key);
7639+
env->DeleteLocalRef(jfile_checksum);
76277640
return nullptr;
76287641
}
76297642

@@ -7632,6 +7645,7 @@ class SstFileMetaDataJni : public JavaClass {
76327645
env->DeleteLocalRef(jpath);
76337646
env->DeleteLocalRef(jsmallest_key);
76347647
env->DeleteLocalRef(jlargest_key);
7648+
env->DeleteLocalRef(jfile_checksum);
76357649

76367650
return jsst_file_meta_data;
76377651
}

java/src/test/java/org/rocksdb/RocksDBTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -1409,6 +1409,33 @@ public void getLiveFilesMetadataWithChecksum() throws RocksDBException {
14091409
}
14101410
}
14111411

1412+
@Test
1413+
public void getColumnFamilyMetadataWithChecksum() throws RocksDBException {
1414+
final Properties props = new Properties();
1415+
props.put("file_checksum_gen_factory", "FileChecksumGenCrc32cFactory");
1416+
final String dbPath = dbFolder.getRoot().getAbsolutePath();
1417+
1418+
try (final DBOptions dbOptions = DBOptions.getDBOptionsFromProps(props);
1419+
final ColumnFamilyOptions cfOptions = new ColumnFamilyOptions();
1420+
final Options options = new Options(dbOptions, cfOptions).setCreateIfMissing(true)) {
1421+
try (final RocksDB db = RocksDB.open(options, dbPath);
1422+
final WriteOptions writeOptions = new WriteOptions().setDisableWAL(true)) {
1423+
db.put("key".getBytes(UTF_8), "value".getBytes(UTF_8));
1424+
}
1425+
1426+
try (final RocksDB db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath())) {
1427+
ColumnFamilyMetaData metadata = db.getColumnFamilyMetaData(); // Exception here
1428+
List<LevelMetaData> levels = metadata.levels();
1429+
assertThat(levels).isNotEmpty();
1430+
List<SstFileMetaData> filesMetadata = levels.get(0).files();
1431+
assertThat(filesMetadata).isNotEmpty();
1432+
assertThat(filesMetadata.get(0).fileChecksum()).isNotNull();
1433+
assertThat(filesMetadata.get(0).fileChecksum()).hasSize(4);
1434+
assertThat(filesMetadata.get(0).fileChecksum()).isNotEqualTo(new byte[] {0, 0, 0, 0});
1435+
}
1436+
}
1437+
}
1438+
14121439
@Ignore("TODO(AR) re-enable when ready!")
14131440
@Test
14141441
public void compactFiles() throws RocksDBException {

0 commit comments

Comments
 (0)