Skip to content

Commit 4618e89

Browse files
committed
Fix JNI memory leak, add test for default column name.
1 parent 4290005 commit 4618e89

2 files changed

Lines changed: 58 additions & 3 deletions

File tree

java/rocksjni/portal.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9276,12 +9276,14 @@ class WideColumnJni {
92769276
op,
92779277
JNIEnv* env, jbyteArray jkey, jint keyOffset, jint keyLen,
92789278
jobjectArray jnames, jobjectArray jvalues) {
9279-
jbyte* key = new jbyte[keyLen];
9280-
env->GetByteArrayRegion(jkey, keyOffset, keyLen, key);
9279+
auto key = std::make_unique<jbyte[]>(keyLen);
9280+
9281+
env->GetByteArrayRegion(jkey, keyOffset, keyLen, key.get());
92819282
if (env->ExceptionCheck()) {
92829283
return;
92839284
}
9284-
ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), keyLen);
9285+
ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key.get()),
9286+
keyLen);
92859287

92869288
const auto column_len = env->GetArrayLength(jnames);
92879289
rocksdb::WideColumns columns;

java/src/test/java/org/rocksdb/WideColumnTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,59 @@ public void simpleReadWrite() throws RocksDBException {
5454
}
5555
}
5656

57+
@Test
58+
public void readKVAsWideColumn() throws RocksDBException {
59+
try (final RocksDB db = RocksDB.open(dbFolder.getRoot().getAbsolutePath())) {
60+
db.put(
61+
"someKey".getBytes(StandardCharsets.UTF_8), "someValue".getBytes(StandardCharsets.UTF_8));
62+
63+
List<WideColumn<byte[]>> result = new ArrayList<>();
64+
65+
Status status = db.getEntity("someKey".getBytes(), result);
66+
67+
assertThat(status.getCode()).isEqualTo(Status.Code.Ok);
68+
69+
assertThat(result).isNotEmpty();
70+
71+
assertThat(result.get(0).getName()).isEqualTo(new byte[] {});
72+
73+
assertThat(result.get(0).getValue()).isEqualTo("someValue".getBytes(StandardCharsets.UTF_8));
74+
}
75+
}
76+
77+
@Test
78+
public void readWideColumnAsKV() throws RocksDBException {
79+
try (final RocksDB db = RocksDB.open(dbFolder.getRoot().getAbsolutePath())) {
80+
List<WideColumn<byte[]>> wideColumns = new ArrayList<>();
81+
82+
wideColumns.add(new WideColumn<>("columnName".getBytes(StandardCharsets.UTF_8),
83+
"columnValue".getBytes(StandardCharsets.UTF_8)));
84+
db.putEntity("someKey".getBytes(StandardCharsets.UTF_8), wideColumns);
85+
86+
byte[] status = db.get("someKey".getBytes());
87+
88+
assertThat(status).isNotNull();
89+
}
90+
}
91+
92+
@Test
93+
public void readWideDefaultColumnAsKV() throws RocksDBException {
94+
try (final RocksDB db = RocksDB.open(dbFolder.getRoot().getAbsolutePath())) {
95+
List<WideColumn<byte[]>> wideColumns = new ArrayList<>();
96+
97+
wideColumns.add(new WideColumn<>("columnName".getBytes(StandardCharsets.UTF_8),
98+
"columnValue".getBytes(StandardCharsets.UTF_8)));
99+
wideColumns.add(
100+
new WideColumn<>(new byte[] {}, "defaultColumnValue".getBytes(StandardCharsets.UTF_8)));
101+
102+
db.putEntity("someKey".getBytes(StandardCharsets.UTF_8), wideColumns);
103+
104+
byte[] status = db.get("someKey".getBytes());
105+
106+
assertThat(status).isNotNull();
107+
assertThat(status).isEqualTo("defaultColumnValue".getBytes(StandardCharsets.UTF_8));
108+
}
109+
}
57110
@Test
58111
public void readWriteWithKeyOffset() throws RocksDBException {
59112
try (final RocksDB db = RocksDB.open(dbFolder.getRoot().getAbsolutePath())) {

0 commit comments

Comments
 (0)