From 96264784d94e7d5a2f46256656ae2a40e55b776d Mon Sep 17 00:00:00 2001 From: fyrz Date: Thu, 15 Jan 2015 00:26:32 +0100 Subject: [PATCH 1/3] [RocksJava] ColumnFamily name JNI correction Previous to this commit there was a problem with unterminated String usage as jByteArrays are not zero terminated. --- java/rocksjni/rocksjni.cc | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 54eef7f53..3d44b8e9c 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -75,6 +75,7 @@ jobject const char* db_path = env->GetStringUTFChars(jdb_path, 0); std::vector cfnames_to_free; + std::vector c_cfnames_to_free; std::vector jcfnames_for_free; std::vector column_families; @@ -102,13 +103,17 @@ jobject rocksdb::ColumnFamilyOptionsJni::getHandle(env, jcf_opt_obj); jbyte* cfname = env->GetByteArrayElements(byteArray, 0); + const int len = env->GetArrayLength(byteArray) + 1; + char* c_cfname = new char[len]; + memcpy(c_cfname, cfname, len - 1); + c_cfname[len-1]='\0'; // free allocated cfnames after call to open cfnames_to_free.push_back(cfname); + c_cfnames_to_free.push_back(c_cfname); jcfnames_for_free.push_back(byteArray); column_families.push_back(rocksdb::ColumnFamilyDescriptor( - reinterpret_cast(cfname), - *cfOptions)); + c_cfname, *cfOptions)); } rocksdb::Status s = rocksdb::DB::OpenForReadOnly(*opt, @@ -119,6 +124,8 @@ jobject i != cfnames_to_free.size(); i++) { // free cfnames env->ReleaseByteArrayElements(jcfnames_for_free[i], cfnames_to_free[i], 0); + // free c_cfnames + delete c_cfnames_to_free[i]; } // check if open operation was successful @@ -160,6 +167,7 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I( const char* db_path = env->GetStringUTFChars(jdb_path, 0); std::vector cfnames_to_free; + std::vector c_cfnames_to_free; std::vector jcfnames_for_free; std::vector column_families; @@ -187,13 +195,17 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I( rocksdb::ColumnFamilyOptionsJni::getHandle(env, jcf_opt_obj); jbyte* cfname = env->GetByteArrayElements(byteArray, 0); + const int len = env->GetArrayLength(byteArray) + 1; + char* c_cfname = new char[len]; + memcpy(c_cfname, cfname, len - 1); + c_cfname[len-1]='\0'; // free allocated cfnames after call to open cfnames_to_free.push_back(cfname); + c_cfnames_to_free.push_back(c_cfname); jcfnames_for_free.push_back(byteArray); column_families.push_back(rocksdb::ColumnFamilyDescriptor( - reinterpret_cast(cfname), - *cfOptions)); + c_cfname, *cfOptions)); } rocksdb::Status s = rocksdb::DB::Open(*opt, db_path, column_families, @@ -204,6 +216,8 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I( i != cfnames_to_free.size(); i++) { // free cfnames env->ReleaseByteArrayElements(jcfnames_for_free[i], cfnames_to_free[i], 0); + // free c_cfnames + delete c_cfnames_to_free[i]; } // check if open operation was successful @@ -1231,9 +1245,15 @@ jlong Java_org_rocksdb_RocksDB_createColumnFamily( rocksdb::ColumnFamilyOptionsJni::getHandle(env, jcf_opt_obj); jbyte* cfname = env->GetByteArrayElements(byteArray, 0); + const int len = env->GetArrayLength(byteArray) + 1; + char* c_cfname = new char[len]; + memcpy(c_cfname, cfname, len - 1); + c_cfname[len-1]='\0'; + rocksdb::Status s = db_handle->CreateColumnFamily( - *cfOptions, reinterpret_cast(cfname), &handle); + *cfOptions, c_cfname, &handle); env->ReleaseByteArrayElements(byteArray, cfname, 0); + delete c_cfname; if (s.ok()) { return reinterpret_cast(handle); From e204a5a16c9fec2cc8704be67d81ae219cf958f2 Mon Sep 17 00:00:00 2001 From: fyrz Date: Sat, 17 Jan 2015 23:19:27 +0100 Subject: [PATCH 2/3] [RocksJava] ColumnFamily name JNI correction Summary: Previous to this commit there was a problem with unterminated String usage as jByteArrays are not zero terminated. Test Plan: make rocksdbjava make jtest mvn -f rocksjni.pom package Reviewers: yhchiang, adamretter, ankgup87 Subscribers: dhruba Differential Revision: https://reviews.facebook.net/D31809 --- java/rocksjni/rocksjni.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 3d44b8e9c..522e22e58 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -75,6 +75,7 @@ jobject const char* db_path = env->GetStringUTFChars(jdb_path, 0); std::vector cfnames_to_free; + // the zero-terminated version of cfnames_to_free. std::vector c_cfnames_to_free; std::vector jcfnames_for_free; @@ -106,7 +107,7 @@ jobject const int len = env->GetArrayLength(byteArray) + 1; char* c_cfname = new char[len]; memcpy(c_cfname, cfname, len - 1); - c_cfname[len-1]='\0'; + c_cfname[len - 1] = 0; // free allocated cfnames after call to open cfnames_to_free.push_back(cfname); @@ -167,6 +168,7 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I( const char* db_path = env->GetStringUTFChars(jdb_path, 0); std::vector cfnames_to_free; + // the zero-terminated version of cfnames_to_free. std::vector c_cfnames_to_free; std::vector jcfnames_for_free; @@ -198,7 +200,7 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I( const int len = env->GetArrayLength(byteArray) + 1; char* c_cfname = new char[len]; memcpy(c_cfname, cfname, len - 1); - c_cfname[len-1]='\0'; + c_cfname[len - 1] = 0; // free allocated cfnames after call to open cfnames_to_free.push_back(cfname); @@ -1248,7 +1250,7 @@ jlong Java_org_rocksdb_RocksDB_createColumnFamily( const int len = env->GetArrayLength(byteArray) + 1; char* c_cfname = new char[len]; memcpy(c_cfname, cfname, len - 1); - c_cfname[len-1]='\0'; + c_cfname[len - 1] = 0; rocksdb::Status s = db_handle->CreateColumnFamily( *cfOptions, c_cfname, &handle); From 2efe22849999728d4118c28451931b76a8091d3d Mon Sep 17 00:00:00 2001 From: fyrz Date: Thu, 22 Jan 2015 23:37:45 +0100 Subject: [PATCH 3/3] [RocksJava] Incorporated changes for D31809 --- java/rocksjni/rocksjni.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 522e22e58..dee6aaa14 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -126,7 +126,7 @@ jobject // free cfnames env->ReleaseByteArrayElements(jcfnames_for_free[i], cfnames_to_free[i], 0); // free c_cfnames - delete c_cfnames_to_free[i]; + delete[] c_cfnames_to_free[i]; } // check if open operation was successful @@ -219,7 +219,7 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I( // free cfnames env->ReleaseByteArrayElements(jcfnames_for_free[i], cfnames_to_free[i], 0); // free c_cfnames - delete c_cfnames_to_free[i]; + delete[] c_cfnames_to_free[i]; } // check if open operation was successful @@ -1255,7 +1255,7 @@ jlong Java_org_rocksdb_RocksDB_createColumnFamily( rocksdb::Status s = db_handle->CreateColumnFamily( *cfOptions, c_cfname, &handle); env->ReleaseByteArrayElements(byteArray, cfname, 0); - delete c_cfname; + delete[] c_cfname; if (s.ok()) { return reinterpret_cast(handle);