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::Statistics methods from Java side.
9 #include "rocksdb/statistics.h"
16 #include "include/org_rocksdb_Statistics.h"
17 #include "rocksjni/cplusplus_to_java_convert.h"
18 #include "rocksjni/portal.h"
19 #include "rocksjni/statisticsjni.h"
22 * Class: org_rocksdb_Statistics
23 * Method: newStatistics
26 jlong
Java_org_rocksdb_Statistics_newStatistics__(JNIEnv
* env
, jclass jcls
) {
27 return Java_org_rocksdb_Statistics_newStatistics___3BJ(env
, jcls
, nullptr, 0);
31 * Class: org_rocksdb_Statistics
32 * Method: newStatistics
35 jlong
Java_org_rocksdb_Statistics_newStatistics__J(
36 JNIEnv
* env
, jclass jcls
, jlong jother_statistics_handle
) {
37 return Java_org_rocksdb_Statistics_newStatistics___3BJ(
38 env
, jcls
, nullptr, jother_statistics_handle
);
42 * Class: org_rocksdb_Statistics
43 * Method: newStatistics
46 jlong
Java_org_rocksdb_Statistics_newStatistics___3B(JNIEnv
* env
, jclass jcls
,
47 jbyteArray jhistograms
) {
48 return Java_org_rocksdb_Statistics_newStatistics___3BJ(env
, jcls
, jhistograms
,
53 * Class: org_rocksdb_Statistics
54 * Method: newStatistics
57 jlong
Java_org_rocksdb_Statistics_newStatistics___3BJ(
58 JNIEnv
* env
, jclass
, jbyteArray jhistograms
,
59 jlong jother_statistics_handle
) {
60 std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>* pSptr_other_statistics
=
62 if (jother_statistics_handle
> 0) {
63 pSptr_other_statistics
=
64 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
65 jother_statistics_handle
);
68 std::set
<uint32_t> histograms
;
69 if (jhistograms
!= nullptr) {
70 const jsize len
= env
->GetArrayLength(jhistograms
);
72 jbyte
* jhistogram
= env
->GetByteArrayElements(jhistograms
, nullptr);
73 if (jhistogram
== nullptr) {
74 // exception thrown: OutOfMemoryError
78 for (jsize i
= 0; i
< len
; i
++) {
79 const ROCKSDB_NAMESPACE::Histograms histogram
=
80 ROCKSDB_NAMESPACE::HistogramTypeJni::toCppHistograms(jhistogram
[i
]);
81 histograms
.emplace(histogram
);
84 env
->ReleaseByteArrayElements(jhistograms
, jhistogram
, JNI_ABORT
);
88 std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
> sptr_other_statistics
=
90 if (pSptr_other_statistics
!= nullptr) {
91 sptr_other_statistics
= *pSptr_other_statistics
;
94 auto* pSptr_statistics
=
95 new std::shared_ptr
<ROCKSDB_NAMESPACE::StatisticsJni
>(
96 new ROCKSDB_NAMESPACE::StatisticsJni(sptr_other_statistics
,
99 return GET_CPLUSPLUS_POINTER(pSptr_statistics
);
103 * Class: org_rocksdb_Statistics
104 * Method: disposeInternal
107 void Java_org_rocksdb_Statistics_disposeInternal(JNIEnv
*, jobject
,
110 auto* pSptr_statistics
=
111 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
113 delete pSptr_statistics
;
118 * Class: org_rocksdb_Statistics
122 jbyte
Java_org_rocksdb_Statistics_statsLevel(JNIEnv
*, jobject
, jlong jhandle
) {
123 auto* pSptr_statistics
=
124 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
126 assert(pSptr_statistics
!= nullptr);
127 return ROCKSDB_NAMESPACE::StatsLevelJni::toJavaStatsLevel(
128 pSptr_statistics
->get()->get_stats_level());
132 * Class: org_rocksdb_Statistics
133 * Method: setStatsLevel
136 void Java_org_rocksdb_Statistics_setStatsLevel(JNIEnv
*, jobject
, jlong jhandle
,
137 jbyte jstats_level
) {
138 auto* pSptr_statistics
=
139 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
141 assert(pSptr_statistics
!= nullptr);
143 ROCKSDB_NAMESPACE::StatsLevelJni::toCppStatsLevel(jstats_level
);
144 pSptr_statistics
->get()->set_stats_level(stats_level
);
148 * Class: org_rocksdb_Statistics
149 * Method: getTickerCount
152 jlong
Java_org_rocksdb_Statistics_getTickerCount(JNIEnv
*, jobject
,
154 jbyte jticker_type
) {
155 auto* pSptr_statistics
=
156 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
158 assert(pSptr_statistics
!= nullptr);
159 auto ticker
= ROCKSDB_NAMESPACE::TickerTypeJni::toCppTickers(jticker_type
);
160 uint64_t count
= pSptr_statistics
->get()->getTickerCount(ticker
);
161 return static_cast<jlong
>(count
);
165 * Class: org_rocksdb_Statistics
166 * Method: getAndResetTickerCount
169 jlong
Java_org_rocksdb_Statistics_getAndResetTickerCount(JNIEnv
*, jobject
,
171 jbyte jticker_type
) {
172 auto* pSptr_statistics
=
173 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
175 assert(pSptr_statistics
!= nullptr);
176 auto ticker
= ROCKSDB_NAMESPACE::TickerTypeJni::toCppTickers(jticker_type
);
177 return pSptr_statistics
->get()->getAndResetTickerCount(ticker
);
181 * Class: org_rocksdb_Statistics
182 * Method: getHistogramData
183 * Signature: (JB)Lorg/rocksdb/HistogramData;
185 jobject
Java_org_rocksdb_Statistics_getHistogramData(JNIEnv
* env
, jobject
,
187 jbyte jhistogram_type
) {
188 auto* pSptr_statistics
=
189 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
191 assert(pSptr_statistics
!= nullptr);
193 // TODO(AR) perhaps better to construct a Java Object Wrapper that
194 // uses ptr to C++ `new HistogramData`
195 ROCKSDB_NAMESPACE::HistogramData data
;
198 ROCKSDB_NAMESPACE::HistogramTypeJni::toCppHistograms(jhistogram_type
);
199 pSptr_statistics
->get()->histogramData(
200 static_cast<ROCKSDB_NAMESPACE::Histograms
>(histogram
), &data
);
202 jclass jclazz
= ROCKSDB_NAMESPACE::HistogramDataJni::getJClass(env
);
203 if (jclazz
== nullptr) {
204 // exception occurred accessing class
209 ROCKSDB_NAMESPACE::HistogramDataJni::getConstructorMethodId(env
);
210 if (mid
== nullptr) {
211 // exception occurred accessing method
215 return env
->NewObject(jclazz
, mid
, data
.median
, data
.percentile95
,
216 data
.percentile99
, data
.average
,
217 data
.standard_deviation
, data
.max
, data
.count
, data
.sum
,
222 * Class: org_rocksdb_Statistics
223 * Method: getHistogramString
224 * Signature: (JB)Ljava/lang/String;
226 jstring
Java_org_rocksdb_Statistics_getHistogramString(JNIEnv
* env
, jobject
,
228 jbyte jhistogram_type
) {
229 auto* pSptr_statistics
=
230 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
232 assert(pSptr_statistics
!= nullptr);
234 ROCKSDB_NAMESPACE::HistogramTypeJni::toCppHistograms(jhistogram_type
);
235 auto str
= pSptr_statistics
->get()->getHistogramString(histogram
);
236 return env
->NewStringUTF(str
.c_str());
240 * Class: org_rocksdb_Statistics
244 void Java_org_rocksdb_Statistics_reset(JNIEnv
* env
, jobject
, jlong jhandle
) {
245 auto* pSptr_statistics
=
246 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
248 assert(pSptr_statistics
!= nullptr);
249 ROCKSDB_NAMESPACE::Status s
= pSptr_statistics
->get()->Reset();
251 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
256 * Class: org_rocksdb_Statistics
258 * Signature: (J)Ljava/lang/String;
260 jstring
Java_org_rocksdb_Statistics_toString(JNIEnv
* env
, jobject
,
262 auto* pSptr_statistics
=
263 reinterpret_cast<std::shared_ptr
<ROCKSDB_NAMESPACE::Statistics
>*>(
265 assert(pSptr_statistics
!= nullptr);
266 auto str
= pSptr_statistics
->get()->ToString();
267 return env
->NewStringUTF(str
.c_str());