memory_util.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. #include <jni.h>
  6. #include <map>
  7. #include <string>
  8. #include <unordered_set>
  9. #include <vector>
  10. #include "include/org_rocksdb_MemoryUtil.h"
  11. #include "rocksjni/portal.h"
  12. #include "rocksdb/utilities/memory_util.h"
  13. /*
  14. * Class: org_rocksdb_MemoryUtil
  15. * Method: getApproximateMemoryUsageByType
  16. * Signature: ([J[J)Ljava/util/Map;
  17. */
  18. jobject Java_org_rocksdb_MemoryUtil_getApproximateMemoryUsageByType(
  19. JNIEnv *env, jclass /*jclazz*/, jlongArray jdb_handles, jlongArray jcache_handles) {
  20. std::vector<ROCKSDB_NAMESPACE::DB *> dbs;
  21. jsize db_handle_count = env->GetArrayLength(jdb_handles);
  22. if(db_handle_count > 0) {
  23. jlong *ptr_jdb_handles = env->GetLongArrayElements(jdb_handles, nullptr);
  24. if (ptr_jdb_handles == nullptr) {
  25. // exception thrown: OutOfMemoryError
  26. return nullptr;
  27. }
  28. for (jsize i = 0; i < db_handle_count; i++) {
  29. dbs.push_back(
  30. reinterpret_cast<ROCKSDB_NAMESPACE::DB *>(ptr_jdb_handles[i]));
  31. }
  32. env->ReleaseLongArrayElements(jdb_handles, ptr_jdb_handles, JNI_ABORT);
  33. }
  34. std::unordered_set<const ROCKSDB_NAMESPACE::Cache *> cache_set;
  35. jsize cache_handle_count = env->GetArrayLength(jcache_handles);
  36. if(cache_handle_count > 0) {
  37. jlong *ptr_jcache_handles = env->GetLongArrayElements(jcache_handles, nullptr);
  38. if (ptr_jcache_handles == nullptr) {
  39. // exception thrown: OutOfMemoryError
  40. return nullptr;
  41. }
  42. for (jsize i = 0; i < cache_handle_count; i++) {
  43. auto *cache_ptr =
  44. reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::Cache> *>(
  45. ptr_jcache_handles[i]);
  46. cache_set.insert(cache_ptr->get());
  47. }
  48. env->ReleaseLongArrayElements(jcache_handles, ptr_jcache_handles, JNI_ABORT);
  49. }
  50. std::map<ROCKSDB_NAMESPACE::MemoryUtil::UsageType, uint64_t> usage_by_type;
  51. if (ROCKSDB_NAMESPACE::MemoryUtil::GetApproximateMemoryUsageByType(
  52. dbs, cache_set, &usage_by_type) != ROCKSDB_NAMESPACE::Status::OK()) {
  53. // Non-OK status
  54. return nullptr;
  55. }
  56. jobject jusage_by_type = ROCKSDB_NAMESPACE::HashMapJni::construct(
  57. env, static_cast<uint32_t>(usage_by_type.size()));
  58. if (jusage_by_type == nullptr) {
  59. // exception occurred
  60. return nullptr;
  61. }
  62. const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<
  63. const ROCKSDB_NAMESPACE::MemoryUtil::UsageType, const uint64_t, jobject,
  64. jobject>
  65. fn_map_kv = [env](
  66. const std::pair<ROCKSDB_NAMESPACE::MemoryUtil::UsageType,
  67. uint64_t> &pair) {
  68. // Construct key
  69. const jobject jusage_type = ROCKSDB_NAMESPACE::ByteJni::valueOf(
  70. env, ROCKSDB_NAMESPACE::MemoryUsageTypeJni::toJavaMemoryUsageType(
  71. pair.first));
  72. if (jusage_type == nullptr) {
  73. // an error occurred
  74. return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
  75. }
  76. // Construct value
  77. const jobject jusage_value =
  78. ROCKSDB_NAMESPACE::LongJni::valueOf(env, pair.second);
  79. if (jusage_value == nullptr) {
  80. // an error occurred
  81. return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
  82. }
  83. // Construct and return pointer to pair of jobjects
  84. return std::unique_ptr<std::pair<jobject, jobject>>(
  85. new std::pair<jobject, jobject>(jusage_type,
  86. jusage_value));
  87. };
  88. if (!ROCKSDB_NAMESPACE::HashMapJni::putAll(env, jusage_by_type,
  89. usage_by_type.begin(),
  90. usage_by_type.end(), fn_map_kv)) {
  91. // exception occcurred
  92. jusage_by_type = nullptr;
  93. }
  94. return jusage_by_type;
  95. }