@@ -814,7 +814,8 @@ butil::Status TxnIterator::GetCurrentValue() {
814814 if (is_lock_conflict) {
815815 DINGO_LOG (WARNING) << " [txn]Scan CheckLockConflict return conflict, key: " << Helper::StringToHex (lock_info.key ())
816816 << " , isolation_level: " << isolation_level_ << " , start_ts: " << start_ts_
817- << " , seek_ts: " << seek_ts_ << " , lock_info: " << lock_info.ShortDebugString ();
817+ << " , seek_ts: " << seek_ts_ << " , lock_info: " << lock_info.ShortDebugString ()
818+ << " , txn_result_info: " << txn_result_info_.ShortDebugString ();
818819 key_.clear ();
819820 value_.clear ();
820821 return butil::Status (pb::error::Errno::ETXN_LOCK_CONFLICT, " lock conflict" );
@@ -878,26 +879,18 @@ std::string TxnIterator::Value() { return value_; }
878879bool TxnEngineHelper::CheckLockConflict (const pb::store::LockInfo &lock_info, pb::store::IsolationLevel isolation_level,
879880 int64_t start_ts, const std::set<int64_t > &resolved_locks,
880881 pb::store::TxnResultInfo &txn_result_info) {
881- DINGO_LOG (DEBUG) << " [txn]CheckLockConflict lock_info: " << lock_info.ShortDebugString ()
882- << " , isolation_level: " << isolation_level << " , start_ts: " << start_ts
883- << " , resolved_locks size: " << resolved_locks.size ();
882+ DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
883+ << " [txn]CheckLockConflict lock_info: " << lock_info.ShortDebugString ()
884+ << " , isolation_level: " << isolation_level << " , start_ts: " << start_ts
885+ << " , resolved_locks size: " << resolved_locks.size ();
884886
885887 // if lock_info is resolved, return false, means the executor has used CheckTxnStatus to check the lock_info and
886888 // updated the min_commit_ts of the primary lock.
887889 if (!resolved_locks.empty () && resolved_locks.find (lock_info.lock_ts ()) != resolved_locks.end ()) {
888- DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
889- << " [txn]CheckLockConflict lock_info: " << lock_info.ShortDebugString ()
890- << " , isolation_level: " << isolation_level << " , start_ts: " << start_ts
891- << " , resolved_locks size: " << resolved_locks.size () << " , lock_ts: " << lock_info.lock_ts ()
892- << " is resolved, return false" ;
893890 return false ;
894891 }
895892 // Ignore lock when min_commit_ts > ts
896893 if (lock_info.min_commit_ts () > start_ts) {
897- DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
898- << " [txn]CheckLockConflict lock_info: " << lock_info.ShortDebugString ()
899- << " , isolation_level: " << isolation_level << " , start_ts: " << start_ts
900- << " , min_commit_ts: " << lock_info.lock_ts () << " ignore lock when min_commit_ts > ts" ;
901894 return false ;
902895 }
903896
@@ -906,18 +899,12 @@ bool TxnEngineHelper::CheckLockConflict(const pb::store::LockInfo &lock_info, pb
906899 // for pessimistic, check for_update_ts
907900 if (lock_info.for_update_ts () > 0 ) {
908901 if (lock_info.for_update_ts () < start_ts) {
909- DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
910- << " [txn]CheckLockConflict SI lock_info.for_update_ts() > 0, it's conflict, lock_info: "
911- << lock_info.ShortDebugString () << " , start_ts: " << start_ts;
912902 // for_update_ts < start_ts, return lock_info
913903 *(txn_result_info.mutable_locked ()) = lock_info;
914904 return true ;
915905 }
916906 } else {
917907 if (lock_info.lock_ts () < start_ts) {
918- DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
919- << " [txn]CheckLockConflict SI lock_info.for_update_ts() == 0, it's conflict, lock_info: "
920- << lock_info.ShortDebugString () << " , start_ts: " << start_ts;
921908 // lock_ts < start_ts, return lock_info
922909 *(txn_result_info.mutable_locked ()) = lock_info;
923910 return true ;
@@ -931,18 +918,10 @@ bool TxnEngineHelper::CheckLockConflict(const pb::store::LockInfo &lock_info, pb
931918 // for optimistic lock, need to check the lock_ts
932919 if (lock_info.for_update_ts () > 0 ) {
933920 if (lock_info.lock_type () == pb::store::Lock) {
934- DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
935- << " [txn]CheckLockConflict RC lock_info.for_update_ts() > 0, but only on LOCK stage, it's ok, "
936- " lock_info: "
937- << lock_info.ShortDebugString () << " , start_ts: " << start_ts;
938921 return false ;
939922 }
940923
941924 if (lock_info.for_update_ts () < start_ts) {
942- DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
943- << " [txn]CheckLockConflict RC lock_info.for_update_ts() > 0, on PREWRITE stage, it's "
944- " conflict, lock_info: "
945- << lock_info.ShortDebugString () << " , start_ts: " << start_ts;
946925 // for_update_ts < start_ts, return lock_info
947926 *(txn_result_info.mutable_locked ()) = lock_info;
948927 return true ;
@@ -1129,7 +1108,8 @@ butil::Status TxnEngineHelper::BatchGet(RawEnginePtr engine, const pb::store::Is
11291108 if (is_lock_conflict) {
11301109 DINGO_LOG (WARNING) << " [txn]BatchGet CheckLockConflict return conflict, key: " << Helper::StringToHex (key)
11311110 << " , isolation_level: " << isolation_level << " , start_ts: " << start_ts
1132- << " , lock_info: " << lock_info.ShortDebugString ();
1111+ << " , lock_info: " << lock_info.ShortDebugString ()
1112+ << " , txn_result_info: " << txn_result_info.ShortDebugString ();
11331113 return butil::Status::OK ();
11341114 }
11351115
@@ -1866,23 +1846,30 @@ butil::Status TxnEngineHelper::PessimisticRollback(RawEnginePtr raw_engine, std:
18661846
18671847bvar::LatencyRecorder g_txn_prewrite_latency (" dingo_txn_prewrite" );
18681848
1869- void TxnEngineHelper::GenFinalMinCommitTs (int64_t region_id, std::string key, int64_t region_max_ts, int64_t start_ts,
1870- int64_t for_update_ts, int64_t lock_min_commit_ts, int64_t max_commit_ts,
1871- int64_t &final_min_commit_ts) {
1872- int64_t min_commit_ts = std::max (std::max (region_max_ts, start_ts), for_update_ts) + 1 ;
1873- final_min_commit_ts = std::max (min_commit_ts, lock_min_commit_ts);
1849+ int64_t TxnEngineHelper::GenFinalMinCommitTs (store::RegionPtr region, pb::store::LockInfo &lock_info, std::string key,
1850+ int64_t start_ts, int64_t for_update_ts, int64_t max_commit_ts) {
1851+ int64_t region_id = region->Id ();
1852+ auto new_entry = std::make_shared<ConcurrencyManager::LockEntry>();
1853+ RWLockWriteGuard guard (&new_entry->rw_lock );
1854+ new_entry->lock_info = lock_info;
1855+ region->LockKey (key, new_entry);
1856+
1857+ int64_t region_max_ts = region->TxnAccessMaxTs ();
1858+ int64_t min_commit_ts = std::max ({region_max_ts, start_ts, for_update_ts}) + 1 ;
1859+ int64_t final_min_commit_ts = std::max (min_commit_ts, lock_info.min_commit_ts ());
1860+ final_min_commit_ts = (max_commit_ts != 0 && min_commit_ts > max_commit_ts) ? 0 : final_min_commit_ts;
1861+
1862+ if (final_min_commit_ts > 0 ) {
1863+ lock_info.set_min_commit_ts (final_min_commit_ts);
1864+ new_entry->lock_info .set_min_commit_ts (final_min_commit_ts);
1865+ }
1866+
18741867 DINGO_LOG_IF (INFO, FLAGS_dingo_log_switch_txn_detail)
18751868 << fmt::format (" [txn][region({})]" , region_id) << " GenFinalMinCommitTs, region_max_ts:" << region_max_ts
18761869 << " , start_ts:" << start_ts << " , for_update_ts:" << for_update_ts
1877- << " , lock_min_commit_ts:" << lock_min_commit_ts << " , final_min_commit_ts:" << final_min_commit_ts;
1878- if (max_commit_ts != 0 && min_commit_ts > max_commit_ts) {
1879- DINGO_LOG (WARNING) << fmt::format (
1880- " [txn][region({})] Prewrite 1pc commit_ts({}) is too large, fallback to normal 2PC" ,
1881- region_id, min_commit_ts)
1882- << " , key: " << key << " , start_ts: " << start_ts << " , for_update_ts: " << for_update_ts
1883- << " , lock_min_commit_ts: " << lock_min_commit_ts << " , max_commit_ts: " << max_commit_ts;
1884- final_min_commit_ts = 0 ;
1885- }
1870+ << " , lock_min_commit_ts:" << lock_info.min_commit_ts () << " , final_min_commit_ts:" << final_min_commit_ts;
1871+
1872+ return final_min_commit_ts;
18861873}
18871874
18881875butil::Status TxnEngineHelper::GenPrewriteDataAndLock (
@@ -1895,7 +1882,6 @@ butil::Status TxnEngineHelper::GenPrewriteDataAndLock(
18951882 std::vector<std::tuple<std::string, std::string, pb::store::LockInfo, bool >> &locks_for_1pc,
18961883 int64_t &final_min_commit_ts) {
18971884 int64_t region_id = region->Id ();
1898- int64_t region_max_ts = region->TxnAppliedMaxTs ();
18991885
19001886 // do Put/Delete/PutIfAbsent
19011887 if (mutation.op () == pb::store::Op::Put) {
@@ -1937,8 +1923,8 @@ butil::Status TxnEngineHelper::GenPrewriteDataAndLock(
19371923 }
19381924 }
19391925 if (try_one_pc || use_async_commit) {
1940- GenFinalMinCommitTs (region_id, mutation. key (), region_max_ts, start_ts, for_update_ts,
1941- lock_info. min_commit_ts (), max_commit_ts, final_min_commit_ts );
1926+ final_min_commit_ts =
1927+ GenFinalMinCommitTs (region, lock_info, mutation. key (), start_ts, for_update_ts, max_commit_ts );
19421928 if (final_min_commit_ts == 0 ) {
19431929 // fallback_to_2PC
19441930 try_one_pc = false ;
@@ -1986,8 +1972,8 @@ butil::Status TxnEngineHelper::GenPrewriteDataAndLock(
19861972 }
19871973
19881974 if (try_one_pc || use_async_commit) {
1989- GenFinalMinCommitTs (region_id, mutation. key (), region_max_ts, start_ts, for_update_ts,
1990- lock_info. min_commit_ts (), max_commit_ts, final_min_commit_ts );
1975+ final_min_commit_ts =
1976+ GenFinalMinCommitTs (region, lock_info, mutation. key (), start_ts, for_update_ts, max_commit_ts );
19911977 if (final_min_commit_ts == 0 ) {
19921978 // fallback_to_2PC
19931979 try_one_pc = false ;
@@ -2047,8 +2033,8 @@ butil::Status TxnEngineHelper::GenPrewriteDataAndLock(
20472033 }
20482034
20492035 if (try_one_pc || use_async_commit) {
2050- GenFinalMinCommitTs (region_id, mutation. key (), region_max_ts, start_ts, for_update_ts,
2051- lock_info. min_commit_ts (), max_commit_ts, final_min_commit_ts );
2036+ final_min_commit_ts =
2037+ GenFinalMinCommitTs (region, lock_info, mutation. key (), start_ts, for_update_ts, max_commit_ts );
20522038 if (final_min_commit_ts == 0 ) {
20532039 // fallback_to_2PC
20542040 try_one_pc = false ;
@@ -2103,8 +2089,8 @@ butil::Status TxnEngineHelper::GenPrewriteDataAndLock(
21032089 }
21042090
21052091 if (try_one_pc || use_async_commit) {
2106- GenFinalMinCommitTs (region_id, mutation. key (), region_max_ts, start_ts, for_update_ts,
2107- lock_info. min_commit_ts (), max_commit_ts, final_min_commit_ts );
2092+ final_min_commit_ts =
2093+ GenFinalMinCommitTs (region, lock_info, mutation. key (), start_ts, for_update_ts, max_commit_ts );
21082094 if (final_min_commit_ts == 0 ) {
21092095 // fallback_to_2PC
21102096 try_one_pc = false ;
0 commit comments