Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion fuzz/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/ipfs/go-datastore/fuzz
go 1.23.0

require (
github.com/ipfs/go-datastore v0.8.0
github.com/ipfs/go-datastore v0.8.2
github.com/ipfs/go-ds-flatfs v0.5.3
github.com/spf13/pflag v1.0.6
)
Expand Down
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ require (
github.com/stretchr/testify v1.10.0
go.opentelemetry.io/otel v1.37.0
go.opentelemetry.io/otel/trace v1.37.0
go.uber.org/multierr v1.11.0
)

require (
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/Wgbsd
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
Expand Down
78 changes: 28 additions & 50 deletions mount/mount.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import (

ds "github.com/ipfs/go-datastore"
"github.com/ipfs/go-datastore/query"

"go.uber.org/multierr"
)

var (
Expand Down Expand Up @@ -236,22 +234,19 @@ func (d *Datastore) Put(ctx context.Context, key ds.Key, value []byte) error {

// Sync implements Datastore.Sync
func (d *Datastore) Sync(ctx context.Context, prefix ds.Key) error {
var merr error
var errs []error

// Sync all mount points below the prefix
// Sync the mount point right at (or above) the prefix
dstores, prefixes, rest := d.lookupAll(prefix)
for i, suffix := range rest {
if err := dstores[i].Sync(ctx, suffix); err != nil {
merr = multierr.Append(merr, fmt.Errorf(
"syncing datastore at %s: %w",
prefixes[i].String(),
err,
))
err = fmt.Errorf("syncing datastore at %s: %w", prefixes[i].String(), err)
errs = append(errs, err)
}
}

return merr
return errors.Join(errs...)
}

// Get returns the value associated with the key from the appropriate datastore.
Expand Down Expand Up @@ -357,39 +352,33 @@ func (d *Datastore) Query(ctx context.Context, master query.Query) (query.Result

// Close closes all mounted datastores.
func (d *Datastore) Close() error {
var merr error
var errs []error
for _, d := range d.mounts {
err := d.Datastore.Close()
if err != nil {
merr = multierr.Append(merr, fmt.Errorf(
"closing datastore at %s: %w",
d.Prefix.String(),
err,
))
err = fmt.Errorf("closing datastore at %s: %w", d.Prefix.String(), err)
errs = append(errs, err)
}
}
return merr
return errors.Join(errs...)
}

// DiskUsage returns the sum of DiskUsages for the mounted datastores.
// Non PersistentDatastores will not be accounted.
func (d *Datastore) DiskUsage(ctx context.Context) (uint64, error) {
var (
merr error
errs []error
duTotal uint64 = 0
)
for _, d := range d.mounts {
du, err := ds.DiskUsage(ctx, d.Datastore)
duTotal += du
if err != nil {
merr = multierr.Append(merr, fmt.Errorf(
"getting disk usage at %s: %w",
d.Prefix.String(),
err,
))
err = fmt.Errorf("getting disk usage at %s: %w", d.Prefix.String(), err)
errs = append(errs, err)
}
}
return duTotal, merr
return duTotal, errors.Join(errs...)
}

type mountBatch struct {
Expand Down Expand Up @@ -452,62 +441,51 @@ func (mt *mountBatch) Commit(ctx context.Context) error {
mt.lk.Lock()
defer mt.lk.Unlock()

var merr error
var errs []error
for p, t := range mt.mounts {
if err := t.Commit(ctx); err != nil {
merr = multierr.Append(merr, fmt.Errorf(
"committing batch to datastore at %s: %w",
p, err,
))
err = fmt.Errorf("committing batch to datastore at %s: %w", p, err)
errs = append(errs, err)
}
}
return merr
return errors.Join(errs...)
}

func (d *Datastore) Check(ctx context.Context) error {
var merr error
var errs []error
for _, m := range d.mounts {
if c, ok := m.Datastore.(ds.CheckedDatastore); ok {
if err := c.Check(ctx); err != nil {
merr = multierr.Append(merr, fmt.Errorf(
"checking datastore at %s: %w",
m.Prefix.String(),
err,
))
err = fmt.Errorf("checking datastore at %s: %w", m.Prefix.String(), err)
errs = append(errs, err)
}
}
}
return merr
return errors.Join(errs...)
}

func (d *Datastore) Scrub(ctx context.Context) error {
var merr error
var errs []error
for _, m := range d.mounts {
if c, ok := m.Datastore.(ds.ScrubbedDatastore); ok {
if err := c.Scrub(ctx); err != nil {
merr = multierr.Append(merr, fmt.Errorf(
"scrubbing datastore at %s: %w",
m.Prefix.String(),
err,
))
err = fmt.Errorf("scrubbing datastore at %s: %w", m.Prefix.String(), err)
errs = append(errs, err)
}
}
}
return merr
return errors.Join(errs...)
}

func (d *Datastore) CollectGarbage(ctx context.Context) error {
var merr error
var errs []error
for _, m := range d.mounts {
if c, ok := m.Datastore.(ds.GCDatastore); ok {
if err := c.CollectGarbage(ctx); err != nil {
merr = multierr.Append(merr, fmt.Errorf(
"gc on datastore at %s: %w",
m.Prefix.String(),
err,
))
err = fmt.Errorf("gc on datastore at %s: %w", m.Prefix.String(), err)
errs = append(errs, err)
}
}
}
return merr
return errors.Join(errs...)
}
Loading