@@ -6,6 +6,7 @@ use std::path::Path;
6
6
use std:: sync:: { Arc , Mutex } ;
7
7
8
8
use crate :: checksum;
9
+ use crate :: error:: * ;
9
10
use crate :: io_engine:: { AsyncIoEngine , Block , IoEngine , SyncIoEngine } ;
10
11
use crate :: pdata:: btree:: { self , * } ;
11
12
use crate :: pdata:: btree_walker:: * ;
@@ -174,47 +175,51 @@ fn mk_context(opts: &ThinDumpOptions) -> Result<Context> {
174
175
175
176
//------------------------------------------
176
177
177
- fn emit_leaf ( v : & mut MappingVisitor , b : & Block ) -> Result < ( ) > {
178
+ fn emit_leaf ( v : & mut MappingVisitor , b : & Block ) -> Result < ( ) , IoError > {
178
179
use Node :: * ;
179
180
let path = Vec :: new ( ) ;
180
181
let kr = KeyRange :: new ( ) ;
181
182
182
183
let bt = checksum:: metadata_block_type ( b. get_data ( ) ) ;
183
184
if bt != checksum:: BT :: NODE {
184
- return Err ( anyhow ! ( format !(
185
+ return Err ( IoError :: Input ( anyhow ! (
185
186
"checksum failed for node {}, {:?}" ,
186
- b. loc, bt
187
+ b. loc,
188
+ bt
187
189
) ) ) ;
188
190
}
189
191
190
- let node = unpack_node :: < BlockTime > ( & path, b. get_data ( ) , true , true ) ?;
192
+ let node = unpack_node :: < BlockTime > ( & path, b. get_data ( ) , true , true )
193
+ . map_err ( |e| IoError :: Input ( e. into ( ) ) ) ?;
191
194
192
195
match node {
193
196
Internal { .. } => {
194
- return Err ( anyhow ! ( "not a leaf" ) ) ;
197
+ return Err ( IoError :: Input ( anyhow ! ( "node {} is not a leaf" , b . loc ) ) ) ;
195
198
}
196
199
Leaf {
197
200
header,
198
201
keys,
199
202
values,
200
203
} => {
201
- v. visit ( & path, & kr, & header, & keys, & values) ?;
204
+ v. visit ( & path, & kr, & header, & keys, & values)
205
+ . map_err ( |e| IoError :: Output ( e. into ( ) ) ) ?;
202
206
}
203
207
}
204
208
205
209
Ok ( ( ) )
206
210
}
207
211
208
- fn read_for < T > ( engine : Arc < dyn IoEngine > , blocks : & [ u64 ] , mut t : T ) -> Result < ( ) >
212
+ fn read_for < T > ( engine : Arc < dyn IoEngine > , blocks : & [ u64 ] , mut t : T ) -> Result < ( ) , IoError >
209
213
where
210
- T : FnMut ( Block ) -> Result < ( ) > ,
214
+ T : FnMut ( Block ) -> Result < ( ) , IoError > ,
211
215
{
212
216
for cs in blocks. chunks ( engine. get_batch_size ( ) ) {
213
217
for b in engine
214
218
. read_many ( cs)
215
- . map_err ( |_e| anyhow ! ( "read_many failed" ) ) ?
219
+ . map_err ( |_e| IoError :: Input ( anyhow ! ( "read_many failed" ) ) ) ?
216
220
{
217
- t ( b. map_err ( |_e| anyhow ! ( "read of individual block failed" ) ) ?) ?;
221
+ let blk = b. map_err ( |_e| IoError :: Input ( anyhow ! ( "read of individual block failed" ) ) ) ?;
222
+ t ( blk) ?;
218
223
}
219
224
}
220
225
@@ -225,7 +230,7 @@ fn emit_leaves(
225
230
engine : Arc < dyn IoEngine > ,
226
231
out : & mut dyn MetadataVisitor ,
227
232
leaves : & [ u64 ] ,
228
- ) -> Result < ( ) > {
233
+ ) -> Result < ( ) , IoError > {
229
234
let mut v = MappingVisitor :: new ( out) ;
230
235
let proc = |b| {
231
236
emit_leaf ( & mut v, & b) ?;
@@ -234,14 +239,14 @@ fn emit_leaves(
234
239
235
240
read_for ( engine, leaves, proc) ?;
236
241
v. end_walk ( )
237
- . map_err ( |e| anyhow ! ( "failed to emit leaves: {}" , e) )
242
+ . map_err ( |e| IoError :: Output ( anyhow ! ( "failed to emit leaves: {}" , e) ) )
238
243
}
239
244
240
245
fn emit_entries (
241
246
engine : Arc < dyn IoEngine > ,
242
247
out : & mut dyn MetadataVisitor ,
243
248
entries : & [ Entry ] ,
244
- ) -> Result < ( ) > {
249
+ ) -> Result < ( ) , IoError > {
245
250
let mut leaves = Vec :: new ( ) ;
246
251
247
252
for e in entries {
@@ -255,7 +260,7 @@ fn emit_entries(
255
260
leaves. clear ( ) ;
256
261
}
257
262
let str = format ! ( "{}" , id) ;
258
- out. ref_shared ( & str) ?;
263
+ out. ref_shared ( & str) . map_err ( to_output_err ) ?;
259
264
}
260
265
}
261
266
}
@@ -272,8 +277,9 @@ pub fn dump_metadata(
272
277
out : & mut dyn MetadataVisitor ,
273
278
sb : & Superblock ,
274
279
md : & Metadata ,
275
- ) -> Result < ( ) > {
276
- let data_root = unpack :: < SMRoot > ( & sb. data_sm_root [ 0 ..] ) ?;
280
+ ) -> Result < ( ) , IoError > {
281
+ let data_root =
282
+ unpack :: < SMRoot > ( & sb. data_sm_root [ 0 ..] ) . map_err ( |e| IoError :: Input ( e. into ( ) ) ) ?;
277
283
let out_sb = ir:: Superblock {
278
284
uuid : "" . to_string ( ) ,
279
285
time : sb. time ,
@@ -284,12 +290,13 @@ pub fn dump_metadata(
284
290
nr_data_blocks : data_root. nr_blocks ,
285
291
metadata_snap : None ,
286
292
} ;
287
- out. superblock_b ( & out_sb) ?;
293
+ out. superblock_b ( & out_sb) . map_err ( to_output_err ) ?;
288
294
289
295
for d in & md. defs {
290
- out. def_shared_b ( & format ! ( "{}" , d. def_id) ) ?;
296
+ out. def_shared_b ( & format ! ( "{}" , d. def_id) )
297
+ . map_err ( to_output_err) ?;
291
298
emit_entries ( engine. clone ( ) , out, & d. map . entries ) ?;
292
- out. def_shared_e ( ) ?;
299
+ out. def_shared_e ( ) . map_err ( to_output_err ) ?;
293
300
}
294
301
295
302
for dev in & md. devs {
@@ -300,38 +307,42 @@ pub fn dump_metadata(
300
307
creation_time : dev. detail . creation_time ,
301
308
snap_time : dev. detail . snapshotted_time ,
302
309
} ;
303
- out. device_b ( & device) ?;
310
+ out. device_b ( & device) . map_err ( to_output_err ) ?;
304
311
emit_entries ( engine. clone ( ) , out, & dev. map . entries ) ?;
305
- out. device_e ( ) ?;
312
+ out. device_e ( ) . map_err ( to_output_err ) ?;
306
313
}
307
- out. superblock_e ( ) ?;
308
- out. eof ( ) ?;
314
+ out. superblock_e ( ) . map_err ( to_output_err ) ?;
315
+ out. eof ( ) . map_err ( to_output_err ) ?;
309
316
310
317
Ok ( ( ) )
311
318
}
312
319
313
320
//------------------------------------------
314
321
315
- pub fn dump ( opts : ThinDumpOptions ) -> Result < ( ) > {
316
- let ctx = mk_context ( & opts) ?;
322
+ pub fn dump ( opts : ThinDumpOptions ) -> Result < ( ) , IoError > {
323
+ let ctx = mk_context ( & opts) . map_err ( to_input_err ) ?;
317
324
let sb = if opts. repair {
318
325
read_or_rebuild_superblock (
319
326
ctx. engine . clone ( ) ,
320
327
ctx. report . clone ( ) ,
321
328
SUPERBLOCK_LOCATION ,
322
329
& opts. overrides ,
323
- ) ?
330
+ )
324
331
} else if opts. use_metadata_snap {
325
- read_superblock_snap ( ctx. engine . as_ref ( ) ) ?
332
+ read_superblock_snap ( ctx. engine . as_ref ( ) )
326
333
} else {
327
334
read_superblock ( ctx. engine . as_ref ( ) , SUPERBLOCK_LOCATION )
328
- . and_then ( |sb| sb. overrides ( & opts. overrides ) ) ?
329
- } ;
330
- let md = build_metadata ( ctx. engine . clone ( ) , & sb) ?;
331
- let md = optimise_metadata ( md) ?;
335
+ . and_then ( |sb| sb. overrides ( & opts. overrides ) )
336
+ }
337
+ . map_err ( to_input_err) ?;
338
+
339
+ let md = build_metadata ( ctx. engine . clone ( ) , & sb) . map_err ( to_input_err) ?;
340
+ let md = optimise_metadata ( md) . map_err ( to_input_err) ?;
332
341
333
342
let writer: Box < dyn Write > = if opts. output . is_some ( ) {
334
- Box :: new ( BufWriter :: new ( File :: create ( opts. output . unwrap ( ) ) ?) )
343
+ Box :: new ( BufWriter :: new (
344
+ File :: create ( opts. output . unwrap ( ) ) . map_err ( |e| IoError :: Output ( e. into ( ) ) ) ?,
345
+ ) )
335
346
} else {
336
347
Box :: new ( BufWriter :: new ( std:: io:: stdout ( ) ) )
337
348
} ;
0 commit comments