@@ -17,6 +17,7 @@ use crate::block::{BlockWriterLocal, BlockWriterRemote};
17
17
use crate :: file:: FsContext ;
18
18
use curvine_common:: state:: { BlockLocation , CommitBlock , LocatedBlock , WorkerAddress } ;
19
19
use curvine_common:: FsResult ;
20
+ use futures:: future:: try_join_all;
20
21
use orpc:: err_box;
21
22
use orpc:: runtime:: { RpcRuntime , Runtime } ;
22
23
use orpc:: sys:: DataSlice ;
@@ -125,51 +126,93 @@ impl BlockWriter {
125
126
126
127
pub async fn write ( & mut self , chunk : DataSlice ) -> FsResult < ( ) > {
127
128
let chunk = chunk. freeze ( ) ;
128
- for writer in & mut self . inners {
129
- if let Err ( e) = writer. write ( chunk. clone ( ) ) . await {
130
- self . fs_context . add_failed_worker ( writer. worker_address ( ) ) ;
131
- return Err ( e) ;
132
- }
129
+ let mut futures = Vec :: with_capacity ( self . inners . len ( ) ) ;
130
+ for writer in self . inners . iter_mut ( ) {
131
+ let chunk_clone = chunk. clone ( ) ;
132
+ let task = async move {
133
+ writer
134
+ . write ( chunk_clone)
135
+ . await
136
+ . map_err ( |e| ( writer. worker_address ( ) . clone ( ) , e) )
137
+ } ;
138
+ futures. push ( task) ;
139
+ }
140
+
141
+ if let Err ( ( worker_addr, e) ) = try_join_all ( futures) . await {
142
+ self . fs_context . add_failed_worker ( & worker_addr) ;
143
+ return Err ( e) ;
133
144
}
134
145
Ok ( ( ) )
135
146
}
136
147
137
- pub fn blocking_write ( & mut self , rt : & Runtime , buf : DataSlice ) -> FsResult < ( ) > {
138
- for writer in & mut self . inners {
139
- if let Err ( e) = writer. blocking_write ( rt, buf. clone ( ) ) {
140
- self . fs_context . add_failed_worker ( writer. worker_address ( ) ) ;
141
- return Err ( e) ;
148
+ pub fn blocking_write ( & mut self , rt : & Runtime , chunk : DataSlice ) -> FsResult < ( ) > {
149
+ if self . inners . len ( ) == 1 {
150
+ if let Err ( e) = self . inners [ 0 ] . blocking_write ( rt, chunk) {
151
+ self . fs_context
152
+ . add_failed_worker ( self . inners [ 0 ] . worker_address ( ) ) ;
153
+ Err ( e)
154
+ } else {
155
+ Ok ( ( ) )
142
156
}
157
+ } else {
158
+ rt. block_on ( self . write ( chunk) ) ?;
159
+ Ok ( ( ) )
143
160
}
144
- Ok ( ( ) )
145
161
}
146
162
147
163
pub async fn flush ( & mut self ) -> FsResult < ( ) > {
148
- for writer in & mut self . inners {
149
- if let Err ( e) = writer. flush ( ) . await {
150
- self . fs_context . add_failed_worker ( writer. worker_address ( ) ) ;
151
- return Err ( e) ;
152
- }
164
+ let mut futures = Vec :: with_capacity ( self . inners . len ( ) ) ;
165
+ for writer in self . inners . iter_mut ( ) {
166
+ let task = async move {
167
+ writer
168
+ . flush ( )
169
+ . await
170
+ . map_err ( |e| ( writer. worker_address ( ) . clone ( ) , e) )
171
+ } ;
172
+ futures. push ( task) ;
173
+ }
174
+
175
+ if let Err ( ( worker_addr, e) ) = try_join_all ( futures) . await {
176
+ self . fs_context . add_failed_worker ( & worker_addr) ;
177
+ return Err ( e) ;
153
178
}
154
179
Ok ( ( ) )
155
180
}
156
181
157
182
pub async fn complete ( & mut self ) -> FsResult < CommitBlock > {
158
- for writer in & mut self . inners {
159
- if let Err ( e) = writer. complete ( ) . await {
160
- self . fs_context . add_failed_worker ( writer. worker_address ( ) ) ;
161
- return Err ( e) ;
162
- }
183
+ let mut futures = Vec :: with_capacity ( self . inners . len ( ) ) ;
184
+ for writer in self . inners . iter_mut ( ) {
185
+ let task = async move {
186
+ writer
187
+ . complete ( )
188
+ . await
189
+ . map_err ( |e| ( writer. worker_address ( ) . clone ( ) , e) )
190
+ } ;
191
+ futures. push ( task) ;
192
+ }
193
+
194
+ if let Err ( ( worker_addr, e) ) = try_join_all ( futures) . await {
195
+ self . fs_context . add_failed_worker ( & worker_addr) ;
196
+ return Err ( e) ;
163
197
}
164
198
Ok ( self . to_commit_block ( ) )
165
199
}
166
200
167
201
pub async fn cancel ( & mut self ) -> FsResult < ( ) > {
168
- for writer in & mut self . inners {
169
- if let Err ( e) = writer. cancel ( ) . await {
170
- self . fs_context . add_failed_worker ( writer. worker_address ( ) ) ;
171
- return Err ( e) ;
172
- }
202
+ let mut futures = Vec :: with_capacity ( self . inners . len ( ) ) ;
203
+ for writer in self . inners . iter_mut ( ) {
204
+ let task = async move {
205
+ writer
206
+ . cancel ( )
207
+ . await
208
+ . map_err ( |e| ( writer. worker_address ( ) . clone ( ) , e) )
209
+ } ;
210
+ futures. push ( task) ;
211
+ }
212
+
213
+ if let Err ( ( worker_addr, e) ) = try_join_all ( futures) . await {
214
+ self . fs_context . add_failed_worker ( & worker_addr) ;
215
+ return Err ( e) ;
173
216
}
174
217
Ok ( ( ) )
175
218
}
0 commit comments