blob_counting_iterator.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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 "db/blob/blob_garbage_meter.h"
  8. #include "rocksdb/rocksdb_namespace.h"
  9. #include "rocksdb/status.h"
  10. #include "table/internal_iterator.h"
  11. #include "test_util/sync_point.h"
  12. namespace ROCKSDB_NAMESPACE {
  13. // An internal iterator that passes each key-value encountered to
  14. // BlobGarbageMeter as inflow in order to measure the total number and size of
  15. // blobs in the compaction input on a per-blob file basis.
  16. class BlobCountingIterator : public InternalIterator {
  17. public:
  18. BlobCountingIterator(InternalIterator* iter,
  19. BlobGarbageMeter* blob_garbage_meter)
  20. : iter_(iter), blob_garbage_meter_(blob_garbage_meter) {
  21. assert(iter_);
  22. assert(blob_garbage_meter_);
  23. UpdateAndCountBlobIfNeeded();
  24. }
  25. bool Valid() const override { return iter_->Valid() && status_.ok(); }
  26. void SeekToFirst() override {
  27. iter_->SeekToFirst();
  28. UpdateAndCountBlobIfNeeded();
  29. }
  30. void SeekToLast() override {
  31. iter_->SeekToLast();
  32. UpdateAndCountBlobIfNeeded();
  33. }
  34. void Seek(const Slice& target) override {
  35. iter_->Seek(target);
  36. UpdateAndCountBlobIfNeeded();
  37. }
  38. void SeekForPrev(const Slice& target) override {
  39. iter_->SeekForPrev(target);
  40. UpdateAndCountBlobIfNeeded();
  41. }
  42. void Next() override {
  43. assert(Valid());
  44. iter_->Next();
  45. UpdateAndCountBlobIfNeeded();
  46. }
  47. bool NextAndGetResult(IterateResult* result) override {
  48. assert(Valid());
  49. const bool res = iter_->NextAndGetResult(result);
  50. UpdateAndCountBlobIfNeeded();
  51. return res;
  52. }
  53. void Prev() override {
  54. assert(Valid());
  55. iter_->Prev();
  56. UpdateAndCountBlobIfNeeded();
  57. }
  58. Slice key() const override {
  59. assert(Valid());
  60. return iter_->key();
  61. }
  62. Slice user_key() const override {
  63. assert(Valid());
  64. return iter_->user_key();
  65. }
  66. Slice value() const override {
  67. assert(Valid());
  68. return iter_->value();
  69. }
  70. Status status() const override { return status_; }
  71. bool PrepareValue() override {
  72. assert(Valid());
  73. return iter_->PrepareValue();
  74. }
  75. bool MayBeOutOfLowerBound() override {
  76. assert(Valid());
  77. return iter_->MayBeOutOfLowerBound();
  78. }
  79. IterBoundCheck UpperBoundCheckResult() override {
  80. assert(Valid());
  81. return iter_->UpperBoundCheckResult();
  82. }
  83. void SetPinnedItersMgr(PinnedIteratorsManager* pinned_iters_mgr) override {
  84. iter_->SetPinnedItersMgr(pinned_iters_mgr);
  85. }
  86. bool IsKeyPinned() const override {
  87. assert(Valid());
  88. return iter_->IsKeyPinned();
  89. }
  90. bool IsValuePinned() const override {
  91. assert(Valid());
  92. return iter_->IsValuePinned();
  93. }
  94. Status GetProperty(std::string prop_name, std::string* prop) override {
  95. return iter_->GetProperty(prop_name, prop);
  96. }
  97. bool IsDeleteRangeSentinelKey() const override {
  98. return iter_->IsDeleteRangeSentinelKey();
  99. }
  100. private:
  101. void UpdateAndCountBlobIfNeeded() {
  102. assert(!iter_->Valid() || iter_->status().ok());
  103. if (!iter_->Valid()) {
  104. status_ = iter_->status();
  105. return;
  106. }
  107. TEST_SYNC_POINT(
  108. "BlobCountingIterator::UpdateAndCountBlobIfNeeded:ProcessInFlow");
  109. status_ = blob_garbage_meter_->ProcessInFlow(key(), value());
  110. }
  111. InternalIterator* iter_;
  112. BlobGarbageMeter* blob_garbage_meter_;
  113. Status status_;
  114. };
  115. } // namespace ROCKSDB_NAMESPACE