AcctIdx: stats for in-mem (#20114)
This commit is contained in:
committed by
GitHub
parent
cb9d93525b
commit
5bbb0da7b8
@ -23,6 +23,7 @@ pub struct BucketMapHolderStats {
|
|||||||
pub keys: AtomicU64,
|
pub keys: AtomicU64,
|
||||||
pub deletes: AtomicU64,
|
pub deletes: AtomicU64,
|
||||||
pub inserts: AtomicU64,
|
pub inserts: AtomicU64,
|
||||||
|
pub count: AtomicU64,
|
||||||
pub count_in_mem: AtomicU64,
|
pub count_in_mem: AtomicU64,
|
||||||
pub per_bucket_count: Vec<AtomicU64>,
|
pub per_bucket_count: Vec<AtomicU64>,
|
||||||
pub flush_entries_updated_on_disk: AtomicU64,
|
pub flush_entries_updated_on_disk: AtomicU64,
|
||||||
@ -47,14 +48,22 @@ impl BucketMapHolderStats {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_or_delete(&self, insert: bool, bin: usize) {
|
pub fn insert_or_delete(&self, insert: bool, _bin: usize) {
|
||||||
let per_bucket = self.per_bucket_count.get(bin);
|
|
||||||
if insert {
|
if insert {
|
||||||
self.inserts.fetch_add(1, Ordering::Relaxed);
|
self.inserts.fetch_add(1, Ordering::Relaxed);
|
||||||
|
self.count.fetch_add(1, Ordering::Relaxed);
|
||||||
|
} else {
|
||||||
|
self.deletes.fetch_add(1, Ordering::Relaxed);
|
||||||
|
self.count.fetch_sub(1, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn insert_or_delete_mem(&self, insert: bool, bin: usize) {
|
||||||
|
let per_bucket = self.per_bucket_count.get(bin);
|
||||||
|
if insert {
|
||||||
self.count_in_mem.fetch_add(1, Ordering::Relaxed);
|
self.count_in_mem.fetch_add(1, Ordering::Relaxed);
|
||||||
per_bucket.map(|count| count.fetch_add(1, Ordering::Relaxed));
|
per_bucket.map(|count| count.fetch_add(1, Ordering::Relaxed));
|
||||||
} else {
|
} else {
|
||||||
self.deletes.fetch_add(1, Ordering::Relaxed);
|
|
||||||
self.count_in_mem.fetch_sub(1, Ordering::Relaxed);
|
self.count_in_mem.fetch_sub(1, Ordering::Relaxed);
|
||||||
per_bucket.map(|count| count.fetch_sub(1, Ordering::Relaxed));
|
per_bucket.map(|count| count.fetch_sub(1, Ordering::Relaxed));
|
||||||
}
|
}
|
||||||
@ -109,6 +118,7 @@ impl BucketMapHolderStats {
|
|||||||
self.count_in_mem.load(Ordering::Relaxed),
|
self.count_in_mem.load(Ordering::Relaxed),
|
||||||
i64
|
i64
|
||||||
),
|
),
|
||||||
|
("count", self.count.load(Ordering::Relaxed), i64),
|
||||||
("min_in_bin", min, i64),
|
("min_in_bin", min, i64),
|
||||||
("max_in_bin", max, i64),
|
("max_in_bin", max, i64),
|
||||||
("count_from_bins", ct, i64),
|
("count_from_bins", ct, i64),
|
||||||
|
@ -152,7 +152,10 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
let entry = map.entry(*pubkey);
|
let entry = map.entry(*pubkey);
|
||||||
let result = match entry {
|
let result = match entry {
|
||||||
Entry::Occupied(occupied) => Arc::clone(occupied.get()),
|
Entry::Occupied(occupied) => Arc::clone(occupied.get()),
|
||||||
Entry::Vacant(vacant) => Arc::clone(vacant.insert(new_entry)),
|
Entry::Vacant(vacant) => {
|
||||||
|
stats.insert_or_delete_mem(true, self.bin);
|
||||||
|
Arc::clone(vacant.insert(new_entry))
|
||||||
|
}
|
||||||
};
|
};
|
||||||
Some(result)
|
Some(result)
|
||||||
}
|
}
|
||||||
@ -184,6 +187,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
// We have to have a write lock to the map here, which means nobody else can get
|
// We have to have a write lock to the map here, which means nobody else can get
|
||||||
// the arc, but someone may already have retreived a clone of it.
|
// the arc, but someone may already have retreived a clone of it.
|
||||||
self.delete_disk_key(occupied.key());
|
self.delete_disk_key(occupied.key());
|
||||||
|
self.stats().insert_or_delete_mem(false, self.bin);
|
||||||
occupied.remove();
|
occupied.remove();
|
||||||
}
|
}
|
||||||
result
|
result
|
||||||
@ -274,6 +278,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
};
|
};
|
||||||
assert!(new_value.dirty());
|
assert!(new_value.dirty());
|
||||||
vacant.insert(new_value);
|
vacant.insert(new_value);
|
||||||
|
self.stats().insert_or_delete_mem(true, self.bin);
|
||||||
self.stats().insert_or_delete(true, self.bin);
|
self.stats().insert_or_delete(true, self.bin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -424,6 +429,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
Entry::Vacant(vacant) => {
|
Entry::Vacant(vacant) => {
|
||||||
// not in cache, look on disk
|
// not in cache, look on disk
|
||||||
let disk_entry = self.load_account_entry_from_disk(vacant.key());
|
let disk_entry = self.load_account_entry_from_disk(vacant.key());
|
||||||
|
stats.insert_or_delete_mem(true, self.bin);
|
||||||
if let Some(disk_entry) = disk_entry {
|
if let Some(disk_entry) = disk_entry {
|
||||||
// on disk, so insert into cache, then return cache value so caller will merge
|
// on disk, so insert into cache, then return cache value so caller will merge
|
||||||
let result = Some(Self::insert_returner(&disk_entry, vacant.key(), new_entry));
|
let result = Some(Self::insert_returner(&disk_entry, vacant.key(), new_entry));
|
||||||
@ -537,6 +543,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
}
|
}
|
||||||
Entry::Vacant(vacant) => {
|
Entry::Vacant(vacant) => {
|
||||||
vacant.insert(self.disk_to_cache_entry(item.slot_list, item.ref_count));
|
vacant.insert(self.disk_to_cache_entry(item.slot_list, item.ref_count));
|
||||||
|
self.stats().insert_or_delete_mem(true, self.bin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -682,6 +689,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// all conditions for removing succeeded, so really remove item from in-mem cache
|
// all conditions for removing succeeded, so really remove item from in-mem cache
|
||||||
|
self.stats().insert_or_delete_mem(false, self.bin);
|
||||||
occupied.remove();
|
occupied.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user