2021-09-01 14:10:16 -07:00
|
|
|
use {
|
|
|
|
crate::accountsdb_repl_server::{
|
|
|
|
self, ReplicaAccountData, ReplicaAccountInfo, ReplicaAccountMeta, ReplicaAccountsServer,
|
|
|
|
},
|
|
|
|
solana_runtime::{
|
|
|
|
accounts_cache::CachedAccount, accounts_db::LoadedAccount, append_vec::StoredAccountMeta,
|
|
|
|
bank_forks::BankForks,
|
|
|
|
},
|
|
|
|
solana_sdk::account::Account,
|
|
|
|
std::{
|
|
|
|
cmp::Eq,
|
|
|
|
sync::{Arc, RwLock},
|
|
|
|
thread,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
pub(crate) struct ReplicaAccountsServerImpl {
|
|
|
|
bank_forks: Arc<RwLock<BankForks>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Eq for ReplicaAccountInfo {}
|
|
|
|
|
|
|
|
impl ReplicaAccountInfo {
|
|
|
|
fn from_stored_account_meta(stored_account_meta: &StoredAccountMeta) -> Self {
|
|
|
|
let account_meta = Some(ReplicaAccountMeta {
|
|
|
|
pubkey: stored_account_meta.meta.pubkey.to_bytes().to_vec(),
|
|
|
|
lamports: stored_account_meta.account_meta.lamports,
|
|
|
|
owner: stored_account_meta.account_meta.owner.to_bytes().to_vec(),
|
|
|
|
executable: stored_account_meta.account_meta.executable,
|
|
|
|
rent_epoch: stored_account_meta.account_meta.rent_epoch,
|
|
|
|
});
|
|
|
|
let data = Some(ReplicaAccountData {
|
|
|
|
data: stored_account_meta.data.to_vec(),
|
|
|
|
});
|
|
|
|
ReplicaAccountInfo {
|
|
|
|
account_meta,
|
2021-10-18 21:59:12 -07:00
|
|
|
hash: stored_account_meta.hash.as_ref().to_vec(),
|
2021-09-01 14:10:16 -07:00
|
|
|
data,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn from_cached_account(cached_account: &CachedAccount) -> Self {
|
|
|
|
let account = Account::from(cached_account.account.clone());
|
|
|
|
let account_meta = Some(ReplicaAccountMeta {
|
|
|
|
pubkey: cached_account.pubkey().to_bytes().to_vec(),
|
|
|
|
lamports: account.lamports,
|
|
|
|
owner: account.owner.to_bytes().to_vec(),
|
|
|
|
executable: account.executable,
|
|
|
|
rent_epoch: account.rent_epoch,
|
|
|
|
});
|
|
|
|
let data = Some(ReplicaAccountData {
|
|
|
|
data: account.data.to_vec(),
|
|
|
|
});
|
|
|
|
ReplicaAccountInfo {
|
|
|
|
account_meta,
|
2021-10-18 21:59:12 -07:00
|
|
|
hash: cached_account.hash().as_ref().to_vec(),
|
2021-09-01 14:10:16 -07:00
|
|
|
data,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ReplicaAccountsServer for ReplicaAccountsServerImpl {
|
|
|
|
fn get_slot_accounts(
|
|
|
|
&self,
|
|
|
|
request: &accountsdb_repl_server::ReplicaAccountsRequest,
|
|
|
|
) -> Result<accountsdb_repl_server::ReplicaAccountsResponse, tonic::Status> {
|
|
|
|
let slot = request.slot;
|
|
|
|
|
|
|
|
match self.bank_forks.read().unwrap().get(slot) {
|
|
|
|
None => Err(tonic::Status::not_found("The slot is not found")),
|
|
|
|
Some(bank) => {
|
|
|
|
let accounts = bank.rc.accounts.scan_slot(slot, |account| match account {
|
|
|
|
LoadedAccount::Stored(stored_account_meta) => Some(
|
|
|
|
ReplicaAccountInfo::from_stored_account_meta(&stored_account_meta),
|
|
|
|
),
|
2021-11-04 10:28:04 -05:00
|
|
|
LoadedAccount::Cached(cached_account) => {
|
2021-09-01 14:10:16 -07:00
|
|
|
Some(ReplicaAccountInfo::from_cached_account(&cached_account))
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
Ok(accountsdb_repl_server::ReplicaAccountsResponse { accounts })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn join(&mut self) -> thread::Result<()> {
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ReplicaAccountsServerImpl {
|
|
|
|
pub fn new(bank_forks: Arc<RwLock<BankForks>>) -> Self {
|
|
|
|
Self { bank_forks }
|
|
|
|
}
|
|
|
|
}
|