AcctIdx: report on partial progress during flushing (#21306)

This commit is contained in:
Jeff Washington (jwash)
2021-11-18 11:01:19 -06:00
committed by GitHub
parent d12dfc1918
commit a272e19f8d

View File

@ -38,16 +38,19 @@ pub struct BucketMapHolderStats {
pub active_threads: AtomicU64, pub active_threads: AtomicU64,
pub get_range_us: AtomicU64, pub get_range_us: AtomicU64,
last_age: AtomicU8, last_age: AtomicU8,
last_ages_flushed: AtomicU64,
pub flush_scan_update_us: AtomicU64, pub flush_scan_update_us: AtomicU64,
pub flush_remove_us: AtomicU64, pub flush_remove_us: AtomicU64,
pub flush_grow_us: AtomicU64, pub flush_grow_us: AtomicU64,
last_was_startup: AtomicBool, last_was_startup: AtomicBool,
last_time: AtomicInterval, last_time: AtomicInterval,
bins: u64,
} }
impl BucketMapHolderStats { impl BucketMapHolderStats {
pub fn new(bins: usize) -> BucketMapHolderStats { pub fn new(bins: usize) -> BucketMapHolderStats {
BucketMapHolderStats { BucketMapHolderStats {
bins: bins as u64,
per_bucket_count: (0..bins) per_bucket_count: (0..bins)
.into_iter() .into_iter()
.map(|_| AtomicU64::default()) .map(|_| AtomicU64::default())
@ -82,9 +85,10 @@ impl BucketMapHolderStats {
} }
fn ms_per_age<T: IndexValue>(&self, storage: &BucketMapHolder<T>, elapsed_ms: u64) -> u64 { fn ms_per_age<T: IndexValue>(&self, storage: &BucketMapHolder<T>, elapsed_ms: u64) -> u64 {
if !storage.get_startup() {
let age_now = storage.current_age(); let age_now = storage.current_age();
let ages_flushed = storage.count_ages_flushed() as u64;
let last_age = self.last_age.swap(age_now, Ordering::Relaxed) as u64; let last_age = self.last_age.swap(age_now, Ordering::Relaxed) as u64;
let last_ages_flushed = self.last_ages_flushed.swap(ages_flushed, Ordering::Relaxed) as u64;
let mut age_now = age_now as u64; let mut age_now = age_now as u64;
if last_age > age_now { if last_age > age_now {
// age wrapped // age wrapped
@ -93,6 +97,11 @@ impl BucketMapHolderStats {
let age_delta = age_now.saturating_sub(last_age) as u64; let age_delta = age_now.saturating_sub(last_age) as u64;
if age_delta > 0 { if age_delta > 0 {
return elapsed_ms / age_delta; return elapsed_ms / age_delta;
} else {
// did not advance an age, but probably did partial work, so report that
let bin_delta = ages_flushed.saturating_sub(last_ages_flushed);
if bin_delta > 0 {
return elapsed_ms * self.bins / bin_delta;
} }
} }
0 // avoid crazy numbers 0 // avoid crazy numbers