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