Only create more append_vecs when the account number grows (#5454)
We only need many append_vecs if the number of accounts is high, so only create opportunistic ones as accounts are created.
This commit is contained in:
parent
12bb05c320
commit
e30ca01999
|
@ -586,16 +586,34 @@ impl AccountsDB {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_storage_candidate(&self, fork_id: Fork) -> Arc<AccountStorageEntry> {
|
fn find_storage_candidate(&self, fork_id: Fork) -> Arc<AccountStorageEntry> {
|
||||||
|
let mut create_extra = false;
|
||||||
let stores = self.storage.read().unwrap();
|
let stores = self.storage.read().unwrap();
|
||||||
|
|
||||||
if let Some(fork_stores) = stores.0.get(&fork_id) {
|
if let Some(fork_stores) = stores.0.get(&fork_id) {
|
||||||
if !fork_stores.is_empty() {
|
if !fork_stores.is_empty() {
|
||||||
|
if fork_stores.len() <= self.min_num_stores {
|
||||||
|
let mut total_accounts = 0;
|
||||||
|
for store in fork_stores.values() {
|
||||||
|
total_accounts += store.count_and_status.read().unwrap().0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create more stores so that when scanning the storage all CPUs have work
|
||||||
|
if (total_accounts / 16) >= fork_stores.len() {
|
||||||
|
create_extra = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// pick an available store at random by iterating from a random point
|
// pick an available store at random by iterating from a random point
|
||||||
let to_skip = thread_rng().gen_range(0, fork_stores.len());
|
let to_skip = thread_rng().gen_range(0, fork_stores.len());
|
||||||
|
|
||||||
for (i, store) in fork_stores.values().cycle().skip(to_skip).enumerate() {
|
for (i, store) in fork_stores.values().cycle().skip(to_skip).enumerate() {
|
||||||
if store.try_available() {
|
if store.try_available() {
|
||||||
return store.clone();
|
let ret = store.clone();
|
||||||
|
drop(stores);
|
||||||
|
if create_extra {
|
||||||
|
self.create_and_insert_store(fork_id, self.file_size);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
// looked at every store, bail...
|
// looked at every store, bail...
|
||||||
if i == fork_stores.len() {
|
if i == fork_stores.len() {
|
||||||
|
@ -604,6 +622,7 @@ impl AccountsDB {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop(stores);
|
drop(stores);
|
||||||
|
|
||||||
let store = self.create_and_insert_store(fork_id, self.file_size);
|
let store = self.create_and_insert_store(fork_id, self.file_size);
|
||||||
|
@ -615,11 +634,6 @@ impl AccountsDB {
|
||||||
let mut stores = self.storage.write().unwrap();
|
let mut stores = self.storage.write().unwrap();
|
||||||
let fork_storage = stores.0.entry(fork_id).or_insert_with(HashMap::new);
|
let fork_storage = stores.0.entry(fork_id).or_insert_with(HashMap::new);
|
||||||
|
|
||||||
// Create more stores so that when scanning the storage all CPUs have work
|
|
||||||
while fork_storage.len() + 1 < self.min_num_stores {
|
|
||||||
self.create_store(fork_id, fork_storage, self.file_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.create_store(fork_id, fork_storage, size)
|
self.create_store(fork_id, fork_storage, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue