diff --git a/deps/oblib/src/lib/lock/ob_qsync_lock.cpp b/deps/oblib/src/lib/lock/ob_qsync_lock.cpp index a91f0a404..465bb2853 100644 --- a/deps/oblib/src/lib/lock/ob_qsync_lock.cpp +++ b/deps/oblib/src/lib/lock/ob_qsync_lock.cpp @@ -50,11 +50,16 @@ int ObQSyncLock::wrlock() if (!ATOMIC_BCAS(&write_flag_, 0, 1)) { sched_yield(); } else { - // write priority try sync to succ - while (!qsync_.try_sync()) { + bool sync_success = false; + for (int64_t i = 0; !sync_success && i < TRY_SYNC_COUNT; i++) { + sync_success = qsync_.try_sync(); + } + if (sync_success) { + break; + } else { + ATOMIC_STORE(&write_flag_, 0); sched_yield(); } - break; } } while (true); return common::OB_SUCCESS; diff --git a/deps/oblib/src/lib/lock/ob_qsync_lock.h b/deps/oblib/src/lib/lock/ob_qsync_lock.h index 708bfdaa0..df5bae1fb 100644 --- a/deps/oblib/src/lib/lock/ob_qsync_lock.h +++ b/deps/oblib/src/lib/lock/ob_qsync_lock.h @@ -33,6 +33,8 @@ public: int wrlock(); void wrunlock(); int try_rdlock(); +private: + static const int64_t TRY_SYNC_COUNT = 16; private: int64_t write_flag_ CACHE_ALIGNED; common::ObDynamicQSync qsync_;