From b187dbc87ede6165763b33804e64f51abe2a177b Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Dec 2024 08:45:38 +0000 Subject: [PATCH] fix group clock unlimited --- src/share/io/io_schedule/ob_io_mclock.cpp | 2 +- src/share/io/ob_io_define.cpp | 19 ++++++++++++++++++- src/share/io/ob_io_define.h | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/share/io/io_schedule/ob_io_mclock.cpp b/src/share/io/io_schedule/ob_io_mclock.cpp index 2640c6411..ad67b4b1c 100644 --- a/src/share/io/io_schedule/ob_io_mclock.cpp +++ b/src/share/io/io_schedule/ob_io_mclock.cpp @@ -297,7 +297,7 @@ int ObTenantIOClock::calc_phyqueue_clock(ObPhyQueue *phy_queue, ObIORequest &req } } else { // min_iops of group - mclock->reservation_clock_.atom_update(current_ts - PHY_QUEUE_BURST_USEC, iops_scale, phy_queue->reservation_ts_); + mclock->reservation_clock_.atom_update_reserve(current_ts - PHY_QUEUE_BURST_USEC, iops_scale, phy_queue->reservation_ts_); } // iops/bandwidth weight of tenant & group, TODO fengshuo.fs: THIS IS NOT CORRECT mclock->proportion_clock_.atom_update(current_ts - PHY_QUEUE_BURST_USEC, iops_scale, phy_queue->proportion_ts_); diff --git a/src/share/io/ob_io_define.cpp b/src/share/io/ob_io_define.cpp index 858ec3764..ddeab6efc 100644 --- a/src/share/io/ob_io_define.cpp +++ b/src/share/io/ob_io_define.cpp @@ -2288,6 +2288,23 @@ int64_t ObTenantIOConfig::to_string(char* buf, const int64_t buf_len) const } /****************** IOClock **********************/ +void ObAtomIOClock::atom_update_reserve(const int64_t current_ts, const double iops_scale, int64_t &deadline_ts) +{ + if (0 == iops_scale * iops_) { + deadline_ts = INT64_MAX; + } else { + const int64_t delta_ns = 1000L * 1000L * 1000L / (iops_scale * iops_); + int64_t ov = ATOMIC_LOAD(&last_ns_); + int64_t nv = 0; + int64_t tv = max(current_ts * 1000L, ov + delta_ns); + while (ov != (nv = ATOMIC_VCAS(&last_ns_, ov, tv))) { + ov = nv; + tv = max(current_ts * 1000L, ov + delta_ns); + } + deadline_ts = tv / 1000L; + } +} + void ObAtomIOClock::atom_update(const int64_t current_ts, const double iops_scale, int64_t &deadline_ts) { if (0 == iops_scale * iops_) { @@ -2309,7 +2326,7 @@ void ObAtomIOClock::compare_and_update(const int64_t current_ts, const double io { int64_t tmp = 0; atom_update(current_ts, iops_scale, tmp); - deadline_ts = (INT64_MAX == deadline_ts) ? current_ts : max(deadline_ts, tmp); + deadline_ts = (INT64_MAX == deadline_ts) ? tmp : max(deadline_ts, tmp); } void ObAtomIOClock::reset() diff --git a/src/share/io/ob_io_define.h b/src/share/io/ob_io_define.h index f27dd2077..ca2ef25c2 100644 --- a/src/share/io/ob_io_define.h +++ b/src/share/io/ob_io_define.h @@ -808,6 +808,7 @@ struct ObAtomIOClock final { ObAtomIOClock() : iops_(0), last_ns_(0) {} + void atom_update_reserve(const int64_t current_ts, const double iops_scale, int64_t &deadline_ts); void atom_update(const int64_t current_ts, const double iops_scale, int64_t &deadline_ts); void compare_and_update(const int64_t current_ts, const double iops_scale, int64_t &deadline_ts); void reset();