Skip to content

Commit

Permalink
feat(java): enable Java API to read file checksum
Browse files Browse the repository at this point in the history
Updates the `SstFileMetaData` class and its native transform method to
pass in the full file checksum if present. If absent, a null byte array
is passed.

This gives minimum support to the Full File Checksum feature for the
Java API; users can enable the feature via
`DBOptions#getOptionsFromProps`, and read the checksums via
`RocksDB#getLiveFilesMetadata`.
  • Loading branch information
npepinpe committed Aug 28, 2023
1 parent d342046 commit 53e5037
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 30 deletions.
18 changes: 16 additions & 2 deletions java/rocksjni/portal.h
Original file line number Diff line number Diff line change
Expand Up @@ -7327,7 +7327,7 @@ class LiveFileMetaDataJni : public JavaClass {

jmethodID mid = env->GetMethodID(
jclazz, "<init>",
"([BILjava/lang/String;Ljava/lang/String;JJJ[B[BJZJJ)V");
"([BILjava/lang/String;Ljava/lang/String;JJJ[B[BJZJJ[B)V");
if (mid == nullptr) {
// exception thrown: NoSuchMethodException or OutOfMemoryError
return nullptr;
Expand Down Expand Up @@ -7378,6 +7378,18 @@ class LiveFileMetaDataJni : public JavaClass {
return nullptr;
}

jbyteArray jfile_checksum = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
env, live_file_meta_data->file_checksum);
if (env->ExceptionCheck()) {
// exception occurred creating java string
env->DeleteLocalRef(jcolumn_family_name);
env->DeleteLocalRef(jfile_name);
env->DeleteLocalRef(jpath);
env->DeleteLocalRef(jsmallest_key);
env->DeleteLocalRef(jlargest_key);
return nullptr;
}

jobject jlive_file_meta_data = env->NewObject(
jclazz, mid, jcolumn_family_name,
static_cast<jint>(live_file_meta_data->level), jfile_name, jpath,
Expand All @@ -7388,14 +7400,15 @@ class LiveFileMetaDataJni : public JavaClass {
static_cast<jlong>(live_file_meta_data->num_reads_sampled),
static_cast<jboolean>(live_file_meta_data->being_compacted),
static_cast<jlong>(live_file_meta_data->num_entries),
static_cast<jlong>(live_file_meta_data->num_deletions));
static_cast<jlong>(live_file_meta_data->num_deletions), jfile_checksum);

if (env->ExceptionCheck()) {
env->DeleteLocalRef(jcolumn_family_name);
env->DeleteLocalRef(jfile_name);
env->DeleteLocalRef(jpath);
env->DeleteLocalRef(jsmallest_key);
env->DeleteLocalRef(jlargest_key);
env->DeleteLocalRef(jfile_checksum);
return nullptr;
}

Expand All @@ -7405,6 +7418,7 @@ class LiveFileMetaDataJni : public JavaClass {
env->DeleteLocalRef(jpath);
env->DeleteLocalRef(jsmallest_key);
env->DeleteLocalRef(jlargest_key);
env->DeleteLocalRef(jfile_checksum);

return jlive_file_meta_data;
}
Expand Down
23 changes: 7 additions & 16 deletions java/src/main/java/org/rocksdb/LiveFileMetaData.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,13 @@ public class LiveFileMetaData extends SstFileMetaData {
/**
* Called from JNI C++
*/
private LiveFileMetaData(
final byte[] columnFamilyName,
final int level,
final String fileName,
final String path,
final long size,
final long smallestSeqno,
final long largestSeqno,
final byte[] smallestKey,
final byte[] largestKey,
final long numReadsSampled,
final boolean beingCompacted,
final long numEntries,
final long numDeletions) {
super(fileName, path, size, smallestSeqno, largestSeqno, smallestKey,
largestKey, numReadsSampled, beingCompacted, numEntries, numDeletions);
private LiveFileMetaData(final byte[] columnFamilyName, final int level, final String fileName,
final String path, final long size, final long smallestSeqno, final long largestSeqno,
final byte[] smallestKey, final byte[] largestKey, final long numReadsSampled,
final boolean beingCompacted, final long numEntries, final long numDeletions,
final byte[] fileChecksum) {
super(fileName, path, size, smallestSeqno, largestSeqno, smallestKey, largestKey,
numReadsSampled, beingCompacted, numEntries, numDeletions, fileChecksum);
this.columnFamilyName = columnFamilyName;
this.level = level;
}
Expand Down
28 changes: 16 additions & 12 deletions java/src/main/java/org/rocksdb/SstFileMetaData.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class SstFileMetaData {
private final boolean beingCompacted;
private final long numEntries;
private final long numDeletions;
private final byte[] fileChecksum;

/**
* Called from JNI C++
Expand All @@ -35,19 +36,12 @@ public class SstFileMetaData {
* @param beingCompacted true if the file is being compacted, false otherwise
* @param numEntries the number of entries
* @param numDeletions the number of deletions
* @param fileChecksum the full file checksum (if enabled)
*/
protected SstFileMetaData(
final String fileName,
final String path,
final long size,
final long smallestSeqno,
final long largestSeqno,
final byte[] smallestKey,
final byte[] largestKey,
final long numReadsSampled,
final boolean beingCompacted,
final long numEntries,
final long numDeletions) {
protected SstFileMetaData(final String fileName, final String path, final long size,
final long smallestSeqno, final long largestSeqno, final byte[] smallestKey,
final byte[] largestKey, final long numReadsSampled, final boolean beingCompacted,
final long numEntries, final long numDeletions, final byte[] fileChecksum) {
this.fileName = fileName;
this.path = path;
this.size = size;
Expand All @@ -59,6 +53,7 @@ protected SstFileMetaData(
this.beingCompacted = beingCompacted;
this.numEntries = numEntries;
this.numDeletions = numDeletions;
this.fileChecksum = fileChecksum;
}

/**
Expand Down Expand Up @@ -159,4 +154,13 @@ public long numEntries() {
public long numDeletions() {
return numDeletions;
}

/**
* Get the full file checksum iff full file checksum is enabled.
*
* @return the file's checksum
*/
public byte[] fileChecksum() {
return fileChecksum;
}
}

0 comments on commit 53e5037

Please sign in to comment.