Skip to content

Commit 732c3ac

Browse files
committed
reading and loading peers made not blocking
1 parent 4a7925a commit 732c3ac

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

dash-spv/src/storage/peers.rs

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
use std::{
2-
collections::HashMap,
3-
fs::{self, File},
4-
io::BufReader,
5-
net::SocketAddr,
6-
path::PathBuf,
7-
};
1+
use std::{collections::HashMap, fs::File, io::BufReader, net::SocketAddr, path::PathBuf};
2+
3+
use tokio::fs;
84

95
use async_trait::async_trait;
106
use dashcore::{
@@ -76,7 +72,7 @@ impl PeerStorage for PersistentPeerStorage {
7672
) -> StorageResult<()> {
7773
let peers_file = self.peers_data_file();
7874

79-
if let Err(e) = fs::create_dir_all(peers_file.parent().unwrap()) {
75+
if let Err(e) = fs::create_dir_all(peers_file.parent().unwrap()).await {
8076
return Err(StorageError::WriteFailed(format!("Failed to persist peers: {}", e)));
8177
}
8278

@@ -101,25 +97,34 @@ impl PeerStorage for PersistentPeerStorage {
10197
async fn load_peers(&self) -> StorageResult<Vec<SocketAddr>> {
10298
let peers_file = self.peers_data_file();
10399

104-
if !peers_file.exists() {
100+
if !fs::try_exists(&peers_file).await? {
105101
return Ok(Vec::new());
106102
};
107103

108-
let file = File::open(&peers_file)?;
109-
let mut reader = BufReader::new(file);
110104
let mut peers = Vec::new();
111105

112-
loop {
113-
match AddrV2Message::consensus_decode(&mut reader) {
114-
Ok(peer) => peers.push(peer),
115-
Err(encode::Error::Io(ref e)) if e.kind() == std::io::ErrorKind::UnexpectedEof => {
116-
break
117-
}
118-
Err(e) => {
119-
return Err(StorageError::ReadFailed(format!("Failed to decode peer: {e}")))
106+
let peers = tokio::task::spawn_blocking(move || {
107+
let file = File::open(&peers_file)?;
108+
let mut reader = BufReader::new(file);
109+
110+
loop {
111+
match AddrV2Message::consensus_decode(&mut reader) {
112+
Ok(peer) => peers.push(peer),
113+
Err(encode::Error::Io(ref e))
114+
if e.kind() == std::io::ErrorKind::UnexpectedEof =>
115+
{
116+
break
117+
}
118+
Err(e) => {
119+
return Err(StorageError::ReadFailed(format!("Failed to decode peer: {e}")))
120+
}
120121
}
121122
}
122-
}
123+
124+
Ok(peers)
125+
})
126+
.await
127+
.map_err(|e| StorageError::ReadFailed(format!("Failed to load peers: {e}")))??;
123128

124129
let peers = peers.into_iter().filter_map(|p| p.socket_addr().ok()).collect();
125130

@@ -140,19 +145,19 @@ impl PeerStorage for PersistentPeerStorage {
140145
.parent()
141146
.ok_or(StorageError::NotFound("reputation_file doesn't have a parent".to_string()))?;
142147

143-
tokio::fs::create_dir_all(reputation_file_parent).await?;
148+
fs::create_dir_all(reputation_file_parent).await?;
144149

145150
atomic_write(&reputation_file, json.as_bytes()).await
146151
}
147152

148153
async fn load_peers_reputation(&self) -> StorageResult<HashMap<SocketAddr, PeerReputation>> {
149154
let reputation_file = self.peers_reputation_file();
150155

151-
if !reputation_file.exists() {
156+
if !fs::try_exists(&reputation_file).await? {
152157
return Ok(HashMap::new());
153158
}
154159

155-
let json = tokio::fs::read_to_string(reputation_file).await?;
160+
let json = fs::read_to_string(reputation_file).await?;
156161
serde_json::from_str(&json).map_err(|e| {
157162
StorageError::ReadFailed(format!("Failed to deserialize peers reputations: {e}"))
158163
})

0 commit comments

Comments
 (0)