]>
Commit | Line | Data |
---|---|---|
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 | 14 | namespace ROCKSDB_NAMESPACE { |
1e59de90 | 15 | WalFilterJniCallback::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 | ||
52 | void 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 | 94 | WalFilter::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 | 137 | const char* WalFilterJniCallback::Name() const { return m_name.get(); } |
494da23a | 138 | |
f67539c2 | 139 | } // namespace ROCKSDB_NAMESPACE |