diff --git a/convert.go b/convert.go index 58a12fb..25e67eb 100644 --- a/convert.go +++ b/convert.go @@ -4,6 +4,7 @@ package flatfs import ( + "context" "errors" "fmt" "io" @@ -59,7 +60,7 @@ func Move(oldPath string, newPath string, out io.Writer) error { } newDS.deactivate() - res, err := oldDS.Query(query.Query{KeysOnly: true}) + res, err := oldDS.Query(context.Background(), query.Query{KeysOnly: true}) if err != nil { return err } diff --git a/convert_test.go b/convert_test.go index a8e8a5e..45ebf29 100644 --- a/convert_test.go +++ b/convert_test.go @@ -211,7 +211,7 @@ func populateDatastore(t *testing.T, dir string) ([]datastore.Key, [][]byte) { key := "X" + base32.StdEncoding.EncodeToString(blk[:8]) keys = append(keys, datastore.NewKey(key)) - err := ds.Put(keys[i], blocks[i]) + err := ds.Put(bg, keys[i], blocks[i]) if err != nil { t.Fatalf("Put fail: %v\n", err) } @@ -228,7 +228,7 @@ func checkKeys(t *testing.T, dir string, keys []datastore.Key, blocks [][]byte) defer ds.Close() for i, key := range keys { - data, err := ds.Get(key) + data, err := ds.Get(bg, key) if err != nil { t.Fatalf("Get fail: %v\n", err) } diff --git a/flatfs.go b/flatfs.go index 40be67d..fefb33d 100644 --- a/flatfs.go +++ b/flatfs.go @@ -4,6 +4,7 @@ package flatfs import ( + "context" "encoding/json" "errors" "fmt" @@ -393,7 +394,7 @@ func (fs *Datastore) renameAndUpdateDiskUsage(tmpPath, path string) error { // one arrived slightly later than the other. In the case of a // concurrent Put and a Delete operation, we cannot guarantee which one // will win. -func (fs *Datastore) Put(key datastore.Key, value []byte) error { +func (fs *Datastore) Put(ctx context.Context, key datastore.Key, value []byte) error { if !keyIsValid(key) { return fmt.Errorf("when putting '%q': %v", key, ErrInvalidKey) } @@ -412,7 +413,7 @@ func (fs *Datastore) Put(key datastore.Key, value []byte) error { return err } -func (fs *Datastore) Sync(prefix datastore.Key) error { +func (fs *Datastore) Sync(ctx context.Context, prefix datastore.Key) error { fs.shutdownLock.RLock() defer fs.shutdownLock.RUnlock() if fs.shutdown { @@ -644,7 +645,7 @@ func (fs *Datastore) putMany(data map[datastore.Key][]byte) error { return nil } -func (fs *Datastore) Get(key datastore.Key) (value []byte, err error) { +func (fs *Datastore) Get(ctx context.Context, key datastore.Key) (value []byte, err error) { // Can't exist in datastore. if !keyIsValid(key) { return nil, datastore.ErrNotFound @@ -662,7 +663,7 @@ func (fs *Datastore) Get(key datastore.Key) (value []byte, err error) { return data, nil } -func (fs *Datastore) Has(key datastore.Key) (exists bool, err error) { +func (fs *Datastore) Has(ctx context.Context, key datastore.Key) (exists bool, err error) { // Can't exist in datastore. if !keyIsValid(key) { return false, nil @@ -679,7 +680,7 @@ func (fs *Datastore) Has(key datastore.Key) (exists bool, err error) { } } -func (fs *Datastore) GetSize(key datastore.Key) (size int, err error) { +func (fs *Datastore) GetSize(ctx context.Context, key datastore.Key) (size int, err error) { // Can't exist in datastore. if !keyIsValid(key) { return -1, datastore.ErrNotFound @@ -699,7 +700,7 @@ func (fs *Datastore) GetSize(key datastore.Key) (size int, err error) { // Delete removes a key/value from the Datastore. Please read // the Put() explanation about the handling of concurrent write // operations to the same key. -func (fs *Datastore) Delete(key datastore.Key) error { +func (fs *Datastore) Delete(ctx context.Context, key datastore.Key) error { // Can't exist in datastore. if !keyIsValid(key) { return nil @@ -744,7 +745,7 @@ func (fs *Datastore) doDelete(key datastore.Key) error { return err } -func (fs *Datastore) Query(q query.Query) (query.Results, error) { +func (fs *Datastore) Query(ctx context.Context, q query.Query) (query.Results, error) { prefix := datastore.NewKey(q.Prefix).String() if prefix != "/" { // This datastore can't include keys with multiple components. @@ -1203,7 +1204,7 @@ type flatfsBatch struct { ds *Datastore } -func (fs *Datastore) Batch() (datastore.Batch, error) { +func (fs *Datastore) Batch(_ context.Context) (datastore.Batch, error) { return &flatfsBatch{ puts: make(map[datastore.Key][]byte), deletes: make(map[datastore.Key]struct{}), @@ -1211,7 +1212,7 @@ func (fs *Datastore) Batch() (datastore.Batch, error) { }, nil } -func (bt *flatfsBatch) Put(key datastore.Key, val []byte) error { +func (bt *flatfsBatch) Put(ctx context.Context, key datastore.Key, val []byte) error { if !keyIsValid(key) { return fmt.Errorf("when putting '%q': %v", key, ErrInvalidKey) } @@ -1219,20 +1220,20 @@ func (bt *flatfsBatch) Put(key datastore.Key, val []byte) error { return nil } -func (bt *flatfsBatch) Delete(key datastore.Key) error { +func (bt *flatfsBatch) Delete(ctx context.Context, key datastore.Key) error { if keyIsValid(key) { bt.deletes[key] = struct{}{} } // otherwise, delete is a no-op anyways. return nil } -func (bt *flatfsBatch) Commit() error { +func (bt *flatfsBatch) Commit(ctx context.Context) error { if err := bt.ds.putMany(bt.puts); err != nil { return err } for k := range bt.deletes { - if err := bt.ds.Delete(k); err != nil { + if err := bt.ds.Delete(ctx, k); err != nil { return err } } diff --git a/flatfs_test.go b/flatfs_test.go index 9ede51a..d8438e5 100644 --- a/flatfs_test.go +++ b/flatfs_test.go @@ -1,6 +1,7 @@ package flatfs_test import ( + "context" "encoding/base32" "encoding/json" "fmt" @@ -20,9 +21,11 @@ import ( "github.com/ipfs/go-datastore/query" dstest "github.com/ipfs/go-datastore/test" - "github.com/ipfs/go-ds-flatfs" + flatfs "github.com/ipfs/go-ds-flatfs" ) +var bg = context.Background() + func checkTemp(t *testing.T, dir string) { tempDir, err := os.Open(filepath.Join(dir, ".temp")) if err != nil { @@ -78,18 +81,18 @@ func testBatch(dirFunc mkShardFunc, t *testing.T) { batches := make([]datastore.Batch, 9) for i := range batches { - batch, err := fs.Batch() + batch, err := fs.Batch(bg) if err != nil { t.Fatal(err) } batches[i] = batch - err = batch.Put(datastore.NewKey("QUUX"), []byte("foo")) + err = batch.Put(bg, datastore.NewKey("QUUX"), []byte("foo")) if err != nil { t.Fatal(err) } - err = batch.Put(datastore.NewKey(fmt.Sprintf("Q%dX", i)), []byte(fmt.Sprintf("bar%d", i))) + err = batch.Put(bg, datastore.NewKey(fmt.Sprintf("Q%dX", i)), []byte(fmt.Sprintf("bar%d", i))) if err != nil { t.Fatal(err) } @@ -101,7 +104,7 @@ func testBatch(dirFunc mkShardFunc, t *testing.T) { batch := batch go func() { defer wg.Done() - err := batch.Commit() + err := batch.Commit(bg) if err != nil { t.Error(err) } @@ -109,7 +112,7 @@ func testBatch(dirFunc mkShardFunc, t *testing.T) { } check := func(key, expected string) { - actual, err := fs.Get(datastore.NewKey(key)) + actual, err := fs.Get(bg, datastore.NewKey(key)) if err != nil { t.Fatalf("get for key %s, error: %s", key, err) } @@ -139,12 +142,12 @@ func testPut(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - err = fs.Put(datastore.NewKey("QUUX"), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } - err = fs.Put(datastore.NewKey("foo"), []byte("nonono")) + err = fs.Put(bg, datastore.NewKey("foo"), []byte("nonono")) if err == nil { t.Fatalf("did not expect to put a lowercase key") } @@ -164,12 +167,12 @@ func testGet(dirFunc mkShardFunc, t *testing.T) { defer fs.Close() const input = "foobar" - err = fs.Put(datastore.NewKey("QUUX"), []byte(input)) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte(input)) if err != nil { t.Fatalf("Put fail: %v\n", err) } - buf, err := fs.Get(datastore.NewKey("QUUX")) + buf, err := fs.Get(bg, datastore.NewKey("QUUX")) if err != nil { t.Fatalf("Get failed: %v", err) } @@ -177,7 +180,7 @@ func testGet(dirFunc mkShardFunc, t *testing.T) { t.Fatalf("Get gave wrong content: %q != %q", g, e) } - _, err = fs.Get(datastore.NewKey("/FOO/BAR")) + _, err = fs.Get(bg, datastore.NewKey("/FOO/BAR")) if err != datastore.ErrNotFound { t.Fatalf("expected ErrNotFound, got %s", err) } @@ -200,17 +203,17 @@ func testPutOverwrite(dirFunc mkShardFunc, t *testing.T) { loser = "foobar" winner = "xyzzy" ) - err = fs.Put(datastore.NewKey("QUUX"), []byte(loser)) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte(loser)) if err != nil { t.Fatalf("Put fail: %v\n", err) } - err = fs.Put(datastore.NewKey("QUUX"), []byte(winner)) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte(winner)) if err != nil { t.Fatalf("Put fail: %v\n", err) } - data, err := fs.Get(datastore.NewKey("QUUX")) + data, err := fs.Get(bg, datastore.NewKey("QUUX")) if err != nil { t.Fatalf("Get failed: %v", err) } @@ -232,7 +235,7 @@ func testGetNotFoundError(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - _, err = fs.Get(datastore.NewKey("QUUX")) + _, err = fs.Get(bg, datastore.NewKey("QUUX")) if g, e := err, datastore.ErrNotFound; g != e { t.Fatalf("expected ErrNotFound, got: %v\n", g) } @@ -258,7 +261,7 @@ func testStorage(p *params, t *testing.T) { } defer fs.Close() - err = fs.Put(datastore.NewKey(p.key), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey(p.key), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } @@ -352,7 +355,7 @@ func testHasNotFound(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - found, err := fs.Has(datastore.NewKey("QUUX")) + found, err := fs.Has(bg, datastore.NewKey("QUUX")) if err != nil { t.Fatalf("Has fail: %v\n", err) } @@ -374,12 +377,12 @@ func testHasFound(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - err = fs.Put(datastore.NewKey("QUUX"), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } - found, err := fs.Has(datastore.NewKey("QUUX")) + found, err := fs.Has(bg, datastore.NewKey("QUUX")) if err != nil { t.Fatalf("Has fail: %v\n", err) } @@ -401,7 +404,7 @@ func testGetSizeFound(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - _, err = fs.GetSize(datastore.NewKey("QUUX")) + _, err = fs.GetSize(bg, datastore.NewKey("QUUX")) if err != datastore.ErrNotFound { t.Fatalf("GetSize should have returned ErrNotFound, got: %v\n", err) } @@ -420,12 +423,12 @@ func testGetSizeNotFound(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - err = fs.Put(datastore.NewKey("QUUX"), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } - size, err := fs.GetSize(datastore.NewKey("QUUX")) + size, err := fs.GetSize(bg, datastore.NewKey("QUUX")) if err != nil { t.Fatalf("GetSize failed with: %v\n", err) } @@ -447,7 +450,7 @@ func testDeleteNotFound(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - err = fs.Delete(datastore.NewKey("QUUX")) + err = fs.Delete(bg, datastore.NewKey("QUUX")) if err != nil { t.Fatalf("expected nil, got: %v\n", err) } @@ -466,18 +469,18 @@ func testDeleteFound(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - err = fs.Put(datastore.NewKey("QUUX"), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } - err = fs.Delete(datastore.NewKey("QUUX")) + err = fs.Delete(bg, datastore.NewKey("QUUX")) if err != nil { t.Fatalf("Delete fail: %v\n", err) } // check that it's gone - _, err = fs.Get(datastore.NewKey("QUUX")) + _, err = fs.Get(bg, datastore.NewKey("QUUX")) if g, e := err, datastore.ErrNotFound; g != e { t.Fatalf("expected Get after Delete to give ErrNotFound, got: %v\n", g) } @@ -497,12 +500,12 @@ func testQuerySimple(dirFunc mkShardFunc, t *testing.T) { defer fs.Close() const myKey = "QUUX" - err = fs.Put(datastore.NewKey(myKey), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey(myKey), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } - res, err := fs.Query(query.Query{KeysOnly: true}) + res, err := fs.Query(bg, query.Query{KeysOnly: true}) if err != nil { t.Fatalf("Query fail: %v\n", err) } @@ -548,7 +551,7 @@ func testDiskUsage(dirFunc mkShardFunc, t *testing.T) { for i := 0; i < count; i++ { k := datastore.NewKey(fmt.Sprintf("TEST-%d", i)) v := []byte("10bytes---") - err = fs.Put(k, v) + err = fs.Put(bg, k, v) if err != nil { t.Fatalf("Put fail: %v\n", err) } @@ -563,7 +566,7 @@ func testDiskUsage(dirFunc mkShardFunc, t *testing.T) { for i := 0; i < count; i++ { k := datastore.NewKey(fmt.Sprintf("TEST-%d", i)) - err = fs.Delete(k) + err = fs.Delete(bg, k) if err != nil { t.Fatalf("Delete fail: %v\n", err) } @@ -667,7 +670,7 @@ func testDiskUsageDoubleCount(dirFunc mkShardFunc, t *testing.T) { defer wg.Done() for i := 0; i < count; i++ { v := []byte("10bytes---") - err := fs.Put(testKey, v) + err := fs.Put(bg, testKey, v) if err != nil { t.Errorf("Put fail: %v\n", err) } @@ -677,7 +680,7 @@ func testDiskUsageDoubleCount(dirFunc mkShardFunc, t *testing.T) { del := func() { defer wg.Done() for i := 0; i < count; i++ { - err := fs.Delete(testKey) + err := fs.Delete(bg, testKey) if err != nil && !strings.Contains(err.Error(), "key not found") { t.Errorf("Delete fail: %v\n", err) } @@ -706,7 +709,7 @@ func testDiskUsageDoubleCount(dirFunc mkShardFunc, t *testing.T) { wg.Wait() du3, _ := fs.DiskUsage() - has, err := fs.Has(testKey) + has, err := fs.Has(bg, testKey) if err != nil { t.Fatal(err) } @@ -733,7 +736,7 @@ func testDiskUsageBatch(dirFunc mkShardFunc, t *testing.T) { } defer fs.Close() - fsBatch, err := fs.Batch() + fsBatch, err := fs.Batch(bg) if err != nil { t.Fatal(err) } @@ -748,7 +751,7 @@ func testDiskUsageBatch(dirFunc mkShardFunc, t *testing.T) { put := func() { for i := 0; i < count; i++ { - err := fsBatch.Put(testKeys[i], []byte("10bytes---")) + err := fsBatch.Put(bg, testKeys[i], []byte("10bytes---")) if err != nil { t.Error(err) } @@ -756,7 +759,7 @@ func testDiskUsageBatch(dirFunc mkShardFunc, t *testing.T) { } commit := func() { defer wg.Done() - err := fsBatch.Commit() + err := fsBatch.Commit(bg) if err != nil { t.Errorf("Batch Put fail: %v\n", err) } @@ -765,7 +768,7 @@ func testDiskUsageBatch(dirFunc mkShardFunc, t *testing.T) { del := func() { defer wg.Done() for _, k := range testKeys { - err := fs.Delete(k) + err := fs.Delete(bg, k) if err != nil && !strings.Contains(err.Error(), "key not found") { t.Errorf("Delete fail: %v\n", err) } @@ -802,7 +805,7 @@ func testDiskUsageBatch(dirFunc mkShardFunc, t *testing.T) { t.Fatal(err) } // Now query how many keys we have - results, err := fs.Query(query.Query{ + results, err := fs.Query(bg, query.Query{ KeysOnly: true, }) if err != nil { @@ -838,7 +841,7 @@ func testDiskUsageEstimation(dirFunc mkShardFunc, t *testing.T) { for i := 0; i < count; i++ { k := datastore.NewKey(fmt.Sprintf("%d-TEST-%d", i, i)) v := make([]byte, 1000) - err = fs.Put(k, v) + err = fs.Put(bg, k, v) if err != nil { t.Fatalf("Put fail: %v\n", err) } @@ -950,14 +953,14 @@ func testClose(dirFunc mkShardFunc, t *testing.T) { t.Fatalf("New fail: %v\n", err) } - err = fs.Put(datastore.NewKey("QUUX"), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey("QUUX"), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } fs.Close() - err = fs.Put(datastore.NewKey("QAAX"), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey("QAAX"), []byte("foobar")) if err == nil { t.Fatal("expected put on closed datastore to fail") } @@ -1038,7 +1041,7 @@ func TestNoCluster(t *testing.T) { r.Read(blk) key := "CIQ" + base32.StdEncoding.EncodeToString(blk[:10]) - err := fs.Put(datastore.NewKey(key), blk) + err := fs.Put(bg, datastore.NewKey(key), blk) if err != nil { t.Fatalf("Put fail: %v\n", err) } @@ -1097,7 +1100,7 @@ func BenchmarkConsecutivePut(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - err := fs.Put(keys[i], blocks[i]) + err := fs.Put(bg, keys[i], blocks[i]) if err != nil { b.Fatal(err) } @@ -1129,18 +1132,18 @@ func BenchmarkBatchedPut(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; { - batch, err := fs.Batch() + batch, err := fs.Batch(bg) if err != nil { b.Fatal(err) } for n := i; i-n < 512 && i < b.N; i++ { - err := batch.Put(keys[i], blocks[i]) + err := batch.Put(bg, keys[i], blocks[i]) if err != nil { b.Fatal(err) } } - err = batch.Commit() + err = batch.Commit(bg) if err != nil { b.Fatal(err) } @@ -1159,7 +1162,7 @@ func TestQueryLeak(t *testing.T) { defer fs.Close() for i := 0; i < 1000; i++ { - err = fs.Put(datastore.NewKey(fmt.Sprint(i)), []byte("foobar")) + err = fs.Put(bg, datastore.NewKey(fmt.Sprint(i)), []byte("foobar")) if err != nil { t.Fatalf("Put fail: %v\n", err) } @@ -1167,7 +1170,7 @@ func TestQueryLeak(t *testing.T) { before := runtime.NumGoroutine() for i := 0; i < 200; i++ { - res, err := fs.Query(query.Query{KeysOnly: true}) + res, err := fs.Query(bg, query.Query{KeysOnly: true}) if err != nil { t.Errorf("Query fail: %v\n", err) } diff --git a/go.mod b/go.mod index 91d9d3e..7905373 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/ipfs/go-ds-flatfs require ( github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 - github.com/ipfs/go-datastore v0.4.4 + github.com/ipfs/go-datastore v0.5.0 github.com/ipfs/go-log v1.0.3 github.com/jbenet/goprocess v0.1.4 ) diff --git a/go.sum b/go.sum index 315861c..3b917f0 100644 --- a/go.sum +++ b/go.sum @@ -1,26 +1,32 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/ipfs/go-datastore v0.4.4 h1:rjvQ9+muFaJ+QZ7dN5B1MSDNQ0JVZKkkES/rMZmA8X8= -github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-log v1.0.3 h1:Gg7SUYSZ7BrqaKMwM+hRgcAkKv4QLfzP4XPQt5Sx/OI= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log/v2 v2.0.3 h1:Q2gXcBoCALyLN/pUQlz1qgu0x3uFV6FzP9oXhpfyJpc= github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -30,20 +36,46 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=