/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 |