]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/java/rocksjni/wal_filter_jnicallback.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / rocksdb / java / rocksjni / wal_filter_jnicallback.cc
CommitLineData
494da23a
TL
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 callback "bridge" between Java and C++ for
f67539c2 7// ROCKSDB_NAMESPACE::WalFilter.
494da23a
TL
8
9#include "rocksjni/wal_filter_jnicallback.h"
1e59de90
TL
10
11#include "rocksjni/cplusplus_to_java_convert.h"
494da23a
TL
12#include "rocksjni/portal.h"
13
f67539c2 14namespace ROCKSDB_NAMESPACE {
1e59de90 15WalFilterJniCallback::WalFilterJniCallback(JNIEnv* env, jobject jwal_filter)
494da23a
TL
16 : JniCallback(env, jwal_filter) {
17 // Note: The name of a WalFilter will not change during it's lifetime,
18 // so we cache it in a global var
19 jmethodID jname_mid = AbstractWalFilterJni::getNameMethodId(env);
1e59de90 20 if (jname_mid == nullptr) {
494da23a
TL
21 // exception thrown: NoSuchMethodException or OutOfMemoryError
22 return;
23 }
24 jstring jname = (jstring)env->CallObjectMethod(m_jcallback_obj, jname_mid);
1e59de90 25 if (env->ExceptionCheck()) {
494da23a
TL
26 // exception thrown
27 return;
28 }
29 jboolean has_exception = JNI_FALSE;
30 m_name = JniUtil::copyString(env, jname,
1e59de90 31 &has_exception); // also releases jname
494da23a
TL
32 if (has_exception == JNI_TRUE) {
33 // exception thrown
34 return;
35 }
36
37 m_column_family_log_number_map_mid =
38 AbstractWalFilterJni::getColumnFamilyLogNumberMapMethodId(env);
1e59de90 39 if (m_column_family_log_number_map_mid == nullptr) {
494da23a
TL
40 // exception thrown: NoSuchMethodException or OutOfMemoryError
41 return;
42 }
43
44 m_log_record_found_proxy_mid =
45 AbstractWalFilterJni::getLogRecordFoundProxyMethodId(env);
1e59de90 46 if (m_log_record_found_proxy_mid == nullptr) {
494da23a
TL
47 // exception thrown: NoSuchMethodException or OutOfMemoryError
48 return;
49 }
50}
51
52void WalFilterJniCallback::ColumnFamilyLogNumberMap(
53 const std::map<uint32_t, uint64_t>& cf_lognumber_map,
54 const std::map<std::string, uint32_t>& cf_name_id_map) {
55 jboolean attached_thread = JNI_FALSE;
56 JNIEnv* env = getJniEnv(&attached_thread);
57 if (env == nullptr) {
58 return;
59 }
60
61 jobject jcf_lognumber_map =
f67539c2 62 ROCKSDB_NAMESPACE::HashMapJni::fromCppMap(env, &cf_lognumber_map);
494da23a
TL
63 if (jcf_lognumber_map == nullptr) {
64 // exception occurred
1e59de90 65 env->ExceptionDescribe(); // print out exception to stderr
494da23a
TL
66 releaseJniEnv(attached_thread);
67 return;
68 }
69
70 jobject jcf_name_id_map =
f67539c2 71 ROCKSDB_NAMESPACE::HashMapJni::fromCppMap(env, &cf_name_id_map);
494da23a
TL
72 if (jcf_name_id_map == nullptr) {
73 // exception occurred
1e59de90 74 env->ExceptionDescribe(); // print out exception to stderr
494da23a
TL
75 env->DeleteLocalRef(jcf_lognumber_map);
76 releaseJniEnv(attached_thread);
77 return;
78 }
79
1e59de90
TL
80 env->CallVoidMethod(m_jcallback_obj, m_column_family_log_number_map_mid,
81 jcf_lognumber_map, jcf_name_id_map);
494da23a
TL
82
83 env->DeleteLocalRef(jcf_lognumber_map);
84 env->DeleteLocalRef(jcf_name_id_map);
85
1e59de90 86 if (env->ExceptionCheck()) {
494da23a
TL
87 // exception thrown from CallVoidMethod
88 env->ExceptionDescribe(); // print out exception to stderr
89 }
90
91 releaseJniEnv(attached_thread);
92}
93
1e59de90 94WalFilter::WalProcessingOption WalFilterJniCallback::LogRecordFound(
494da23a
TL
95 unsigned long long log_number, const std::string& log_file_name,
96 const WriteBatch& batch, WriteBatch* new_batch, bool* batch_changed) {
97 jboolean attached_thread = JNI_FALSE;
98 JNIEnv* env = getJniEnv(&attached_thread);
99 if (env == nullptr) {
1e59de90 100 return WalFilter::WalProcessingOption::kCorruptedRecord;
494da23a 101 }
1e59de90 102
494da23a
TL
103 jstring jlog_file_name = JniUtil::toJavaString(env, &log_file_name);
104 if (jlog_file_name == nullptr) {
105 // exception occcurred
1e59de90 106 env->ExceptionDescribe(); // print out exception to stderr
494da23a 107 releaseJniEnv(attached_thread);
1e59de90 108 return WalFilter::WalProcessingOption::kCorruptedRecord;
494da23a
TL
109 }
110
1e59de90
TL
111 jshort jlog_record_found_result = env->CallShortMethod(
112 m_jcallback_obj, m_log_record_found_proxy_mid,
113 static_cast<jlong>(log_number), jlog_file_name,
114 GET_CPLUSPLUS_POINTER(&batch), GET_CPLUSPLUS_POINTER(new_batch));
115
494da23a
TL
116 env->DeleteLocalRef(jlog_file_name);
117
118 if (env->ExceptionCheck()) {
119 // exception thrown from CallShortMethod
120 env->ExceptionDescribe(); // print out exception to stderr
121 releaseJniEnv(attached_thread);
1e59de90 122 return WalFilter::WalProcessingOption::kCorruptedRecord;
494da23a
TL
123 }
124
125 // unpack WalProcessingOption and batch_changed from jlog_record_found_result
126 jbyte jwal_processing_option_value = (jlog_record_found_result >> 8) & 0xFF;
127 jbyte jbatch_changed_value = jlog_record_found_result & 0xFF;
128
129 releaseJniEnv(attached_thread);
130
131 *batch_changed = jbatch_changed_value == JNI_TRUE;
132
133 return WalProcessingOptionJni::toCppWalProcessingOption(
134 jwal_processing_option_value);
135}
136
1e59de90 137const char* WalFilterJniCallback::Name() const { return m_name.get(); }
494da23a 138
f67539c2 139} // namespace ROCKSDB_NAMESPACE