YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/rocksdb/db/file_numbers.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
14
#ifndef YB_ROCKSDB_DB_FILE_NUMBERS_H
15
#define YB_ROCKSDB_DB_FILE_NUMBERS_H
16
17
#include <unordered_set>
18
19
#include <boost/container/small_vector.hpp>
20
21
#include "yb/rocksdb/util/mutexlock.h"
22
23
namespace rocksdb {
24
25
typedef uint64_t FileNumber;
26
typedef std::unordered_multiset<FileNumber> FileNumberSet;
27
28
class VersionSet;
29
30
// Utility interface used by FileNumbersHolder and FileNumbersProvider (see below).
31
class FileNumberAdderRemover {
32
 public:
33
  virtual void AddFileNumber(FileNumber file_number) = 0;
34
  virtual void RemoveFileNumber(FileNumber file_number) = 0;
35
323k
  virtual ~FileNumberAdderRemover() {}
36
};
37
38
// RAII wrapper which holds file numbers and passes them to adder_remover_->RemoveFileNumber
39
// when destroyed. Also calls adder_remover_->AddFileNumber on copy.
40
class FileNumbersHolder {
41
 public:
42
  FileNumbersHolder(const FileNumbersHolder& rhs) :
43
0
    adder_remover_(rhs.adder_remover_), file_numbers_(rhs.file_numbers_) {
44
0
    HoldFileNumbers();
45
0
  }
46
47
25.4k
  FileNumbersHolder& operator=(const FileNumbersHolder& rhs) {
48
25.4k
    if (&rhs != this) {
49
25.4k
      Reset();
50
25.4k
      adder_remover_ = rhs.adder_remover_;
51
25.4k
      file_numbers_ = rhs.file_numbers_;
52
25.4k
      HoldFileNumbers();
53
25.4k
    }
54
25.4k
    return *this;
55
25.4k
  }
56
57
  // Default constructor creates empty holder which is not intended to add any file numbers.
58
474k
  FileNumbersHolder() {}
59
  // Creates holder which can be used to add file numbers.
60
49.2k
  explicit FileNumbersHolder(FileNumberAdderRemover* remover) : adder_remover_(remover) {}
61
62
  FileNumbersHolder(FileNumbersHolder&& rhs)
63
      : adder_remover_(rhs.adder_remover_),
64
221k
        file_numbers_(std::move(rhs.file_numbers_)) {
65
221k
    rhs.file_numbers_.clear();
66
221k
  }
67
68
0
  FileNumbersHolder& operator=(FileNumbersHolder&& rhs) {
69
0
    if (&rhs != this) {
70
0
      Reset();
71
0
      adder_remover_ = std::move(rhs.adder_remover_);
72
0
      file_numbers_ = std::move(rhs.file_numbers_);
73
0
      rhs.file_numbers_.clear();
74
0
    }
75
0
    return *this;
76
0
  }
77
78
726k
  ~FileNumbersHolder() {
79
726k
    Reset();
80
726k
  }
81
82
752k
  void Reset() {
83
86.1k
    for (auto file_number : file_numbers_) {
84
86.1k
      adder_remover_->RemoveFileNumber(file_number);
85
86.1k
    }
86
752k
    file_numbers_.clear();
87
752k
  }
88
89
  // Returns last number added.
90
38.5k
  FileNumber Last() { return file_numbers_.back(); }
91
92
  // Preallocate capacity in internal file numbers storage.
93
10.6k
  void Reserve(size_t capacity) {
94
10.6k
    file_numbers_.reserve(capacity);
95
10.6k
  }
96
97
60.6k
  void Add(FileNumber file_number) {
98
60.6k
    file_numbers_.emplace_back(file_number);
99
60.6k
  }
100
101
  std::string ToString() const;
102
103
 private:
104
25.4k
  void HoldFileNumbers() {
105
25.4k
    for (auto file_number : file_numbers_) {
106
25.4k
      adder_remover_->AddFileNumber(file_number);
107
25.4k
    }
108
25.4k
  }
109
110
  FileNumberAdderRemover* adder_remover_ = nullptr;
111
  boost::container::small_vector<FileNumber, 1> file_numbers_;
112
};
113
114
// Utility class providing functionality to get new file numbers from VersionSet. File numbers
115
// returned are wrapped in FileNumbersHolder and stored in internal storage. Once wrapper is
116
// destroyed, corresponding file numbers will be removed from internal storage. Also provides a
117
// function to check whether specific file number is contained in internal storage.
118
// See DBImpl::pending_outputs_ description for more details on usage and application.
119
class FileNumbersProvider : public FileNumberAdderRemover {
120
 public:
121
  explicit FileNumbersProvider(VersionSet* versions)
122
341k
      : versions_(versions) {}
123
124
  // Requests new file number from VersionSet, stores it and returns wrapped in a holder.
125
  FileNumbersHolder NewFileNumber();
126
127
  // Create empty holder to which file numbers could be added later using NewFileNumber.
128
  FileNumbersHolder CreateHolder();
129
130
  // Requests new file number from VersionSet, stores it and adds to holder.
131
  FileNumber NewFileNumber(FileNumbersHolder* holder);
132
133
  // Check whether we have have file_number in internal storage.
134
  bool HasFileNumber(FileNumber file_number) const;
135
136
  // Add file_number to internal storage.
137
  void AddFileNumber(FileNumber file_number) override;
138
139
  // Remove file_number from internal storage.
140
  void RemoveFileNumber(FileNumber file_number) override;
141
142
  std::string ToString() const;
143
144
 private:
145
  VersionSet* versions_;
146
  mutable SpinMutex mutex_;
147
  FileNumberSet fset_;
148
};
149
150
}  // namespace rocksdb
151
152
#endif  // YB_ROCKSDB_DB_FILE_NUMBERS_H