[Commits] 8400b2c356d: Make Range Locking support IS.rocksdb_trx

revision-id: 8400b2c356d07d91ec49c559d859ab6f4798c789 (fb-prod201801-174-g8400b2c356d) parent(s): 9ae6a29c90a1d6d1c7eaa2e642dd3e876957d0a2 author: Sergei Petrunia committer: Sergei Petrunia timestamp: 2018-12-03 19:47:48 +0300 message: Make Range Locking support IS.rocksdb_trx - Make lock_request functions that accept lock_wait_callback also accept callback_arg argument to pass to the callback (it used to just pass nullptr). - RocksDB update uses that callback to make RocksDB transaction "know" which rowkey it is waiting on. - Don't run rocksdb.i_s_deadlock in range locking mode as it uses SELECT LOCK IN SHARE MODE --- mysql-test/suite/rocksdb/t/i_s_deadlock.test | 4 ++++ rocksdb | 2 +- storage/rocksdb/range_locking/locktree/lock_request.cc | 14 +++++++++----- storage/rocksdb/range_locking/locktree/lock_request.h | 7 +++++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/mysql-test/suite/rocksdb/t/i_s_deadlock.test b/mysql-test/suite/rocksdb/t/i_s_deadlock.test index e0479d6a337..82fa9fc6bbd 100644 --- a/mysql-test/suite/rocksdb/t/i_s_deadlock.test +++ b/mysql-test/suite/rocksdb/t/i_s_deadlock.test @@ -1,5 +1,9 @@ --source include/have_rocksdb.inc +# Uses LOCK IN SHARE MODE and so will hang in range-locking mode. The part that +# doesn't hang is in rocksdb.range_locking_i_s_deadlock.test +--source suite/rocksdb/include/not_range_locking.inc + set @prior_lock_wait_timeout = @@rocksdb_lock_wait_timeout; set @prior_deadlock_detect = @@rocksdb_deadlock_detect; set @prior_max_latest_deadlocks = @@rocksdb_max_latest_deadlocks; diff --git a/rocksdb b/rocksdb index 574dd4e574d..7f29e9512f6 160000 --- a/rocksdb +++ b/rocksdb @@ -1 +1 @@ -Subproject commit 574dd4e574d60263db9d37faede89057caefafca +Subproject commit 7f29e9512f6bd7a12d8a8d3a493eaff586c5f28b diff --git a/storage/rocksdb/range_locking/locktree/lock_request.cc b/storage/rocksdb/range_locking/locktree/lock_request.cc index 2e20bcf5249..307c57d9aac 100644 --- a/storage/rocksdb/range_locking/locktree/lock_request.cc +++ b/storage/rocksdb/range_locking/locktree/lock_request.cc @@ -202,7 +202,8 @@ int lock_request::wait(uint64_t wait_time_ms) { } int lock_request::wait(uint64_t wait_time_ms, uint64_t killed_time_ms, int (*killed_callback)(void), - void (*lock_wait_callback)(void *, TXNID, TXNID)) { + void (*lock_wait_callback)(void *, TXNID, TXNID), + void *callback_arg) { uint64_t t_now = toku_current_time_microsec(); uint64_t t_start = t_now; uint64_t t_end = t_start + wait_time_ms * 1000; @@ -215,7 +216,8 @@ int lock_request::wait(uint64_t wait_time_ms, uint64_t killed_time_ms, int (*kil conflicts_collector.init(); retry(&conflicts_collector); if (m_state == state::PENDING) { - report_waits(&conflicts_collector, lock_wait_callback); + report_waits(&conflicts_collector, lock_wait_callback, + callback_arg); } conflicts_collector.deinit(); } @@ -330,6 +332,7 @@ int lock_request::retry(GrowableArray<TXNID> *conflicts_collector) { void lock_request::retry_all_lock_requests( locktree *lt, void (*lock_wait_callback)(void *, TXNID, TXNID), + void *callback_arg, void (*after_retry_all_test_callback)(void)) { lt_lock_request_info *info = lt->get_lock_request_info(); @@ -372,7 +375,7 @@ void lock_request::retry_all_lock_requests( } toku_mutex_unlock(&info->retry_mutex); - report_waits(&conflicts_collector, lock_wait_callback); + report_waits(&conflicts_collector, lock_wait_callback, callback_arg); conflicts_collector.deinit(); } @@ -409,14 +412,15 @@ void lock_request::add_conflicts_to_waits(txnid_set *conflicts, } void lock_request::report_waits(GrowableArray<TXNID> *wait_conflicts, - void (*lock_wait_callback)(void *, TXNID, TXNID)) { + void (*lock_wait_callback)(void *, TXNID, TXNID), + void *callback_arg) { if (!lock_wait_callback) return; size_t num_conflicts = wait_conflicts->get_size(); for (size_t i = 0; i < num_conflicts; i += 2) { TXNID blocked_txnid = wait_conflicts->fetch_unchecked(i); TXNID blocking_txnid = wait_conflicts->fetch_unchecked(i+1); - (*lock_wait_callback)(nullptr, blocked_txnid, blocking_txnid); + (*lock_wait_callback)(callback_arg, blocked_txnid, blocking_txnid); } } diff --git a/storage/rocksdb/range_locking/locktree/lock_request.h b/storage/rocksdb/range_locking/locktree/lock_request.h index 9e82b31541e..4fe88e9162f 100644 --- a/storage/rocksdb/range_locking/locktree/lock_request.h +++ b/storage/rocksdb/range_locking/locktree/lock_request.h @@ -90,7 +90,8 @@ public: // or simply DB_LOCK_NOTGRANTED if the wait time expired. int wait(uint64_t wait_time_ms); int wait(uint64_t wait_time_ms, uint64_t killed_time_ms, int (*killed_callback)(void), - void (*lock_wait_callback)(void *, TXNID, TXNID) = nullptr); + void (*lock_wait_callback)(void *, TXNID, TXNID) = nullptr, + void *callback_arg= nullptr); // return: left end-point of the lock range const DBT *get_left_key(void) const; @@ -114,6 +115,7 @@ public: static void retry_all_lock_requests( locktree *lt, void (*lock_wait_callback)(void *, TXNID, TXNID) = nullptr, + void *callback_arg= nullptr, void (*after_retry_test_callback)(void) = nullptr); static void retry_all_lock_requests_info(lt_lock_request_info *info, GrowableArray<TXNID> *collector); @@ -202,7 +204,8 @@ public: // Report list of conflicts to lock wait callback. static void report_waits(GrowableArray<TXNID> *wait_conflicts, - void (*lock_wait_callback)(void *, TXNID, TXNID)); + void (*lock_wait_callback)(void *, TXNID, TXNID), + void *callback_arg); void add_conflicts_to_waits(txnid_set *conflicts, GrowableArray<TXNID> *wait_conflicts); void (*m_start_test_callback)(void);
participants (1)
-
Sergei Petrunia