Paginate rpc query to get feature accounts (#25978)

This commit is contained in:
Tyera Eulberg 2022-06-14 22:57:57 -06:00 committed by GitHub
parent f48d0b2b36
commit d4c4e28b5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 35 additions and 28 deletions

View File

@ -8,7 +8,9 @@ use {
serde::{Deserialize, Serialize},
solana_clap_utils::{input_parsers::*, input_validators::*, keypair::*},
solana_cli_output::{cli_version::CliVersion, QuietDisplay, VerboseDisplay},
solana_client::{client_error::ClientError, rpc_client::RpcClient},
solana_client::{
client_error::ClientError, rpc_client::RpcClient, rpc_request::MAX_MULTIPLE_ACCOUNTS,
},
solana_remote_wallet::remote_wallet::RemoteWalletManager,
solana_sdk::{
account::Account,
@ -800,35 +802,40 @@ fn process_status(
None
};
let mut inactive = false;
let mut features = rpc_client
.get_multiple_accounts(feature_ids)?
.into_iter()
.zip(feature_ids)
.map(|(account, feature_id)| {
let feature_name = FEATURE_NAMES.get(feature_id).unwrap();
account
.and_then(status_from_account)
.map(|feature_status| CliFeature {
id: feature_id.to_string(),
description: feature_name.to_string(),
status: feature_status,
})
.unwrap_or_else(|| {
inactive = true;
CliFeature {
let mut features = vec![];
for feature_ids in feature_ids.chunks(MAX_MULTIPLE_ACCOUNTS) {
let mut feature_chunk = rpc_client
.get_multiple_accounts(feature_ids)
.unwrap_or_default()
.into_iter()
.zip(feature_ids)
.map(|(account, feature_id)| {
let feature_name = FEATURE_NAMES.get(feature_id).unwrap();
account
.and_then(status_from_account)
.map(|feature_status| CliFeature {
id: feature_id.to_string(),
description: feature_name.to_string(),
status: CliFeatureStatus::Inactive,
}
})
})
.filter(|feature| match (filter, &feature.status) {
(Some(min_activation), CliFeatureStatus::Active(activation)) => {
activation > &min_activation
}
_ => true,
})
.collect::<Vec<_>>();
status: feature_status,
})
.unwrap_or_else(|| {
inactive = true;
CliFeature {
id: feature_id.to_string(),
description: feature_name.to_string(),
status: CliFeatureStatus::Inactive,
}
})
})
.filter(|feature| match (filter, &feature.status) {
(Some(min_activation), CliFeatureStatus::Active(activation)) => {
activation > &min_activation
}
_ => true,
})
.collect::<Vec<_>>();
features.append(&mut feature_chunk);
}
features.sort_unstable();