YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/Users/deen/code/yugabyte-db/src/yb/rocksdb/memory_monitor.h
Line
Count
Source
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
#ifndef YB_ROCKSDB_MEMORY_MONITOR_H
14
#define YB_ROCKSDB_MEMORY_MONITOR_H
15
16
#include <atomic>
17
#include <functional>
18
19
#include "yb/rocksdb/port/likely.h"
20
21
namespace rocksdb {
22
23
// Counts the total memory of the registered write_buffers, and notifies the
24
// callback if the limit is exceeded.
25
class MemoryMonitor {
26
 public:
27
  explicit MemoryMonitor(size_t limit, std::function<void()> exceeded_callback)
28
17.2k
    : limit_(limit), exceeded_callback_(std::move(exceeded_callback)) {}
29
30
243
  ~MemoryMonitor() {}
31
32
1.11k
  size_t memory_usage() const {
33
1.11k
    return memory_used_.load(std::memory_order_relaxed);
34
1.11k
  }
35
36
723M
  size_t limit() const { return limit_; }
37
38
1.11k
  bool Exceeded() const {
39
1.11k
    return Exceeded(memory_usage());
40
1.11k
  }
41
42
360M
  void ReservedMem(size_t mem) {
43
360M
    auto new_value = memory_used_.fetch_add(mem, std::memory_order_release) + mem;
44
360M
    if (UNLIKELY(Exceeded(new_value))) {
45
228k
      exceeded_callback_();
46
228k
    }
47
360M
  }
48
49
385k
  void FreedMem(size_t mem) {
50
385k
    memory_used_.fetch_sub(mem, std::memory_order_relaxed);
51
385k
  }
52
53
  // No copying allowed
54
  MemoryMonitor(const MemoryMonitor&) = delete;
55
  void operator=(const MemoryMonitor&) = delete;
56
57
 private:
58
59
361M
  bool Exceeded(size_t size) const {
60
361M
    return limit() > 0 && 
size >= limit()361M
;
61
361M
  }
62
63
  const size_t limit_;
64
  const std::function<void()> exceeded_callback_;
65
  std::atomic<size_t> memory_used_ {0};
66
67
};
68
69
}  // namespace rocksdb
70
71
#endif // YB_ROCKSDB_MEMORY_MONITOR_H