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:
agiardullo 2015-09-29 17:00:16 -07:00
parent 1e73b11af7
commit 5a51fa907b
2 changed files with 19 additions and 11 deletions

View File

@ -77,7 +77,7 @@ Status TransactionBaseImpl::RollbackToSavePoint() {
assert(s.ok());
// Rollback any keys that were tracked since the last savepoint
auto key_map = GetTrackedKeysSinceSavePoint();
const TransactionKeyMap* key_map = GetTrackedKeysSinceSavePoint();
assert(key_map);
for (auto& key_map_iter : *key_map) {
uint32_t column_family_id = key_map_iter.first;

View File

@ -126,7 +126,7 @@ void TransactionImpl::Rollback() { Clear(); }
Status TransactionImpl::RollbackToSavePoint() {
// Unlock any keys locked since last transaction
auto keys = GetTrackedKeysSinceSavePoint();
const TransactionKeyMap* keys = GetTrackedKeysSinceSavePoint();
if (keys) {
txn_db_impl_->UnLock(this, keys);
}
@ -227,19 +227,27 @@ Status TransactionImpl::TryLock(ColumnFamilyHandle* column_family,
// TODO(agiardullo): could optimize by supporting shared txn locks in the
// future
bool check_snapshot = !untracked;
// lock this key if this transactions hasn't already locked it
SequenceNumber tracked_seqno = kMaxSequenceNumber;
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);
// 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
if (!previously_locked) {
s = txn_db_impl_->TryLock(this, cfh_id, key_str);
}
if (s.ok()) {
// If a snapshot is set, we need to make sure the key hasn't been modified