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:
Antioch Peverell
2020-10-07 11:47:25 +01:00
committed by GitHub
parent eab26b3ae4
commit e7bbda81a0
10 changed files with 187 additions and 128 deletions
+9 -8
View File
@@ -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
View File
@@ -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)
}