Fix accidental object copy in transactions
Summary: Should have used auto& instead of auto. Also needed to change the code a bit due to const correctness. Test Plan: unit tests Reviewers: sdong, igor, yoshinorim, yhchiang Reviewed By: yhchiang Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D47787
This commit is contained in:
parent
1e73b11af7
commit
5a51fa907b
@ -77,7 +77,7 @@ Status TransactionBaseImpl::RollbackToSavePoint() {
|
|||||||
assert(s.ok());
|
assert(s.ok());
|
||||||
|
|
||||||
// Rollback any keys that were tracked since the last savepoint
|
// Rollback any keys that were tracked since the last savepoint
|
||||||
auto key_map = GetTrackedKeysSinceSavePoint();
|
const TransactionKeyMap* key_map = GetTrackedKeysSinceSavePoint();
|
||||||
assert(key_map);
|
assert(key_map);
|
||||||
for (auto& key_map_iter : *key_map) {
|
for (auto& key_map_iter : *key_map) {
|
||||||
uint32_t column_family_id = key_map_iter.first;
|
uint32_t column_family_id = key_map_iter.first;
|
||||||
|
@ -126,7 +126,7 @@ void TransactionImpl::Rollback() { Clear(); }
|
|||||||
|
|
||||||
Status TransactionImpl::RollbackToSavePoint() {
|
Status TransactionImpl::RollbackToSavePoint() {
|
||||||
// Unlock any keys locked since last transaction
|
// Unlock any keys locked since last transaction
|
||||||
auto keys = GetTrackedKeysSinceSavePoint();
|
const TransactionKeyMap* keys = GetTrackedKeysSinceSavePoint();
|
||||||
if (keys) {
|
if (keys) {
|
||||||
txn_db_impl_->UnLock(this, keys);
|
txn_db_impl_->UnLock(this, keys);
|
||||||
}
|
}
|
||||||
@ -227,18 +227,26 @@ Status TransactionImpl::TryLock(ColumnFamilyHandle* column_family,
|
|||||||
// TODO(agiardullo): could optimize by supporting shared txn locks in the
|
// TODO(agiardullo): could optimize by supporting shared txn locks in the
|
||||||
// future
|
// future
|
||||||
bool check_snapshot = !untracked;
|
bool check_snapshot = !untracked;
|
||||||
|
SequenceNumber tracked_seqno = kMaxSequenceNumber;
|
||||||
|
|
||||||
|
// Lookup whether this key has already been locked by this transaction
|
||||||
|
const auto& tracked_keys = GetTrackedKeys();
|
||||||
|
const auto tracked_keys_cf = tracked_keys.find(cfh_id);
|
||||||
|
if (tracked_keys_cf == tracked_keys.end()) {
|
||||||
|
previously_locked = false;
|
||||||
|
} else {
|
||||||
|
auto iter = tracked_keys_cf->second.find(key_str);
|
||||||
|
if (iter == tracked_keys_cf->second.end()) {
|
||||||
|
previously_locked = false;
|
||||||
|
} else {
|
||||||
|
previously_locked = true;
|
||||||
|
tracked_seqno = iter->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// lock this key if this transactions hasn't already locked it
|
// lock this key if this transactions hasn't already locked it
|
||||||
SequenceNumber tracked_seqno = kMaxSequenceNumber;
|
if (!previously_locked) {
|
||||||
auto tracked_keys = GetTrackedKeys();
|
|
||||||
auto iter = tracked_keys[cfh_id].find(key_str);
|
|
||||||
if (iter == tracked_keys[cfh_id].end()) {
|
|
||||||
previously_locked = false;
|
|
||||||
|
|
||||||
s = txn_db_impl_->TryLock(this, cfh_id, key_str);
|
s = txn_db_impl_->TryLock(this, cfh_id, key_str);
|
||||||
} else {
|
|
||||||
previously_locked = true;
|
|
||||||
tracked_seqno = iter->second;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user