Skip to content

Commit b20901e

Browse files
kongfywangzelin19961202
authored andcommitted
fix rowlock double locked problem
1 parent d275ff5 commit b20901e

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

src/storage/memtable/mvcc/ob_mvcc_row.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,6 @@ int ObMvccRow::check_row_locked(
11301130
}
11311131
// locked by other
11321132
if (is_locked && lock_descriptor != ctx.get_ctx_descriptor()) {
1133-
lock_descriptor = row_lock_.get_exclusive_uid();
11341133
int64_t lock_wait_start_ts =
11351134
ctx.get_lock_wait_start_ts() > 0 ? ctx.get_lock_wait_start_ts() : common::ObClockGenerator::getClock();
11361135
int64_t query_abs_lock_wait_timeout = ctx.get_query_abs_lock_wait_timeout(lock_wait_start_ts);

src/storage/memtable/ob_memtable.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1912,15 +1912,18 @@ int ObMemtable::lock_row_on_frozen_stores(const ObStoreCtx& ctx, const ObMemtabl
19121912
ret = OB_ERR_UNEXPECTED;
19131913
TRANS_LOG(ERROR, "stores in context is null", K(ret));
19141914
} else {
1915+
bool locked_by_self = false;
19151916
int64_t max_trans_version = 0;
19161917
const ObIArray<ObITable*>* stores = ctx.tables_;
1918+
ObStoreRowLockState lock_state;
19171919

19181920
// ignore active memtable
19191921
for (int64_t i = stores->count() - 2; OB_SUCC(ret) && i >= 0; i--) {
19201922
int64_t current_version = 0;
19211923
bool is_locked = false;
19221924
uint32_t lock_descriptor = 0;
1923-
ObStoreRowLockState lock_state;
1925+
1926+
lock_state.reset();
19241927

19251928
if (NULL == stores->at(i)) {
19261929
ret = OB_ERR_UNEXPECTED;
@@ -1929,14 +1932,21 @@ int ObMemtable::lock_row_on_frozen_stores(const ObStoreCtx& ctx, const ObMemtabl
19291932
ObMemtable* memtable = static_cast<ObMemtable*>(stores->at(i));
19301933
if (OB_FAIL(memtable->get_mvcc_engine().check_row_locked(
19311934
*ctx.mem_ctx_, key, is_locked, lock_descriptor, current_version))) {
1932-
TRANS_LOG(WARN, "mvcc engine check row lock fail", K(ret), K(is_locked), K(lock_descriptor));
1935+
TRANS_LOG(WARN,
1936+
"mvcc engine check row lock fail, may be locked by other",
1937+
K(ret),
1938+
K(is_locked),
1939+
K(lock_descriptor));
1940+
} else {
1941+
locked_by_self |= is_locked && lock_descriptor == ctx.mem_ctx_->get_ctx_descriptor();
19331942
}
19341943
} else if (stores->at(i)->is_sstable()) {
19351944
ObSSTable* sstable = static_cast<ObSSTable*>(stores->at(i));
19361945
if (OB_FAIL(sstable->check_row_locked(ctx, *key->get_rowkey(), columns, lock_state))) {
19371946
TRANS_LOG(WARN, "failed to check row lock by other", K(ret), K(*key), K(lock_state));
19381947
} else {
19391948
current_version = lock_state.trans_version_;
1949+
locked_by_self |= lock_state.is_locked_ && ctx.trans_id_ == lock_state.lock_trans_id_;
19401950
}
19411951
TRANS_LOG(DEBUG, "check_row_locked meet sstable", K(ret), K(*key), K(*sstable), K(current_version));
19421952
} else {
@@ -1945,16 +1955,27 @@ int ObMemtable::lock_row_on_frozen_stores(const ObStoreCtx& ctx, const ObMemtabl
19451955
}
19461956

19471957
max_trans_version = max(max_trans_version, current_version);
1948-
TRANS_LOG(DEBUG, "check_row_locked", K(i), K(stores->count()), K(stores->at(i)));
1958+
TRANS_LOG(DEBUG,
1959+
"check_row_locked",
1960+
K(i),
1961+
K(stores->count()),
1962+
K(stores->at(i)),
1963+
K(locked_by_self),
1964+
K(current_version),
1965+
K(max_trans_version));
19491966
}
19501967

19511968
if (OB_SUCC(ret)) {
19521969
value->update_max_trans_version(max_trans_version);
1953-
value->set_lower_lock_scaned();
1970+
if (!locked_by_self) {
1971+
// there is no locks on frozen stores
1972+
if (max_trans_version > ctx.mem_ctx_->get_read_snapshot()) {
1973+
ret = OB_TRANSACTION_SET_VIOLATION;
1974+
TRANS_LOG(WARN, "TRANS_SET_VIOLATION", K(ret), K(max_trans_version), "ctx", ctx.mem_ctx_);
1975+
}
19541976

1955-
if (max_trans_version > ctx.mem_ctx_->get_read_snapshot()) {
1956-
ret = OB_TRANSACTION_SET_VIOLATION;
1957-
TRANS_LOG(WARN, "TRANS_SET_VIOLATION", K(ret), K(max_trans_version), "ctx", ctx.mem_ctx_);
1977+
value->set_lower_lock_scaned();
1978+
TRANS_LOG(DEBUG, "lower lock check finish", K(*value), K(*stores));
19581979
}
19591980
}
19601981
}

src/storage/ob_sstable.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3033,9 +3033,10 @@ int ObSSTable::check_row_locked(const ObStoreCtx& ctx, const common::ObStoreRowk
30333033
STORAGE_LOG(WARN, "failed to open getter, ", K(ret), K(iter_param), K(access_context), K(ext_rowkey));
30343034
} else if (OB_SUCC(row_iterator->get_next_row(store_row))) {
30353035
lock_state.trans_version_ = store_row->snapshot_version_;
3036-
lock_state.is_locked_ = ((ObSSTableRowLockChecker*)row_iterator)->is_curr_row_locked();
3037-
lock_state.lock_trans_id_ = ((ObSSTableRowLockChecker*)row_iterator)->get_lock_trans_id();
30383036
}
3037+
3038+
lock_state.is_locked_ = ((ObSSTableRowLockChecker*)row_iterator)->is_curr_row_locked();
3039+
lock_state.lock_trans_id_ = ((ObSSTableRowLockChecker*)row_iterator)->get_lock_trans_id();
30393040
}
30403041
row_iterator->~ObISSTableRowIterator();
30413042
}

0 commit comments

Comments
 (0)