sst_file_manager.cc 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. //
  6. // This file implements the "bridge" between Java and C++ and enables
  7. // calling C++ ROCKSDB_NAMESPACE::SstFileManager methods
  8. // from Java side.
  9. #include <jni.h>
  10. #include <memory>
  11. #include "include/org_rocksdb_SstFileManager.h"
  12. #include "rocksdb/sst_file_manager.h"
  13. #include "rocksjni/portal.h"
  14. /*
  15. * Class: org_rocksdb_SstFileManager
  16. * Method: newSstFileManager
  17. * Signature: (JJJDJ)J
  18. */
  19. jlong Java_org_rocksdb_SstFileManager_newSstFileManager(
  20. JNIEnv* jnienv, jclass /*jcls*/, jlong jenv_handle, jlong jlogger_handle,
  21. jlong jrate_bytes, jdouble jmax_trash_db_ratio,
  22. jlong jmax_delete_chunk_bytes) {
  23. auto* env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jenv_handle);
  24. ROCKSDB_NAMESPACE::Status s;
  25. ROCKSDB_NAMESPACE::SstFileManager* sst_file_manager = nullptr;
  26. if (jlogger_handle != 0) {
  27. auto* sptr_logger =
  28. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::Logger>*>(
  29. jlogger_handle);
  30. sst_file_manager = ROCKSDB_NAMESPACE::NewSstFileManager(
  31. env, *sptr_logger, "", jrate_bytes, true, &s, jmax_trash_db_ratio,
  32. jmax_delete_chunk_bytes);
  33. } else {
  34. sst_file_manager = ROCKSDB_NAMESPACE::NewSstFileManager(
  35. env, nullptr, "", jrate_bytes, true, &s, jmax_trash_db_ratio,
  36. jmax_delete_chunk_bytes);
  37. }
  38. if (!s.ok()) {
  39. if (sst_file_manager != nullptr) {
  40. delete sst_file_manager;
  41. }
  42. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(jnienv, s);
  43. }
  44. auto* sptr_sst_file_manager =
  45. new std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>(sst_file_manager);
  46. return reinterpret_cast<jlong>(sptr_sst_file_manager);
  47. }
  48. /*
  49. * Class: org_rocksdb_SstFileManager
  50. * Method: setMaxAllowedSpaceUsage
  51. * Signature: (JJ)V
  52. */
  53. void Java_org_rocksdb_SstFileManager_setMaxAllowedSpaceUsage(
  54. JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle,
  55. jlong jmax_allowed_space) {
  56. auto* sptr_sst_file_manager =
  57. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  58. jhandle);
  59. sptr_sst_file_manager->get()->SetMaxAllowedSpaceUsage(jmax_allowed_space);
  60. }
  61. /*
  62. * Class: org_rocksdb_SstFileManager
  63. * Method: setCompactionBufferSize
  64. * Signature: (JJ)V
  65. */
  66. void Java_org_rocksdb_SstFileManager_setCompactionBufferSize(
  67. JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle,
  68. jlong jcompaction_buffer_size) {
  69. auto* sptr_sst_file_manager =
  70. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  71. jhandle);
  72. sptr_sst_file_manager->get()->SetCompactionBufferSize(
  73. jcompaction_buffer_size);
  74. }
  75. /*
  76. * Class: org_rocksdb_SstFileManager
  77. * Method: isMaxAllowedSpaceReached
  78. * Signature: (J)Z
  79. */
  80. jboolean Java_org_rocksdb_SstFileManager_isMaxAllowedSpaceReached(
  81. JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle) {
  82. auto* sptr_sst_file_manager =
  83. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  84. jhandle);
  85. return sptr_sst_file_manager->get()->IsMaxAllowedSpaceReached();
  86. }
  87. /*
  88. * Class: org_rocksdb_SstFileManager
  89. * Method: isMaxAllowedSpaceReachedIncludingCompactions
  90. * Signature: (J)Z
  91. */
  92. jboolean
  93. Java_org_rocksdb_SstFileManager_isMaxAllowedSpaceReachedIncludingCompactions(
  94. JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle) {
  95. auto* sptr_sst_file_manager =
  96. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  97. jhandle);
  98. return sptr_sst_file_manager->get()
  99. ->IsMaxAllowedSpaceReachedIncludingCompactions();
  100. }
  101. /*
  102. * Class: org_rocksdb_SstFileManager
  103. * Method: getTotalSize
  104. * Signature: (J)J
  105. */
  106. jlong Java_org_rocksdb_SstFileManager_getTotalSize(JNIEnv* /*env*/,
  107. jobject /*jobj*/,
  108. jlong jhandle) {
  109. auto* sptr_sst_file_manager =
  110. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  111. jhandle);
  112. return sptr_sst_file_manager->get()->GetTotalSize();
  113. }
  114. /*
  115. * Class: org_rocksdb_SstFileManager
  116. * Method: getTrackedFiles
  117. * Signature: (J)Ljava/util/Map;
  118. */
  119. jobject Java_org_rocksdb_SstFileManager_getTrackedFiles(JNIEnv* env,
  120. jobject /*jobj*/,
  121. jlong jhandle) {
  122. auto* sptr_sst_file_manager =
  123. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  124. jhandle);
  125. auto tracked_files = sptr_sst_file_manager->get()->GetTrackedFiles();
  126. // TODO(AR) could refactor to share code with
  127. // ROCKSDB_NAMESPACE::HashMapJni::fromCppMap(env, tracked_files);
  128. const jobject jtracked_files = ROCKSDB_NAMESPACE::HashMapJni::construct(
  129. env, static_cast<uint32_t>(tracked_files.size()));
  130. if (jtracked_files == nullptr) {
  131. // exception occurred
  132. return nullptr;
  133. }
  134. const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<const std::string,
  135. const uint64_t, jobject, jobject>
  136. fn_map_kv =
  137. [env](const std::pair<const std::string, const uint64_t>& pair) {
  138. const jstring jtracked_file_path =
  139. env->NewStringUTF(pair.first.c_str());
  140. if (jtracked_file_path == nullptr) {
  141. // an error occurred
  142. return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
  143. }
  144. const jobject jtracked_file_size =
  145. ROCKSDB_NAMESPACE::LongJni::valueOf(env, pair.second);
  146. if (jtracked_file_size == nullptr) {
  147. // an error occurred
  148. return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
  149. }
  150. return std::unique_ptr<std::pair<jobject, jobject>>(
  151. new std::pair<jobject, jobject>(jtracked_file_path,
  152. jtracked_file_size));
  153. };
  154. if (!ROCKSDB_NAMESPACE::HashMapJni::putAll(env, jtracked_files,
  155. tracked_files.begin(),
  156. tracked_files.end(), fn_map_kv)) {
  157. // exception occcurred
  158. return nullptr;
  159. }
  160. return jtracked_files;
  161. }
  162. /*
  163. * Class: org_rocksdb_SstFileManager
  164. * Method: getDeleteRateBytesPerSecond
  165. * Signature: (J)J
  166. */
  167. jlong Java_org_rocksdb_SstFileManager_getDeleteRateBytesPerSecond(
  168. JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle) {
  169. auto* sptr_sst_file_manager =
  170. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  171. jhandle);
  172. return sptr_sst_file_manager->get()->GetDeleteRateBytesPerSecond();
  173. }
  174. /*
  175. * Class: org_rocksdb_SstFileManager
  176. * Method: setDeleteRateBytesPerSecond
  177. * Signature: (JJ)V
  178. */
  179. void Java_org_rocksdb_SstFileManager_setDeleteRateBytesPerSecond(
  180. JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle, jlong jdelete_rate) {
  181. auto* sptr_sst_file_manager =
  182. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  183. jhandle);
  184. sptr_sst_file_manager->get()->SetDeleteRateBytesPerSecond(jdelete_rate);
  185. }
  186. /*
  187. * Class: org_rocksdb_SstFileManager
  188. * Method: getMaxTrashDBRatio
  189. * Signature: (J)D
  190. */
  191. jdouble Java_org_rocksdb_SstFileManager_getMaxTrashDBRatio(JNIEnv* /*env*/,
  192. jobject /*jobj*/,
  193. jlong jhandle) {
  194. auto* sptr_sst_file_manager =
  195. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  196. jhandle);
  197. return sptr_sst_file_manager->get()->GetMaxTrashDBRatio();
  198. }
  199. /*
  200. * Class: org_rocksdb_SstFileManager
  201. * Method: setMaxTrashDBRatio
  202. * Signature: (JD)V
  203. */
  204. void Java_org_rocksdb_SstFileManager_setMaxTrashDBRatio(JNIEnv* /*env*/,
  205. jobject /*jobj*/,
  206. jlong jhandle,
  207. jdouble jratio) {
  208. auto* sptr_sst_file_manager =
  209. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  210. jhandle);
  211. sptr_sst_file_manager->get()->SetMaxTrashDBRatio(jratio);
  212. }
  213. /*
  214. * Class: org_rocksdb_SstFileManager
  215. * Method: disposeInternal
  216. * Signature: (J)V
  217. */
  218. void Java_org_rocksdb_SstFileManager_disposeInternal(JNIEnv* /*env*/,
  219. jobject /*jobj*/,
  220. jlong jhandle) {
  221. auto* sptr_sst_file_manager =
  222. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
  223. jhandle);
  224. delete sptr_sst_file_manager;
  225. }