blob_file_meta.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. #pragma once
  6. #include <cassert>
  7. #include <cstdint>
  8. #include <iosfwd>
  9. #include <memory>
  10. #include <string>
  11. #include <unordered_set>
  12. #include "rocksdb/rocksdb_namespace.h"
  13. namespace ROCKSDB_NAMESPACE {
  14. // SharedBlobFileMetaData represents the immutable part of blob files' metadata,
  15. // like the blob file number, total number and size of blobs, or checksum
  16. // method and value. There is supposed to be one object of this class per blob
  17. // file (shared across all versions that include the blob file in question);
  18. // hence, the type is neither copyable nor movable. A blob file can be marked
  19. // obsolete when the corresponding SharedBlobFileMetaData object is destroyed.
  20. class SharedBlobFileMetaData {
  21. public:
  22. static std::shared_ptr<SharedBlobFileMetaData> Create(
  23. uint64_t blob_file_number, uint64_t total_blob_count,
  24. uint64_t total_blob_bytes, std::string checksum_method,
  25. std::string checksum_value) {
  26. return std::shared_ptr<SharedBlobFileMetaData>(new SharedBlobFileMetaData(
  27. blob_file_number, total_blob_count, total_blob_bytes,
  28. std::move(checksum_method), std::move(checksum_value)));
  29. }
  30. template <typename Deleter>
  31. static std::shared_ptr<SharedBlobFileMetaData> Create(
  32. uint64_t blob_file_number, uint64_t total_blob_count,
  33. uint64_t total_blob_bytes, std::string checksum_method,
  34. std::string checksum_value, Deleter deleter) {
  35. return std::shared_ptr<SharedBlobFileMetaData>(
  36. new SharedBlobFileMetaData(blob_file_number, total_blob_count,
  37. total_blob_bytes, std::move(checksum_method),
  38. std::move(checksum_value)),
  39. deleter);
  40. }
  41. SharedBlobFileMetaData(const SharedBlobFileMetaData&) = delete;
  42. SharedBlobFileMetaData& operator=(const SharedBlobFileMetaData&) = delete;
  43. SharedBlobFileMetaData(SharedBlobFileMetaData&&) = delete;
  44. SharedBlobFileMetaData& operator=(SharedBlobFileMetaData&&) = delete;
  45. uint64_t GetBlobFileSize() const;
  46. uint64_t GetBlobFileNumber() const { return blob_file_number_; }
  47. uint64_t GetTotalBlobCount() const { return total_blob_count_; }
  48. uint64_t GetTotalBlobBytes() const { return total_blob_bytes_; }
  49. const std::string& GetChecksumMethod() const { return checksum_method_; }
  50. const std::string& GetChecksumValue() const { return checksum_value_; }
  51. std::string DebugString() const;
  52. private:
  53. SharedBlobFileMetaData(uint64_t blob_file_number, uint64_t total_blob_count,
  54. uint64_t total_blob_bytes, std::string checksum_method,
  55. std::string checksum_value)
  56. : blob_file_number_(blob_file_number),
  57. total_blob_count_(total_blob_count),
  58. total_blob_bytes_(total_blob_bytes),
  59. checksum_method_(std::move(checksum_method)),
  60. checksum_value_(std::move(checksum_value)) {
  61. assert(checksum_method_.empty() == checksum_value_.empty());
  62. }
  63. uint64_t blob_file_number_;
  64. uint64_t total_blob_count_;
  65. uint64_t total_blob_bytes_;
  66. std::string checksum_method_;
  67. std::string checksum_value_;
  68. };
  69. std::ostream& operator<<(std::ostream& os,
  70. const SharedBlobFileMetaData& shared_meta);
  71. // BlobFileMetaData contains the part of the metadata for blob files that can
  72. // vary across versions, like the amount of garbage in the blob file. In
  73. // addition, BlobFileMetaData objects point to and share the ownership of the
  74. // SharedBlobFileMetaData object for the corresponding blob file. Similarly to
  75. // SharedBlobFileMetaData, BlobFileMetaData are not copyable or movable. They
  76. // are meant to be jointly owned by the versions in which the blob file has the
  77. // same (immutable *and* mutable) state.
  78. class BlobFileMetaData {
  79. public:
  80. using LinkedSsts = std::unordered_set<uint64_t>;
  81. static std::shared_ptr<BlobFileMetaData> Create(
  82. std::shared_ptr<SharedBlobFileMetaData> shared_meta,
  83. LinkedSsts linked_ssts, uint64_t garbage_blob_count,
  84. uint64_t garbage_blob_bytes) {
  85. return std::shared_ptr<BlobFileMetaData>(
  86. new BlobFileMetaData(std::move(shared_meta), std::move(linked_ssts),
  87. garbage_blob_count, garbage_blob_bytes));
  88. }
  89. BlobFileMetaData(const BlobFileMetaData&) = delete;
  90. BlobFileMetaData& operator=(const BlobFileMetaData&) = delete;
  91. BlobFileMetaData(BlobFileMetaData&&) = delete;
  92. BlobFileMetaData& operator=(BlobFileMetaData&&) = delete;
  93. const std::shared_ptr<SharedBlobFileMetaData>& GetSharedMeta() const {
  94. return shared_meta_;
  95. }
  96. uint64_t GetBlobFileSize() const {
  97. assert(shared_meta_);
  98. return shared_meta_->GetBlobFileSize();
  99. }
  100. uint64_t GetBlobFileNumber() const {
  101. assert(shared_meta_);
  102. return shared_meta_->GetBlobFileNumber();
  103. }
  104. uint64_t GetTotalBlobCount() const {
  105. assert(shared_meta_);
  106. return shared_meta_->GetTotalBlobCount();
  107. }
  108. uint64_t GetTotalBlobBytes() const {
  109. assert(shared_meta_);
  110. return shared_meta_->GetTotalBlobBytes();
  111. }
  112. const std::string& GetChecksumMethod() const {
  113. assert(shared_meta_);
  114. return shared_meta_->GetChecksumMethod();
  115. }
  116. const std::string& GetChecksumValue() const {
  117. assert(shared_meta_);
  118. return shared_meta_->GetChecksumValue();
  119. }
  120. const LinkedSsts& GetLinkedSsts() const { return linked_ssts_; }
  121. uint64_t GetGarbageBlobCount() const { return garbage_blob_count_; }
  122. uint64_t GetGarbageBlobBytes() const { return garbage_blob_bytes_; }
  123. std::string DebugString() const;
  124. private:
  125. BlobFileMetaData(std::shared_ptr<SharedBlobFileMetaData> shared_meta,
  126. LinkedSsts linked_ssts, uint64_t garbage_blob_count,
  127. uint64_t garbage_blob_bytes)
  128. : shared_meta_(std::move(shared_meta)),
  129. linked_ssts_(std::move(linked_ssts)),
  130. garbage_blob_count_(garbage_blob_count),
  131. garbage_blob_bytes_(garbage_blob_bytes) {
  132. assert(shared_meta_);
  133. assert(garbage_blob_count_ <= shared_meta_->GetTotalBlobCount());
  134. assert(garbage_blob_bytes_ <= shared_meta_->GetTotalBlobBytes());
  135. }
  136. std::shared_ptr<SharedBlobFileMetaData> shared_meta_;
  137. LinkedSsts linked_ssts_;
  138. uint64_t garbage_blob_count_;
  139. uint64_t garbage_blob_bytes_;
  140. };
  141. std::ostream& operator<<(std::ostream& os, const BlobFileMetaData& meta);
  142. } // namespace ROCKSDB_NAMESPACE