This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 56df7da9cda [enhancement](atomicstatus) use lock to make the status
object more stable (#35476)
56df7da9cda is described below
commit 56df7da9cda7d38a22b5ec7f093ce03feef2f986
Author: yiguolei <[email protected]>
AuthorDate: Tue May 28 12:49:58 2024 +0800
[enhancement](atomicstatus) use lock to make the status object more stable
(#35476)
## Proposed changes
1. In the past, if error code is not ok and then get status, the status
maybe ok. some dcheck maybe failed.
In this PR use std mutex to make this behavior stable.
## Further comments
If this is a relatively large or complex change, kick off the discussion
at [[email protected]](mailto:[email protected]) by explaining why
you chose the solution you did and what alternatives you considered,
etc...
---------
Co-authored-by: yiguolei <[email protected]>
---
be/src/common/status.h | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/be/src/common/status.h b/be/src/common/status.h
index 99b591639e9..ea33e64307a 100644
--- a/be/src/common/status.h
+++ b/be/src/common/status.h
@@ -553,26 +553,24 @@ class AtomicStatus {
public:
AtomicStatus() : error_st_(Status::OK()) {}
- bool ok() const { return error_code_.load() == 0; }
+ bool ok() const { return error_code_.load(std::memory_order_acquire) == 0;
}
bool update(const Status& new_status) {
// If new status is normal, or the old status is abnormal, then not
need update
- if (new_status.ok() || error_code_.load() != 0) {
+ if (new_status.ok() || error_code_.load(std::memory_order_acquire) !=
0) {
return false;
}
- int16_t expected_error_code = 0;
- if (error_code_.compare_exchange_strong(expected_error_code,
new_status.code(),
- std::memory_order_acq_rel)) {
- // lock here for read status, to avoid core during return error_st_
- std::lock_guard l(mutex_);
- error_st_ = new_status;
- return true;
- } else {
+ std::lock_guard l(mutex_);
+ if (error_code_.load(std::memory_order_acquire) != 0) {
return false;
}
+ error_st_ = new_status;
+ error_code_.store(new_status.code(), std::memory_order_release);
+ return true;
}
// will copy a new status object to avoid concurrency
+ // This stauts could only be called when ok==false
Status status() const {
std::lock_guard l(mutex_);
return error_st_;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]