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
95use async_trait:: async_trait;
106use 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