Reduce copies of LockInfo (#5172)

Summary:
The LockInfo struct is not easy to copy because it contains std::vector. Reduce copies by using move constructor and `unordered_map::emplace`.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5172

Differential Revision: D14882053

Pulled By: lth

fbshipit-source-id: 93999ec6ab1a5841fb5115abb764b6c1831a6de1
main
Manuel Ung 5 years ago committed by Facebook Github Bot
parent 313e877285
commit ef0fc1b461
  1. 2
      utilities/transactions/transaction_base.cc
  2. 12
      utilities/transactions/transaction_lock_mgr.cc
  3. 4
      utilities/transactions/transaction_lock_mgr.h

@ -587,7 +587,7 @@ void TransactionBaseImpl::TrackKey(TransactionKeyMap* key_map, uint32_t cfh_id,
auto& cf_key_map = (*key_map)[cfh_id]; auto& cf_key_map = (*key_map)[cfh_id];
auto iter = cf_key_map.find(key); auto iter = cf_key_map.find(key);
if (iter == cf_key_map.end()) { if (iter == cf_key_map.end()) {
auto result = cf_key_map.insert({key, TransactionKeyMapInfo(seq)}); auto result = cf_key_map.emplace(key, TransactionKeyMapInfo(seq));
iter = result.first; iter = result.first;
} else if (seq < iter->second.seq) { } else if (seq < iter->second.seq) {
// Now tracking this key with an earlier sequence number // Now tracking this key with an earlier sequence number

@ -311,14 +311,14 @@ Status TransactionLockMgr::TryLock(PessimisticTransaction* txn,
int64_t timeout = txn->GetLockTimeout(); int64_t timeout = txn->GetLockTimeout();
return AcquireWithTimeout(txn, lock_map, stripe, column_family_id, key, env, return AcquireWithTimeout(txn, lock_map, stripe, column_family_id, key, env,
timeout, lock_info); timeout, std::move(lock_info));
} }
// Helper function for TryLock(). // Helper function for TryLock().
Status TransactionLockMgr::AcquireWithTimeout( Status TransactionLockMgr::AcquireWithTimeout(
PessimisticTransaction* txn, LockMap* lock_map, LockMapStripe* stripe, PessimisticTransaction* txn, LockMap* lock_map, LockMapStripe* stripe,
uint32_t column_family_id, const std::string& key, Env* env, uint32_t column_family_id, const std::string& key, Env* env,
int64_t timeout, const LockInfo& lock_info) { int64_t timeout, LockInfo&& lock_info) {
Status result; Status result;
uint64_t end_time = 0; uint64_t end_time = 0;
@ -342,7 +342,7 @@ Status TransactionLockMgr::AcquireWithTimeout(
// Acquire lock if we are able to // Acquire lock if we are able to
uint64_t expire_time_hint = 0; uint64_t expire_time_hint = 0;
autovector<TransactionID> wait_ids; autovector<TransactionID> wait_ids;
result = AcquireLocked(lock_map, stripe, key, env, lock_info, result = AcquireLocked(lock_map, stripe, key, env, std::move(lock_info),
&expire_time_hint, &wait_ids); &expire_time_hint, &wait_ids);
if (!result.ok() && timeout != 0) { if (!result.ok() && timeout != 0) {
@ -407,7 +407,7 @@ Status TransactionLockMgr::AcquireWithTimeout(
} }
if (result.ok() || result.IsTimedOut()) { if (result.ok() || result.IsTimedOut()) {
result = AcquireLocked(lock_map, stripe, key, env, lock_info, result = AcquireLocked(lock_map, stripe, key, env, std::move(lock_info),
&expire_time_hint, &wait_ids); &expire_time_hint, &wait_ids);
} }
} while (!result.ok() && !timed_out); } while (!result.ok() && !timed_out);
@ -526,7 +526,7 @@ bool TransactionLockMgr::IncrementWaiters(
Status TransactionLockMgr::AcquireLocked(LockMap* lock_map, Status TransactionLockMgr::AcquireLocked(LockMap* lock_map,
LockMapStripe* stripe, LockMapStripe* stripe,
const std::string& key, Env* env, const std::string& key, Env* env,
const LockInfo& txn_lock_info, LockInfo&& txn_lock_info,
uint64_t* expire_time, uint64_t* expire_time,
autovector<TransactionID>* txn_ids) { autovector<TransactionID>* txn_ids) {
assert(txn_lock_info.txn_ids.size() == 1); assert(txn_lock_info.txn_ids.size() == 1);
@ -578,7 +578,7 @@ Status TransactionLockMgr::AcquireLocked(LockMap* lock_map,
result = Status::Busy(Status::SubCode::kLockLimit); result = Status::Busy(Status::SubCode::kLockLimit);
} else { } else {
// acquire lock // acquire lock
stripe->keys.insert({key, txn_lock_info}); stripe->keys.emplace(key, std::move(txn_lock_info));
// Maintain lock count if there is a limit on the number of locks // Maintain lock count if there is a limit on the number of locks
if (max_num_locks_) { if (max_num_locks_) {

@ -130,11 +130,11 @@ class TransactionLockMgr {
Status AcquireWithTimeout(PessimisticTransaction* txn, LockMap* lock_map, Status AcquireWithTimeout(PessimisticTransaction* txn, LockMap* lock_map,
LockMapStripe* stripe, uint32_t column_family_id, LockMapStripe* stripe, uint32_t column_family_id,
const std::string& key, Env* env, int64_t timeout, const std::string& key, Env* env, int64_t timeout,
const LockInfo& lock_info); LockInfo&& lock_info);
Status AcquireLocked(LockMap* lock_map, LockMapStripe* stripe, Status AcquireLocked(LockMap* lock_map, LockMapStripe* stripe,
const std::string& key, Env* env, const std::string& key, Env* env,
const LockInfo& lock_info, uint64_t* wait_time, LockInfo&& lock_info, uint64_t* wait_time,
autovector<TransactionID>* txn_ids); autovector<TransactionID>* txn_ids);
void UnLockKey(const PessimisticTransaction* txn, const std::string& key, void UnLockKey(const PessimisticTransaction* txn, const std::string& key,

Loading…
Cancel
Save