@@ -5,13 +5,15 @@ package mount
5
5
import (
6
6
"container/heap"
7
7
"errors"
8
+ "fmt"
8
9
"sort"
9
10
"strings"
10
11
"sync"
11
12
12
13
ds "github.com/ipfs/go-datastore"
13
14
"github.com/ipfs/go-datastore/query"
14
- xerrors "golang.org/x/xerrors"
15
+
16
+ "go.uber.org/multierr"
15
17
)
16
18
17
19
var (
@@ -240,16 +242,22 @@ func (d *Datastore) Put(key ds.Key, value []byte) error {
240
242
241
243
// Sync implements Datastore.Sync
242
244
func (d * Datastore ) Sync (prefix ds.Key ) error {
245
+ var merr error
246
+
243
247
// Sync all mount points below the prefix
244
248
// Sync the mount point right at (or above) the prefix
245
- dstores , _ , rest := d .lookupAll (prefix )
249
+ dstores , prefixes , rest := d .lookupAll (prefix )
246
250
for i , suffix := range rest {
247
251
if err := dstores [i ].Sync (suffix ); err != nil {
248
- return err
252
+ merr = multierr .Append (merr , fmt .Errorf (
253
+ "syncing datastore at %s: %w" ,
254
+ prefixes [i ].String (),
255
+ err ,
256
+ ))
249
257
}
250
258
}
251
259
252
- return nil
260
+ return merr
253
261
}
254
262
255
263
// Get returns the value associated with the key from the appropriate datastore.
@@ -355,27 +363,39 @@ func (d *Datastore) Query(master query.Query) (query.Results, error) {
355
363
356
364
// Close closes all mounted datastores.
357
365
func (d * Datastore ) Close () error {
366
+ var merr error
358
367
for _ , d := range d .mounts {
359
368
err := d .Datastore .Close ()
360
369
if err != nil {
361
- return err
370
+ merr = multierr .Append (merr , fmt .Errorf (
371
+ "closing datastore at %s: %w" ,
372
+ d .Prefix .String (),
373
+ err ,
374
+ ))
362
375
}
363
376
}
364
- return nil
377
+ return merr
365
378
}
366
379
367
380
// DiskUsage returns the sum of DiskUsages for the mounted datastores.
368
381
// Non PersistentDatastores will not be accounted.
369
382
func (d * Datastore ) DiskUsage () (uint64 , error ) {
370
- var duTotal uint64 = 0
383
+ var (
384
+ merr error
385
+ duTotal uint64 = 0
386
+ )
371
387
for _ , d := range d .mounts {
372
388
du , err := ds .DiskUsage (d .Datastore )
373
389
duTotal += du
374
390
if err != nil {
375
- return duTotal , err
391
+ merr = multierr .Append (merr , fmt .Errorf (
392
+ "getting disk usage at %s: %w" ,
393
+ d .Prefix .String (),
394
+ err ,
395
+ ))
376
396
}
377
397
}
378
- return duTotal , nil
398
+ return duTotal , merr
379
399
}
380
400
381
401
type mountBatch struct {
@@ -436,44 +456,62 @@ func (mt *mountBatch) Commit() error {
436
456
mt .lk .Lock ()
437
457
defer mt .lk .Unlock ()
438
458
439
- for _ , t := range mt .mounts {
440
- err := t .Commit ()
441
- if err != nil {
442
- return err
459
+ var merr error
460
+ for p , t := range mt .mounts {
461
+ if err := t .Commit (); err != nil {
462
+ merr = multierr .Append (merr , fmt .Errorf (
463
+ "committing batch to datastore at %s: %w" ,
464
+ p , err ,
465
+ ))
443
466
}
444
467
}
445
- return nil
468
+ return merr
446
469
}
447
470
448
471
func (d * Datastore ) Check () error {
472
+ var merr error
449
473
for _ , m := range d .mounts {
450
474
if c , ok := m .Datastore .(ds.CheckedDatastore ); ok {
451
475
if err := c .Check (); err != nil {
452
- return xerrors .Errorf ("checking datastore at %s: %w" , m .Prefix .String (), err )
476
+ merr = multierr .Append (merr , fmt .Errorf (
477
+ "checking datastore at %s: %w" ,
478
+ m .Prefix .String (),
479
+ err ,
480
+ ))
453
481
}
454
482
}
455
483
}
456
- return nil
484
+ return merr
457
485
}
458
486
459
487
func (d * Datastore ) Scrub () error {
488
+ var merr error
460
489
for _ , m := range d .mounts {
461
490
if c , ok := m .Datastore .(ds.ScrubbedDatastore ); ok {
462
491
if err := c .Scrub (); err != nil {
463
- return xerrors .Errorf ("scrubbing datastore at %s: %w" , m .Prefix .String (), err )
492
+ merr = multierr .Append (merr , fmt .Errorf (
493
+ "scrubbing datastore at %s: %w" ,
494
+ m .Prefix .String (),
495
+ err ,
496
+ ))
464
497
}
465
498
}
466
499
}
467
- return nil
500
+ return merr
468
501
}
469
502
470
503
func (d * Datastore ) CollectGarbage () error {
504
+ var merr error
471
505
for _ , m := range d .mounts {
472
506
if c , ok := m .Datastore .(ds.GCDatastore ); ok {
473
507
if err := c .CollectGarbage (); err != nil {
474
- return xerrors .Errorf ("gc on datastore at %s: %w" , m .Prefix .String (), err )
508
+ merr = multierr .Append (merr , fmt .Errorf (
509
+ "gc on datastore at %s: %w" ,
510
+ m .Prefix .String (),
511
+ err ,
512
+ ))
475
513
}
476
514
}
477
515
}
478
- return nil
516
+ return merr
479
517
}
0 commit comments