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).
6 // This file implements the "bridge" between Java and C++ and enables
7 // calling C++ ROCKSDB_NAMESPACE::BackupEngine methods from the Java side.
13 #include "include/org_rocksdb_BackupEngine.h"
14 #include "rocksdb/utilities/backup_engine.h"
15 #include "rocksjni/cplusplus_to_java_convert.h"
16 #include "rocksjni/portal.h"
19 * Class: org_rocksdb_BackupEngine
23 jlong
Java_org_rocksdb_BackupEngine_open(JNIEnv
* env
, jclass
/*jcls*/,
25 jlong backup_engine_options_handle
) {
26 auto* rocks_env
= reinterpret_cast<ROCKSDB_NAMESPACE::Env
*>(env_handle
);
27 auto* backup_engine_options
=
28 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngineOptions
*>(
29 backup_engine_options_handle
);
30 ROCKSDB_NAMESPACE::BackupEngine
* backup_engine
;
31 auto status
= ROCKSDB_NAMESPACE::BackupEngine::Open(
32 rocks_env
, *backup_engine_options
, &backup_engine
);
35 return GET_CPLUSPLUS_POINTER(backup_engine
);
37 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
43 * Class: org_rocksdb_BackupEngine
44 * Method: createNewBackup
47 void Java_org_rocksdb_BackupEngine_createNewBackup(
48 JNIEnv
* env
, jobject
/*jbe*/, jlong jbe_handle
, jlong db_handle
,
49 jboolean jflush_before_backup
) {
50 auto* db
= reinterpret_cast<ROCKSDB_NAMESPACE::DB
*>(db_handle
);
52 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
53 auto status
= backup_engine
->CreateNewBackup(
54 db
, static_cast<bool>(jflush_before_backup
));
60 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
64 * Class: org_rocksdb_BackupEngine
65 * Method: createNewBackupWithMetadata
66 * Signature: (JJLjava/lang/String;Z)V
68 void Java_org_rocksdb_BackupEngine_createNewBackupWithMetadata(
69 JNIEnv
* env
, jobject
/*jbe*/, jlong jbe_handle
, jlong db_handle
,
70 jstring japp_metadata
, jboolean jflush_before_backup
) {
71 auto* db
= reinterpret_cast<ROCKSDB_NAMESPACE::DB
*>(db_handle
);
73 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
75 jboolean has_exception
= JNI_FALSE
;
76 std::string app_metadata
= ROCKSDB_NAMESPACE::JniUtil::copyStdString(
77 env
, japp_metadata
, &has_exception
);
78 if (has_exception
== JNI_TRUE
) {
79 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
80 env
, "Could not copy jstring to std::string");
84 auto status
= backup_engine
->CreateNewBackupWithMetadata(
85 db
, app_metadata
, static_cast<bool>(jflush_before_backup
));
91 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
95 * Class: org_rocksdb_BackupEngine
96 * Method: getBackupInfo
97 * Signature: (J)Ljava/util/List;
99 jobject
Java_org_rocksdb_BackupEngine_getBackupInfo(JNIEnv
* env
,
102 auto* backup_engine
=
103 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
104 std::vector
<ROCKSDB_NAMESPACE::BackupInfo
> backup_infos
;
105 backup_engine
->GetBackupInfo(&backup_infos
);
106 return ROCKSDB_NAMESPACE::BackupInfoListJni::getBackupInfo(env
, backup_infos
);
110 * Class: org_rocksdb_BackupEngine
111 * Method: getCorruptedBackups
114 jintArray
Java_org_rocksdb_BackupEngine_getCorruptedBackups(JNIEnv
* env
,
117 auto* backup_engine
=
118 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
119 std::vector
<ROCKSDB_NAMESPACE::BackupID
> backup_ids
;
120 backup_engine
->GetCorruptedBackups(&backup_ids
);
121 // store backupids in int array
122 std::vector
<jint
> int_backup_ids(backup_ids
.begin(), backup_ids
.end());
124 // Store ints in java array
125 // Its ok to loose precision here (64->32)
126 jsize ret_backup_ids_size
= static_cast<jsize
>(backup_ids
.size());
127 jintArray ret_backup_ids
= env
->NewIntArray(ret_backup_ids_size
);
128 if (ret_backup_ids
== nullptr) {
129 // exception thrown: OutOfMemoryError
132 env
->SetIntArrayRegion(ret_backup_ids
, 0, ret_backup_ids_size
,
133 int_backup_ids
.data());
134 return ret_backup_ids
;
138 * Class: org_rocksdb_BackupEngine
139 * Method: garbageCollect
142 void Java_org_rocksdb_BackupEngine_garbageCollect(JNIEnv
* env
, jobject
/*jbe*/,
144 auto* backup_engine
=
145 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
146 auto status
= backup_engine
->GarbageCollect();
152 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
156 * Class: org_rocksdb_BackupEngine
157 * Method: purgeOldBackups
160 void Java_org_rocksdb_BackupEngine_purgeOldBackups(JNIEnv
* env
, jobject
/*jbe*/,
162 jint jnum_backups_to_keep
) {
163 auto* backup_engine
=
164 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
165 auto status
= backup_engine
->PurgeOldBackups(
166 static_cast<uint32_t>(jnum_backups_to_keep
));
172 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
176 * Class: org_rocksdb_BackupEngine
177 * Method: deleteBackup
180 void Java_org_rocksdb_BackupEngine_deleteBackup(JNIEnv
* env
, jobject
/*jbe*/,
183 auto* backup_engine
=
184 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
185 auto status
= backup_engine
->DeleteBackup(
186 static_cast<ROCKSDB_NAMESPACE::BackupID
>(jbackup_id
));
192 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
196 * Class: org_rocksdb_BackupEngine
197 * Method: restoreDbFromBackup
198 * Signature: (JILjava/lang/String;Ljava/lang/String;J)V
200 void Java_org_rocksdb_BackupEngine_restoreDbFromBackup(
201 JNIEnv
* env
, jobject
/*jbe*/, jlong jbe_handle
, jint jbackup_id
,
202 jstring jdb_dir
, jstring jwal_dir
, jlong jrestore_options_handle
) {
203 auto* backup_engine
=
204 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
205 const char* db_dir
= env
->GetStringUTFChars(jdb_dir
, nullptr);
206 if (db_dir
== nullptr) {
207 // exception thrown: OutOfMemoryError
210 const char* wal_dir
= env
->GetStringUTFChars(jwal_dir
, nullptr);
211 if (wal_dir
== nullptr) {
212 // exception thrown: OutOfMemoryError
213 env
->ReleaseStringUTFChars(jdb_dir
, db_dir
);
216 auto* restore_options
= reinterpret_cast<ROCKSDB_NAMESPACE::RestoreOptions
*>(
217 jrestore_options_handle
);
218 auto status
= backup_engine
->RestoreDBFromBackup(
219 static_cast<ROCKSDB_NAMESPACE::BackupID
>(jbackup_id
), db_dir
, wal_dir
,
222 env
->ReleaseStringUTFChars(jwal_dir
, wal_dir
);
223 env
->ReleaseStringUTFChars(jdb_dir
, db_dir
);
229 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
233 * Class: org_rocksdb_BackupEngine
234 * Method: restoreDbFromLatestBackup
235 * Signature: (JLjava/lang/String;Ljava/lang/String;J)V
237 void Java_org_rocksdb_BackupEngine_restoreDbFromLatestBackup(
238 JNIEnv
* env
, jobject
/*jbe*/, jlong jbe_handle
, jstring jdb_dir
,
239 jstring jwal_dir
, jlong jrestore_options_handle
) {
240 auto* backup_engine
=
241 reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
242 const char* db_dir
= env
->GetStringUTFChars(jdb_dir
, nullptr);
243 if (db_dir
== nullptr) {
244 // exception thrown: OutOfMemoryError
247 const char* wal_dir
= env
->GetStringUTFChars(jwal_dir
, nullptr);
248 if (wal_dir
== nullptr) {
249 // exception thrown: OutOfMemoryError
250 env
->ReleaseStringUTFChars(jdb_dir
, db_dir
);
253 auto* restore_options
= reinterpret_cast<ROCKSDB_NAMESPACE::RestoreOptions
*>(
254 jrestore_options_handle
);
255 auto status
= backup_engine
->RestoreDBFromLatestBackup(db_dir
, wal_dir
,
258 env
->ReleaseStringUTFChars(jwal_dir
, wal_dir
);
259 env
->ReleaseStringUTFChars(jdb_dir
, db_dir
);
265 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
269 * Class: org_rocksdb_BackupEngine
270 * Method: disposeInternal
273 void Java_org_rocksdb_BackupEngine_disposeInternal(JNIEnv
* /*env*/,
276 auto* be
= reinterpret_cast<ROCKSDB_NAMESPACE::BackupEngine
*>(jbe_handle
);
277 assert(be
!= nullptr);