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