migrate blocks in batches (rework db iterator impl) (#3450)
* rework db iterator more robust block migration based on low level iterator * cleanup * cleanup * fixup
This commit is contained in:
+9
-8
@@ -369,15 +369,16 @@ impl Peers {
|
||||
}
|
||||
}
|
||||
|
||||
/// All peer information we have in storage
|
||||
/// Iterator over all peers we know about (stored in our db).
|
||||
pub fn peers_iter(&self) -> Result<impl Iterator<Item = PeerData>, Error> {
|
||||
self.store.peers_iter().map_err(From::from)
|
||||
}
|
||||
|
||||
/// Convenience for reading all peers.
|
||||
pub fn all_peers(&self) -> Vec<PeerData> {
|
||||
match self.store.all_peers() {
|
||||
Ok(peers) => peers,
|
||||
Err(e) => {
|
||||
error!("all_peers failed: {:?}", e);
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
self.peers_iter()
|
||||
.map(|peers| peers.collect())
|
||||
.unwrap_or(vec![])
|
||||
}
|
||||
|
||||
/// Find peers in store (not necessarily connected) and return their data
|
||||
|
||||
+13
-7
@@ -152,21 +152,27 @@ impl PeerStore {
|
||||
cap: Capabilities,
|
||||
count: usize,
|
||||
) -> Result<Vec<PeerData>, Error> {
|
||||
let key = to_key(PEER_PREFIX, "");
|
||||
let peers = self
|
||||
.db
|
||||
.iter::<PeerData>(&key)?
|
||||
.map(|(_, v)| v)
|
||||
.peers_iter()?
|
||||
.filter(|p| p.flags == state && p.capabilities.contains(cap))
|
||||
.choose_multiple(&mut thread_rng(), count);
|
||||
Ok(peers)
|
||||
}
|
||||
|
||||
/// Iterator over all known peers.
|
||||
pub fn peers_iter(&self) -> Result<impl Iterator<Item = PeerData>, Error> {
|
||||
let key = to_key(PEER_PREFIX, "");
|
||||
let protocol_version = self.db.protocol_version();
|
||||
self.db.iter(&key, move |_, mut v| {
|
||||
ser::deserialize(&mut v, protocol_version).map_err(From::from)
|
||||
})
|
||||
}
|
||||
|
||||
/// List all known peers
|
||||
/// Used for /v1/peers/all api endpoint
|
||||
pub fn all_peers(&self) -> Result<Vec<PeerData>, Error> {
|
||||
let key = to_key(PEER_PREFIX, "");
|
||||
Ok(self.db.iter::<PeerData>(&key)?.map(|(_, v)| v).collect())
|
||||
let peers: Vec<PeerData> = self.peers_iter()?.collect();
|
||||
Ok(peers)
|
||||
}
|
||||
|
||||
/// Convenience method to load a peer data, update its status and save it
|
||||
@@ -194,7 +200,7 @@ impl PeerStore {
|
||||
{
|
||||
let mut to_remove = vec![];
|
||||
|
||||
for x in self.all_peers()? {
|
||||
for x in self.peers_iter()? {
|
||||
if predicate(&x) {
|
||||
to_remove.push(x)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user