YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/common/read_hybrid_time.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_COMMON_READ_HYBRID_TIME_H
15
#define YB_COMMON_READ_HYBRID_TIME_H
16
17
#include <functional>
18
19
#include "yb/common/clock.h"
20
#include "yb/common/hybrid_time.h"
21
22
#include "yb/util/compare_util.h"
23
#include "yb/util/tostring.h"
24
25
namespace yb {
26
27
// Hybrid time range used for read.
28
// Limit is the maximum time that could have existed on any server at the time the read operation
29
// was initiated, and is used to decide whether the read operation need to be restarted at a higher
30
// hybrid time than `read`.
31
struct ReadHybridTime {
32
  // Hybrid time of read operation.
33
  HybridTime read;
34
35
  // Read time limit, that is used for local records of requested tablet.
36
  HybridTime local_limit;
37
38
  // Read time limit, that is used for global entries, for instance transactions.
39
  HybridTime global_limit;
40
41
  // Read time limit for intents from the same transaction.
42
  HybridTime in_txn_limit;
43
44
  // Serial no of request that uses this read hybrid time.
45
  int64_t serial_no = 0;
46
47
26.7k
  static ReadHybridTime Max() {
48
26.7k
    return SingleTime(HybridTime::kMax);
49
26.7k
  }
50
51
1.56M
  static ReadHybridTime SingleTime(HybridTime value) {
52
1.56M
    return {value, value, value, HybridTime::kMax, 0};
53
1.56M
  }
54
55
0
  static ReadHybridTime FromMicros(MicrosTime micros) {
56
0
    return SingleTime(HybridTime::FromMicros(micros));
57
0
  }
58
59
263
  static ReadHybridTime FromUint64(uint64_t value) {
60
263
    return SingleTime(HybridTime(value));
61
263
  }
62
63
5.31M
  static ReadHybridTime FromHybridTimeRange(const HybridTimeRange& range) {
64
5.31M
    return {range.first, range.second, range.second, HybridTime::kMax, 0};
65
5.31M
  }
66
67
  template <class PB>
68
6.30M
  static ReadHybridTime FromReadTimePB(const PB& pb) {
69
6.30M
    if (!pb.has_read_time()) {
70
5.35M
      return ReadHybridTime();
71
5.35M
    }
72
954k
    return FromPB(pb.read_time());
73
954k
  }
_ZN2yb14ReadHybridTime14FromReadTimePBINS_15QLPagingStatePBEEES0_RKT_
Line
Count
Source
68
281
  static ReadHybridTime FromReadTimePB(const PB& pb) {
69
281
    if (!pb.has_read_time()) {
70
5
      return ReadHybridTime();
71
5
    }
72
276
    return FromPB(pb.read_time());
73
276
  }
_ZN2yb14ReadHybridTime14FromReadTimePBINS_7tserver14WriteRequestPBEEES0_RKT_
Line
Count
Source
68
1.60M
  static ReadHybridTime FromReadTimePB(const PB& pb) {
69
1.60M
    if (!pb.has_read_time()) {
70
1.25M
      return ReadHybridTime();
71
1.25M
    }
72
354k
    return FromPB(pb.read_time());
73
354k
  }
_ZN2yb14ReadHybridTime14FromReadTimePBINS_7tserver13ReadRequestPBEEES0_RKT_
Line
Count
Source
68
4.68M
  static ReadHybridTime FromReadTimePB(const PB& pb) {
69
4.68M
    if (!pb.has_read_time()) {
70
4.10M
      return ReadHybridTime();
71
4.10M
    }
72
584k
    return FromPB(pb.read_time());
73
584k
  }
_ZN2yb14ReadHybridTime14FromReadTimePBINS_22ChildTransactionDataPBEEES0_RKT_
Line
Count
Source
68
14.6k
  static ReadHybridTime FromReadTimePB(const PB& pb) {
69
14.6k
    if (!pb.has_read_time()) {
70
0
      return ReadHybridTime();
71
0
    }
72
14.6k
    return FromPB(pb.read_time());
73
14.6k
  }
74
75
  template <class PB>
76
5.88M
  static ReadHybridTime FromRestartReadTimePB(const PB& pb) {
77
5.88M
    if (!pb.has_restart_read_time()) {
78
5.87M
      return ReadHybridTime();
79
5.87M
    }
80
1.94k
    return FromPB(pb.restart_read_time());
81
1.94k
  }
_ZN2yb14ReadHybridTime21FromRestartReadTimePBINS_7tserver15WriteResponsePBEEES0_RKT_
Line
Count
Source
76
1.24M
  static ReadHybridTime FromRestartReadTimePB(const PB& pb) {
77
1.24M
    if (!pb.has_restart_read_time()) {
78
1.24M
      return ReadHybridTime();
79
1.24M
    }
80
502
    return FromPB(pb.restart_read_time());
81
502
  }
_ZN2yb14ReadHybridTime21FromRestartReadTimePBINS_7tserver14ReadResponsePBEEES0_RKT_
Line
Count
Source
76
4.63M
  static ReadHybridTime FromRestartReadTimePB(const PB& pb) {
77
4.63M
    if (!pb.has_restart_read_time()) {
78
4.63M
      return ReadHybridTime();
79
4.63M
    }
80
1.44k
    return FromPB(pb.restart_read_time());
81
1.44k
  }
82
83
  template <class PB>
84
6.30M
  static ReadHybridTime FromPB(const PB& read_time) {
85
6.30M
    return {
86
6.30M
      .read = HybridTime(read_time.read_ht()),
87
6.30M
      .local_limit = HybridTime(read_time.has_local_limit_ht()
88
6.27M
          ? read_time.local_limit_ht()
89
23.7k
          : read_time.deprecated_max_of_read_time_and_local_limit_ht()),
90
6.30M
      .global_limit = HybridTime(read_time.global_limit_ht()),
91
      // Use max hybrid time for backward compatibility.
92
6.30M
      .in_txn_limit = read_time.in_txn_limit_ht()
93
6.28M
          ? HybridTime(read_time.in_txn_limit_ht())
94
18.5k
          : HybridTime::kMax,
95
6.30M
      .serial_no = 0,
96
6.30M
    };
97
6.30M
  }
98
99
  template <class PB>
100
5.44M
  void ToPB(PB* out) const {
101
5.44M
    out->set_read_ht(read.ToUint64());
102
5.44M
    out->set_local_limit_ht(local_limit.ToUint64());
103
5.44M
    out->set_global_limit_ht(global_limit.ToUint64());
104
5.44M
    out->set_in_txn_limit_ht(
105
4.05M
        in_txn_limit.is_valid() ? in_txn_limit.ToUint64() : HybridTime::kMax.ToUint64());
106
5.44M
    out->set_deprecated_max_of_read_time_and_local_limit_ht(std::max(local_limit, read).ToUint64());
107
5.44M
  }
108
109
  template <class PB>
110
1.07M
  void AddToPB(PB* pb) const {
111
1.07M
    if (read.is_valid()) {
112
1.07M
      ToPB(pb->mutable_read_time());
113
162
    } else {
114
162
      pb->clear_read_time();
115
162
    }
116
1.07M
  }
_ZNK2yb14ReadHybridTime7AddToPBINS_7tserver13ReadRequestPBEEEvPT_
Line
Count
Source
110
580k
  void AddToPB(PB* pb) const {
111
580k
    if (read.is_valid()) {
112
580k
      ToPB(pb->mutable_read_time());
113
20
    } else {
114
20
      pb->clear_read_time();
115
20
    }
116
580k
  }
_ZNK2yb14ReadHybridTime7AddToPBINS_7tserver14WriteRequestPBEEEvPT_
Line
Count
Source
110
356k
  void AddToPB(PB* pb) const {
111
356k
    if (read.is_valid()) {
112
356k
      ToPB(pb->mutable_read_time());
113
4
    } else {
114
4
      pb->clear_read_time();
115
4
    }
116
356k
  }
_ZNK2yb14ReadHybridTime7AddToPBINS_22ChildTransactionDataPBEEEvPT_
Line
Count
Source
110
82.5k
  void AddToPB(PB* pb) const {
111
82.5k
    if (read.is_valid()) {
112
82.3k
      ToPB(pb->mutable_read_time());
113
138
    } else {
114
138
      pb->clear_read_time();
115
138
    }
116
82.5k
  }
_ZNK2yb14ReadHybridTime7AddToPBINS_15QLPagingStatePBEEEvPT_
Line
Count
Source
110
2.82k
  void AddToPB(PB* pb) const {
111
2.82k
    if (read.is_valid()) {
112
2.82k
      ToPB(pb->mutable_read_time());
113
0
    } else {
114
0
      pb->clear_read_time();
115
0
    }
116
2.82k
  }
_ZNK2yb14ReadHybridTime7AddToPBINS_18PgsqlPagingStatePBEEEvPT_
Line
Count
Source
110
23.7k
  void AddToPB(PB* pb) const {
111
23.7k
    if (read.is_valid()) {
112
23.7k
      ToPB(pb->mutable_read_time());
113
0
    } else {
114
0
      pb->clear_read_time();
115
0
    }
116
23.7k
  }
_ZNK2yb14ReadHybridTime7AddToPBINS_7tserver18PgPerformOptionsPBEEEvPT_
Line
Count
Source
110
24.8k
  void AddToPB(PB* pb) const {
111
24.8k
    if (read.is_valid()) {
112
24.8k
      ToPB(pb->mutable_read_time());
113
0
    } else {
114
0
      pb->clear_read_time();
115
0
    }
116
24.8k
  }
117
118
28.3M
  explicit operator bool() const {
119
28.3M
    return read.is_valid();
120
28.3M
  }
121
122
21.5M
  bool operator!() const {
123
21.5M
    return !read.is_valid();
124
21.5M
  }
125
126
#define YB_READ_HYBRID_TIME_FIELDS read, local_limit, global_limit, in_txn_limit, serial_no
127
128
43
  std::string ToString() const {
129
43
    return YB_STRUCT_TO_STRING(YB_READ_HYBRID_TIME_FIELDS);
130
43
  }
131
};
132
133
1
inline std::ostream& operator<<(std::ostream& out, const ReadHybridTime& read_time) {
134
1
  return out << read_time.ToString();
135
1
}
136
137
4.06M
inline bool operator==(const ReadHybridTime& lhs, const ReadHybridTime& rhs) {
138
4.06M
  return YB_STRUCT_EQUALS(YB_READ_HYBRID_TIME_FIELDS);
139
4.06M
}
140
141
} // namespace yb
142
143
#endif // YB_COMMON_READ_HYBRID_TIME_H