YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/common/transaction.cc
Line
Count
Source (jump to first uncovered line)
1
//
2
// Copyright (c) YugaByte, Inc.
3
//
4
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
// in compliance with the License.  You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software distributed under the License
10
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
// or implied.  See the License for the specific language governing permissions and limitations
12
// under the License.
13
//
14
//
15
#include "yb/common/transaction.h"
16
17
#include "yb/common/common.pb.h"
18
19
#include "yb/util/result.h"
20
#include "yb/util/tsan_util.h"
21
22
using namespace std::literals;
23
24
DEFINE_int64(transaction_rpc_timeout_ms, 5000 * yb::kTimeMultiplier,
25
             "Timeout used by transaction related RPCs in milliseconds.");
26
27
namespace yb {
28
29
YB_STRONGLY_TYPED_UUID_IMPL(TransactionId);
30
31
const char* kGlobalTransactionsTableName = "transactions";
32
const std::string kMetricsSnapshotsTableName = "metrics";
33
const std::string kTransactionTablePrefix = "transactions_";
34
35
TransactionStatusResult::TransactionStatusResult(TransactionStatus status_, HybridTime status_time_)
36
1.25M
    : TransactionStatusResult(status_, status_time_, AbortedSubTransactionSet()) {}
Unexecuted instantiation: _ZN2yb23TransactionStatusResultC2ENS_17TransactionStatusENS_10HybridTimeE
_ZN2yb23TransactionStatusResultC1ENS_17TransactionStatusENS_10HybridTimeE
Line
Count
Source
36
1.25M
    : TransactionStatusResult(status_, status_time_, AbortedSubTransactionSet()) {}
37
38
TransactionStatusResult::TransactionStatusResult(
39
    TransactionStatus status_, HybridTime status_time_,
40
    AbortedSubTransactionSet aborted_subtxn_set_)
41
1.32M
    : status(status_), status_time(status_time_), aborted_subtxn_set(aborted_subtxn_set_) {
42
18.4E
  DCHECK(status == TransactionStatus::ABORTED || status_time.is_valid())
43
18.4E
      << "Status: " << status << ", status_time: " << status_time;
44
1.32M
}
45
46
1.49M
Result<TransactionMetadata> TransactionMetadata::FromPB(const TransactionMetadataPB& source) {
47
1.49M
  TransactionMetadata result;
48
1.49M
  auto id = FullyDecodeTransactionId(source.transaction_id());
49
1.49M
  RETURN_NOT_OK(id);
50
1.49M
  result.transaction_id = *id;
51
1.49M
  if (source.has_isolation()) {
52
1.48M
    result.isolation = source.isolation();
53
1.48M
    result.status_tablet = source.status_tablet();
54
1.48M
    result.priority = source.priority();
55
1.48M
    result.start_time = HybridTime(source.start_hybrid_time());
56
1.48M
  }
57
58
1.49M
  if (source.has_locality()) {
59
1.48M
    result.locality = source.locality();
60
4.67k
  } else {
61
4.67k
    result.locality = TransactionLocality::GLOBAL;
62
4.67k
  }
63
64
1.49M
  return result;
65
1.49M
}
66
67
637k
void TransactionMetadata::ToPB(TransactionMetadataPB* dest) const {
68
637k
  if (isolation != IsolationLevel::NON_TRANSACTIONAL) {
69
637k
    ForceToPB(dest);
70
18.4E
  } else {
71
18.4E
    TransactionIdToPB(dest);
72
18.4E
  }
73
637k
}
74
75
865k
void TransactionMetadata::TransactionIdToPB(TransactionMetadataPB* dest) const {
76
865k
  dest->set_transaction_id(transaction_id.data(), transaction_id.size());
77
865k
}
78
79
637k
void TransactionMetadata::ForceToPB(TransactionMetadataPB* dest) const {
80
637k
  TransactionIdToPB(dest);
81
637k
  dest->set_isolation(isolation);
82
637k
  dest->set_status_tablet(status_tablet);
83
637k
  dest->set_priority(priority);
84
637k
  dest->set_start_hybrid_time(start_time.ToUint64());
85
637k
  dest->set_locality(locality);
86
637k
}
87
88
0
bool operator==(const TransactionMetadata& lhs, const TransactionMetadata& rhs) {
89
0
  return lhs.transaction_id == rhs.transaction_id &&
90
0
         lhs.isolation == rhs.isolation &&
91
0
         lhs.status_tablet == rhs.status_tablet &&
92
0
         lhs.priority == rhs.priority &&
93
0
         lhs.start_time == rhs.start_time &&
94
0
         lhs.locality == rhs.locality;
95
0
}
96
97
1.49k
std::ostream& operator<<(std::ostream& out, const TransactionMetadata& metadata) {
98
1.49k
  return out << metadata.ToString();
99
1.49k
}
100
101
63.4k
void SubTransactionMetadata::ToPB(SubTransactionMetadataPB* dest) const {
102
63.4k
  dest->set_subtransaction_id(subtransaction_id);
103
63.4k
  aborted.ToPB(dest->mutable_aborted()->mutable_set());
104
63.4k
}
105
106
Result<SubTransactionMetadata> SubTransactionMetadata::FromPB(
107
2.10M
    const SubTransactionMetadataPB& source) {
108
2.10M
  return SubTransactionMetadata {
109
2.10M
    .subtransaction_id = source.has_subtransaction_id()
110
64.1k
        ? source.subtransaction_id()
111
2.04M
        : kMinSubTransactionId,
112
2.10M
    .aborted = VERIFY_RESULT(AbortedSubTransactionSet::FromPB(source.aborted().set())),
113
2.10M
  };
114
2.10M
}
115
116
63.4k
bool SubTransactionMetadata::IsDefaultState() const {
117
63.4k
  DCHECK(subtransaction_id >= kMinSubTransactionId);
118
63.4k
  return subtransaction_id == kMinSubTransactionId && aborted.IsEmpty();
119
63.4k
}
120
121
0
std::ostream& operator<<(std::ostream& out, const SubTransactionMetadata& metadata) {
122
0
  return out << metadata.ToString();
123
0
}
124
125
1.49M
MonoDelta TransactionRpcTimeout() {
126
1.49M
  return FLAGS_transaction_rpc_timeout_ms * 1ms * kTimeMultiplier;
127
1.49M
}
128
129
// TODO(dtxn) correct deadline should be calculated and propagated.
130
1.25M
CoarseTimePoint TransactionRpcDeadline() {
131
1.25M
  return CoarseMonoClock::Now() + TransactionRpcTimeout();
132
1.25M
}
133
134
TransactionOperationContext::TransactionOperationContext()
135
5.38M
    : transaction_id(TransactionId::Nil()), txn_status_manager(nullptr) {}
136
137
TransactionOperationContext::TransactionOperationContext(
138
    const TransactionId& transaction_id_, TransactionStatusManager* txn_status_manager_)
139
    : transaction_id(transaction_id_),
140
129k
      txn_status_manager(DCHECK_NOTNULL(txn_status_manager_)) {}
141
142
TransactionOperationContext::TransactionOperationContext(
143
    const TransactionId& transaction_id_,
144
    SubTransactionMetadata&& subtransaction_,
145
    TransactionStatusManager* txn_status_manager_)
146
    : transaction_id(transaction_id_),
147
      subtransaction(std::move(subtransaction_)),
148
2.10M
      txn_status_manager(DCHECK_NOTNULL(txn_status_manager_)) {}
149
150
0
bool TransactionOperationContext::transactional() const {
151
0
  return !transaction_id.IsNil();
152
0
}
153
154
} // namespace yb