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