persistent_cache_tier.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // Copyright (c) 2013, 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. #include "utilities/persistent_cache/persistent_cache_tier.h"
  7. #include <cinttypes>
  8. #include <sstream>
  9. #include <string>
  10. namespace ROCKSDB_NAMESPACE {
  11. std::string PersistentCacheConfig::ToString() const {
  12. std::string ret;
  13. ret.reserve(20000);
  14. const int kBufferSize = 200;
  15. char buffer[kBufferSize];
  16. snprintf(buffer, kBufferSize, " path: %s\n", path.c_str());
  17. ret.append(buffer);
  18. snprintf(buffer, kBufferSize, " enable_direct_reads: %d\n",
  19. enable_direct_reads);
  20. ret.append(buffer);
  21. snprintf(buffer, kBufferSize, " enable_direct_writes: %d\n",
  22. enable_direct_writes);
  23. ret.append(buffer);
  24. snprintf(buffer, kBufferSize, " cache_size: %" PRIu64 "\n", cache_size);
  25. ret.append(buffer);
  26. snprintf(buffer, kBufferSize, " cache_file_size: %" PRIu32 "\n",
  27. cache_file_size);
  28. ret.append(buffer);
  29. snprintf(buffer, kBufferSize, " writer_qdepth: %" PRIu32 "\n",
  30. writer_qdepth);
  31. ret.append(buffer);
  32. snprintf(buffer, kBufferSize, " pipeline_writes: %d\n", pipeline_writes);
  33. ret.append(buffer);
  34. snprintf(buffer, kBufferSize,
  35. " max_write_pipeline_backlog_size: %" PRIu64 "\n",
  36. max_write_pipeline_backlog_size);
  37. ret.append(buffer);
  38. snprintf(buffer, kBufferSize, " write_buffer_size: %" PRIu32 "\n",
  39. write_buffer_size);
  40. ret.append(buffer);
  41. snprintf(buffer, kBufferSize, " writer_dispatch_size: %" PRIu64 "\n",
  42. writer_dispatch_size);
  43. ret.append(buffer);
  44. snprintf(buffer, kBufferSize, " is_compressed: %d\n", is_compressed);
  45. ret.append(buffer);
  46. return ret;
  47. }
  48. //
  49. // PersistentCacheTier implementation
  50. //
  51. Status PersistentCacheTier::Open() {
  52. if (next_tier_) {
  53. return next_tier_->Open();
  54. }
  55. return Status::OK();
  56. }
  57. Status PersistentCacheTier::Close() {
  58. if (next_tier_) {
  59. return next_tier_->Close();
  60. }
  61. return Status::OK();
  62. }
  63. bool PersistentCacheTier::Reserve(const size_t /*size*/) {
  64. // default implementation is a pass through
  65. return true;
  66. }
  67. bool PersistentCacheTier::Erase(const Slice& /*key*/) {
  68. // default implementation is a pass through since not all cache tiers might
  69. // support erase
  70. return true;
  71. }
  72. std::string PersistentCacheTier::PrintStats() {
  73. std::ostringstream os;
  74. for (const auto& tier_stats : Stats()) {
  75. os << "---- next tier -----" << std::endl;
  76. for (const auto& stat : tier_stats) {
  77. os << stat.first << ": " << stat.second << std::endl;
  78. }
  79. }
  80. return os.str();
  81. }
  82. PersistentCache::StatsType PersistentCacheTier::Stats() {
  83. if (next_tier_) {
  84. return next_tier_->Stats();
  85. }
  86. return PersistentCache::StatsType{};
  87. }
  88. uint64_t PersistentCacheTier::NewId() {
  89. return last_id_.fetch_add(1, std::memory_order_relaxed);
  90. }
  91. //
  92. // PersistentTieredCache implementation
  93. //
  94. PersistentTieredCache::~PersistentTieredCache() { assert(tiers_.empty()); }
  95. Status PersistentTieredCache::Open() {
  96. assert(!tiers_.empty());
  97. return tiers_.front()->Open();
  98. }
  99. Status PersistentTieredCache::Close() {
  100. assert(!tiers_.empty());
  101. Status status = tiers_.front()->Close();
  102. if (status.ok()) {
  103. tiers_.clear();
  104. }
  105. return status;
  106. }
  107. bool PersistentTieredCache::Erase(const Slice& key) {
  108. assert(!tiers_.empty());
  109. return tiers_.front()->Erase(key);
  110. }
  111. PersistentCache::StatsType PersistentTieredCache::Stats() {
  112. assert(!tiers_.empty());
  113. return tiers_.front()->Stats();
  114. }
  115. std::string PersistentTieredCache::PrintStats() {
  116. assert(!tiers_.empty());
  117. return tiers_.front()->PrintStats();
  118. }
  119. Status PersistentTieredCache::Insert(const Slice& page_key, const char* data,
  120. const size_t size) {
  121. assert(!tiers_.empty());
  122. return tiers_.front()->Insert(page_key, data, size);
  123. }
  124. Status PersistentTieredCache::Lookup(const Slice& page_key,
  125. std::unique_ptr<char[]>* data,
  126. size_t* size) {
  127. assert(!tiers_.empty());
  128. return tiers_.front()->Lookup(page_key, data, size);
  129. }
  130. void PersistentTieredCache::AddTier(const Tier& tier) {
  131. if (!tiers_.empty()) {
  132. tiers_.back()->set_next_tier(tier);
  133. }
  134. tiers_.push_back(tier);
  135. }
  136. bool PersistentTieredCache::IsCompressed() {
  137. assert(tiers_.size());
  138. return tiers_.front()->IsCompressed();
  139. }
  140. } // namespace ROCKSDB_NAMESPACE