Coverage Report

Created: 2026-09-28 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rocksdb/db/logs_with_prep_tracker.h
Line
Count
Source
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
//
6
#pragma once
7
8
#include <cassert>
9
#include <cstdint>
10
#include <cstdlib>
11
#include <mutex>
12
#include <unordered_map>
13
#include <vector>
14
15
#include "rocksdb/rocksdb_namespace.h"
16
17
namespace ROCKSDB_NAMESPACE {
18
19
// This class is used to track the log files with outstanding prepare entries.
20
class LogsWithPrepTracker {
21
 public:
22
  // Called when a transaction prepared in `log` has been committed or aborted.
23
  void MarkLogAsHavingPrepSectionFlushed(uint64_t log);
24
  // Called when a transaction is prepared in `log`.
25
  void MarkLogAsContainingPrepSection(uint64_t log);
26
  // Return the earliest log file with outstanding prepare entries.
27
  uint64_t FindMinLogContainingOutstandingPrep();
28
0
  size_t TEST_PreparedSectionCompletedSize() {
29
0
    return prepared_section_completed_.size();
30
0
  }
31
0
  size_t TEST_LogsWithPrepSize() { return logs_with_prep_.size(); }
32
33
 private:
34
  // REQUIRES: logs_with_prep_mutex_ held
35
  //
36
  // sorted list of log numbers still containing prepared data.
37
  // this is used by FindObsoleteFiles to determine which
38
  // flushed logs we must keep around because they still
39
  // contain prepared data which has not been committed or rolled back
40
  struct LogCnt {
41
    uint64_t log;  // the log number
42
    uint64_t cnt;  // number of prepared sections in the log
43
  };
44
  std::vector<LogCnt> logs_with_prep_;
45
  std::mutex logs_with_prep_mutex_;
46
47
  // REQUIRES: prepared_section_completed_mutex_ held
48
  //
49
  // to be used in conjunction with logs_with_prep_.
50
  // once a transaction with data in log L is committed or rolled back
51
  // rather than updating logs_with_prep_ directly we keep track of that
52
  // in prepared_section_completed_ which maps LOG -> instance_count. This helps
53
  // avoiding contention between a commit thread and the prepare threads.
54
  //
55
  // when trying to determine the minimum log still active we first
56
  // consult logs_with_prep_. while that root value maps to
57
  // an equal value in prepared_section_completed_ we erase the log from
58
  // both logs_with_prep_ and prepared_section_completed_.
59
  std::unordered_map<uint64_t, uint64_t> prepared_section_completed_;
60
  std::mutex prepared_section_completed_mutex_;
61
};
62
}  // namespace ROCKSDB_NAMESPACE