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:
sakridge 2019-08-07 16:43:52 -07:00 committed by GitHub
parent 12bb05c320
commit e30ca01999
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 6 deletions

View File

@ -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)
} }