@@ -97,12 +97,16 @@ GenericRateLimiter::~GenericRateLimiter() {
97
97
98
98
// This API allows user to dynamically change rate limiter's bytes per second.
99
99
void GenericRateLimiter::SetBytesPerSecond (int64_t bytes_per_second) {
100
- assert (bytes_per_second > 0 );
101
- // TODO: Configurable may simultaneously mutate `options_` (a
102
- // `GenericRateLimiterOptions`) without locking internally.
103
100
MutexLock g (&request_mutex_);
104
- options_.max_bytes_per_sec = bytes_per_second;
105
- InitializeLocked ();
101
+ SetBytesPerSecondLocked (bytes_per_second);
102
+ }
103
+
104
+ void GenericRateLimiter::SetBytesPerSecondLocked (int64_t bytes_per_second) {
105
+ assert (bytes_per_second > 0 );
106
+ rate_bytes_per_sec_.store (bytes_per_second, std::memory_order_relaxed);
107
+ refill_bytes_per_period_.store (
108
+ CalculateRefillBytesPerPeriodLocked (bytes_per_second),
109
+ std::memory_order_relaxed);
106
110
}
107
111
108
112
void GenericRateLimiter::Request (int64_t bytes, const Env::IOPriority pri,
@@ -351,9 +355,7 @@ Status GenericRateLimiter::TuneLocked() {
351
355
new_bytes_per_sec = prev_bytes_per_sec;
352
356
}
353
357
if (new_bytes_per_sec != prev_bytes_per_sec) {
354
- rate_bytes_per_sec_ = new_bytes_per_sec;
355
- refill_bytes_per_period_ =
356
- CalculateRefillBytesPerPeriodLocked (rate_bytes_per_sec_);
358
+ SetBytesPerSecondLocked (new_bytes_per_sec);
357
359
}
358
360
num_drains_ = 0 ;
359
361
return Status::OK ();
0 commit comments