diff --git a/datastore.go b/datastore.go index ed074e5..2f50399 100644 --- a/datastore.go +++ b/datastore.go @@ -1,6 +1,7 @@ package badger import ( + "context" "errors" "fmt" "runtime" @@ -210,7 +211,7 @@ func (d *Datastore) periodicGC() { // NewTransaction starts a new transaction. The resulting transaction object // can be mutated without incurring changes to the underlying Datastore until // the transaction is Committed. -func (d *Datastore) NewTransaction(readOnly bool) (ds.Txn, error) { +func (d *Datastore) NewTransaction(ctx context.Context, readOnly bool) (ds.Txn, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -226,7 +227,7 @@ func (d *Datastore) newImplicitTransaction(readOnly bool) *txn { return &txn{d, d.DB.NewTransaction(!readOnly), true} } -func (d *Datastore) Put(key ds.Key, value []byte) error { +func (d *Datastore) Put(ctx context.Context, key ds.Key, value []byte) error { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -243,7 +244,7 @@ func (d *Datastore) Put(key ds.Key, value []byte) error { return txn.commit() } -func (d *Datastore) Sync(prefix ds.Key) error { +func (d *Datastore) Sync(ctx context.Context, prefix ds.Key) error { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -257,7 +258,7 @@ func (d *Datastore) Sync(prefix ds.Key) error { return d.DB.Sync() } -func (d *Datastore) PutWithTTL(key ds.Key, value []byte, ttl time.Duration) error { +func (d *Datastore) PutWithTTL(ctx context.Context, key ds.Key, value []byte, ttl time.Duration) error { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -274,7 +275,7 @@ func (d *Datastore) PutWithTTL(key ds.Key, value []byte, ttl time.Duration) erro return txn.commit() } -func (d *Datastore) SetTTL(key ds.Key, ttl time.Duration) error { +func (d *Datastore) SetTTL(ctx context.Context, key ds.Key, ttl time.Duration) error { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -291,7 +292,7 @@ func (d *Datastore) SetTTL(key ds.Key, ttl time.Duration) error { return txn.commit() } -func (d *Datastore) GetExpiration(key ds.Key) (time.Time, error) { +func (d *Datastore) GetExpiration(ctx context.Context, key ds.Key) (time.Time, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -304,7 +305,7 @@ func (d *Datastore) GetExpiration(key ds.Key) (time.Time, error) { return txn.getExpiration(key) } -func (d *Datastore) Get(key ds.Key) (value []byte, err error) { +func (d *Datastore) Get(ctx context.Context, key ds.Key) (value []byte, err error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -317,7 +318,7 @@ func (d *Datastore) Get(key ds.Key) (value []byte, err error) { return txn.get(key) } -func (d *Datastore) Has(key ds.Key) (bool, error) { +func (d *Datastore) Has(ctx context.Context, key ds.Key) (bool, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -330,7 +331,7 @@ func (d *Datastore) Has(key ds.Key) (bool, error) { return txn.has(key) } -func (d *Datastore) GetSize(key ds.Key) (size int, err error) { +func (d *Datastore) GetSize(ctx context.Context, key ds.Key) (size int, err error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -343,7 +344,7 @@ func (d *Datastore) GetSize(key ds.Key) (size int, err error) { return txn.getSize(key) } -func (d *Datastore) Delete(key ds.Key) error { +func (d *Datastore) Delete(ctx context.Context, key ds.Key) error { d.closeLk.RLock() defer d.closeLk.RUnlock() @@ -358,7 +359,7 @@ func (d *Datastore) Delete(key ds.Key) error { return txn.commit() } -func (d *Datastore) Query(q dsq.Query) (dsq.Results, error) { +func (d *Datastore) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -374,7 +375,7 @@ func (d *Datastore) Query(q dsq.Query) (dsq.Results, error) { // DiskUsage implements the PersistentDatastore interface. // It returns the sum of lsm and value log files sizes in bytes. -func (d *Datastore) DiskUsage() (uint64, error) { +func (d *Datastore) DiskUsage(ctx context.Context) (uint64, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -399,7 +400,7 @@ func (d *Datastore) Close() error { // Batch creats a new Batch object. This provides a way to do many writes, when // there may be too many to fit into a single transaction. -func (d *Datastore) Batch() (ds.Batch, error) { +func (d *Datastore) Batch(ctx context.Context) (ds.Batch, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.closed { @@ -417,7 +418,7 @@ func (d *Datastore) Batch() (ds.Batch, error) { return b, nil } -func (d *Datastore) CollectGarbage() (err error) { +func (d *Datastore) CollectGarbage(ctx context.Context) (err error) { // The idea is to keep calling DB.RunValueLogGC() till Badger no longer has any log files // to GC(which would be indicated by an error, please refer to Badger GC docs). for err == nil { @@ -444,7 +445,7 @@ func (d *Datastore) gcOnce() error { var _ ds.Batch = (*batch)(nil) -func (b *batch) Put(key ds.Key, value []byte) error { +func (b *batch) Put(ctx context.Context, key ds.Key, value []byte) error { b.ds.closeLk.RLock() defer b.ds.closeLk.RUnlock() if b.ds.closed { @@ -457,7 +458,7 @@ func (b *batch) put(key ds.Key, value []byte) error { return b.writeBatch.Set(key.Bytes(), value) } -func (b *batch) Delete(key ds.Key) error { +func (b *batch) Delete(ctx context.Context, key ds.Key) error { b.ds.closeLk.RLock() defer b.ds.closeLk.RUnlock() if b.ds.closed { @@ -471,7 +472,7 @@ func (b *batch) delete(key ds.Key) error { return b.writeBatch.Delete(key.Bytes()) } -func (b *batch) Commit() error { +func (b *batch) Commit(ctx context.Context) error { b.ds.closeLk.RLock() defer b.ds.closeLk.RUnlock() if b.ds.closed { @@ -511,7 +512,7 @@ func (b *batch) cancel() { var _ ds.Datastore = (*txn)(nil) var _ ds.TTLDatastore = (*txn)(nil) -func (t *txn) Put(key ds.Key, value []byte) error { +func (t *txn) Put(ctx context.Context, key ds.Key, value []byte) error { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -524,7 +525,7 @@ func (t *txn) put(key ds.Key, value []byte) error { return t.txn.Set(key.Bytes(), value) } -func (t *txn) Sync(prefix ds.Key) error { +func (t *txn) Sync(ctx context.Context, prefix ds.Key) error { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -534,7 +535,7 @@ func (t *txn) Sync(prefix ds.Key) error { return nil } -func (t *txn) PutWithTTL(key ds.Key, value []byte, ttl time.Duration) error { +func (t *txn) PutWithTTL(ctx context.Context, key ds.Key, value []byte, ttl time.Duration) error { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -547,7 +548,7 @@ func (t *txn) putWithTTL(key ds.Key, value []byte, ttl time.Duration) error { return t.txn.SetEntry(badger.NewEntry(key.Bytes(), value).WithTTL(ttl)) } -func (t *txn) GetExpiration(key ds.Key) (time.Time, error) { +func (t *txn) GetExpiration(ctx context.Context, key ds.Key) (time.Time, error) { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -567,7 +568,7 @@ func (t *txn) getExpiration(key ds.Key) (time.Time, error) { return time.Unix(int64(item.ExpiresAt()), 0), nil } -func (t *txn) SetTTL(key ds.Key, ttl time.Duration) error { +func (t *txn) SetTTL(ctx context.Context, key ds.Key, ttl time.Duration) error { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -588,7 +589,7 @@ func (t *txn) setTTL(key ds.Key, ttl time.Duration) error { } -func (t *txn) Get(key ds.Key) ([]byte, error) { +func (t *txn) Get(ctx context.Context, key ds.Key) ([]byte, error) { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -610,7 +611,7 @@ func (t *txn) get(key ds.Key) ([]byte, error) { return item.ValueCopy(nil) } -func (t *txn) Has(key ds.Key) (bool, error) { +func (t *txn) Has(ctx context.Context, key ds.Key) (bool, error) { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -632,7 +633,7 @@ func (t *txn) has(key ds.Key) (bool, error) { } } -func (t *txn) GetSize(key ds.Key) (int, error) { +func (t *txn) GetSize(ctx context.Context, key ds.Key) (int, error) { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -654,7 +655,7 @@ func (t *txn) getSize(key ds.Key) (int, error) { } } -func (t *txn) Delete(key ds.Key) error { +func (t *txn) Delete(ctx context.Context, key ds.Key) error { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -668,7 +669,7 @@ func (t *txn) delete(key ds.Key) error { return t.txn.Delete(key.Bytes()) } -func (t *txn) Query(q dsq.Query) (dsq.Results, error) { +func (t *txn) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -857,7 +858,7 @@ func (t *txn) query(q dsq.Query) (dsq.Results, error) { return qrb.Results(), nil } -func (t *txn) Commit() error { +func (t *txn) Commit(ctx context.Context) error { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { @@ -885,7 +886,7 @@ func (t *txn) close() error { return t.txn.Commit() } -func (t *txn) Discard() { +func (t *txn) Discard(ctx context.Context) { t.ds.closeLk.RLock() defer t.ds.closeLk.RUnlock() if t.ds.closed { diff --git a/ds_test.go b/ds_test.go index 34998a5..1ca2cee 100644 --- a/ds_test.go +++ b/ds_test.go @@ -2,6 +2,7 @@ package badger import ( "bytes" + "context" "fmt" "io/ioutil" "math/rand" @@ -15,6 +16,8 @@ import ( dstest "github.com/ipfs/go-datastore/test" ) +var bg = context.Background() + var testcases = map[string]string{ "/a": "a", "/a/b": "ab", @@ -51,14 +54,14 @@ func newDS(t *testing.T) (*Datastore, func()) { func addTestCases(t *testing.T, d *Datastore, testcases map[string]string) { for k, v := range testcases { dsk := ds.NewKey(k) - if err := d.Put(dsk, []byte(v)); err != nil { + if err := d.Put(bg, dsk, []byte(v)); err != nil { t.Fatal(err) } } for k, v := range testcases { dsk := ds.NewKey(k) - v2, err := d.Get(dsk) + v2, err := d.Get(bg, dsk) if err != nil { t.Fatal(err) } @@ -73,7 +76,7 @@ func TestQuery(t *testing.T) { addTestCases(t, d, testcases) - rs, err := d.Query(dsq.Query{Prefix: "/a/"}) + rs, err := d.Query(bg, dsq.Query{Prefix: "/a/"}) if err != nil { t.Fatal(err) } @@ -88,7 +91,7 @@ func TestQuery(t *testing.T) { // test offset and limit - rs, err = d.Query(dsq.Query{Prefix: "/a/", Offset: 2, Limit: 2}) + rs, err = d.Query(bg, dsq.Query{Prefix: "/a/", Offset: 2, Limit: 2}) if err != nil { t.Fatal(err) } @@ -104,7 +107,7 @@ func TestHas(t *testing.T) { defer done() addTestCases(t, d, testcases) - has, err := d.Has(ds.NewKey("/a/b/c")) + has, err := d.Has(bg, ds.NewKey("/a/b/c")) if err != nil { t.Error(err) } @@ -113,7 +116,7 @@ func TestHas(t *testing.T) { t.Error("Key should be found") } - has, err = d.Has(ds.NewKey("/a/b/c/d")) + has, err = d.Has(bg, ds.NewKey("/a/b/c/d")) if err != nil { t.Error(err) } @@ -128,7 +131,7 @@ func TestGetSize(t *testing.T) { defer done() addTestCases(t, d, testcases) - size, err := d.GetSize(ds.NewKey("/a/b/c")) + size, err := d.GetSize(bg, ds.NewKey("/a/b/c")) if err != nil { t.Error(err) } @@ -137,7 +140,7 @@ func TestGetSize(t *testing.T) { t.Error("") } - _, err = d.GetSize(ds.NewKey("/a/b/c/d")) + _, err = d.GetSize(bg, ds.NewKey("/a/b/c/d")) if err != ds.ErrNotFound { t.Error(err) } @@ -148,7 +151,7 @@ func TestNotExistGet(t *testing.T) { defer done() addTestCases(t, d, testcases) - has, err := d.Has(ds.NewKey("/a/b/c/d")) + has, err := d.Has(bg, ds.NewKey("/a/b/c/d")) if err != nil { t.Error(err) } @@ -157,7 +160,7 @@ func TestNotExistGet(t *testing.T) { t.Error("Key should not be found") } - val, err := d.Get(ds.NewKey("/a/b/c/d")) + val, err := d.Get(bg, ds.NewKey("/a/b/c/d")) if val != nil { t.Error("Key should not be found") } @@ -175,7 +178,7 @@ func TestDelete(t *testing.T) { defer done() addTestCases(t, d, testcases) - has, err := d.Has(ds.NewKey("/a/b/c")) + has, err := d.Has(bg, ds.NewKey("/a/b/c")) if err != nil { t.Error(err) } @@ -183,12 +186,12 @@ func TestDelete(t *testing.T) { t.Error("Key should be found") } - err = d.Delete(ds.NewKey("/a/b/c")) + err = d.Delete(bg, ds.NewKey("/a/b/c")) if err != nil { t.Error(err) } - has, err = d.Has(ds.NewKey("/a/b/c")) + has, err = d.Has(bg, ds.NewKey("/a/b/c")) if err != nil { t.Error(err) } @@ -201,12 +204,12 @@ func TestGetEmpty(t *testing.T) { d, done := newDS(t) defer done() - err := d.Put(ds.NewKey("/a"), []byte{}) + err := d.Put(bg, ds.NewKey("/a"), []byte{}) if err != nil { t.Error(err) } - v, err := d.Get(ds.NewKey("/a")) + v, err := d.Get(bg, ds.NewKey("/a")) if err != nil { t.Error(err) } @@ -242,25 +245,25 @@ func TestBatching(t *testing.T) { d, done := newDS(t) defer done() - b, err := d.Batch() + b, err := d.Batch(bg) if err != nil { t.Fatal(err) } for k, v := range testcases { - err := b.Put(ds.NewKey(k), []byte(v)) + err := b.Put(bg, ds.NewKey(k), []byte(v)) if err != nil { t.Fatal(err) } } - err = b.Commit() + err = b.Commit(bg) if err != nil { t.Fatal(err) } for k, v := range testcases { - val, err := d.Get(ds.NewKey(k)) + val, err := d.Get(bg, ds.NewKey(k)) if err != nil { t.Fatal(err) } @@ -272,27 +275,27 @@ func TestBatching(t *testing.T) { //Test delete - b, err = d.Batch() + b, err = d.Batch(bg) if err != nil { t.Fatal(err) } - err = b.Delete(ds.NewKey("/a/b")) + err = b.Delete(bg, ds.NewKey("/a/b")) if err != nil { t.Fatal(err) } - err = b.Delete(ds.NewKey("/a/b/c")) + err = b.Delete(bg, ds.NewKey("/a/b/c")) if err != nil { t.Fatal(err) } - err = b.Commit() + err = b.Commit(bg) if err != nil { t.Fatal(err) } - rs, err := d.Query(dsq.Query{Prefix: "/"}) + rs, err := d.Query(bg, dsq.Query{Prefix: "/"}) if err != nil { t.Fatal(err) } @@ -309,14 +312,14 @@ func TestBatching(t *testing.T) { //Test cancel - b, err = d.Batch() + b, err = d.Batch(bg) if err != nil { t.Fatal(err) } const key = "/xyz" - err = b.Put(ds.NewKey(key), []byte("/x/y/z")) + err = b.Put(bg, ds.NewKey(key), []byte("/x/y/z")) if err != nil { t.Fatal(err) } @@ -327,7 +330,7 @@ func TestBatching(t *testing.T) { t.Fatal(err) } - _, err = d.Get(ds.NewKey(key)) + _, err = d.Get(bg, ds.NewKey(key)) if err == nil { t.Fatal("expected error trying to get uncommited data") } @@ -355,7 +358,7 @@ func TestBatchingRequired(t *testing.T) { // not testing batching logic, but is here to prove that batching works // where a transaction fails. t.Logf("putting %d byte values until transaction overflows", valSize) - tx, err := d.NewTransaction(false) + tx, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } @@ -363,7 +366,7 @@ func TestBatchingRequired(t *testing.T) { for ; puts < 10000000; puts++ { buf := make([]byte, valSize) rand.Read(buf) - err = tx.Put(ds.NewKey(fmt.Sprintf("/key%d", puts)), buf) + err = tx.Put(bg, ds.NewKey(fmt.Sprintf("/key%d", puts)), buf) if err != nil { break } @@ -374,25 +377,25 @@ func TestBatchingRequired(t *testing.T) { } else { t.Logf("OK - transaction cannot handle %d puts: %s", puts, err) } - tx.Discard() + tx.Discard(bg) // Check that batch succeeds with the same number of writes that caused a // transaction to fail. t.Logf("putting %d %d byte values using batch", puts, valSize) - b, err := d.Batch() + b, err := d.Batch(bg) if err != nil { t.Fatal(err) } for i := 0; i < puts; i++ { buf := make([]byte, valSize) rand.Read(buf) - err = b.Put(ds.NewKey(fmt.Sprintf("/key%d", i)), buf) + err = b.Put(bg, ds.NewKey(fmt.Sprintf("/key%d", i)), buf) if err != nil { t.Fatal(err) } } - err = b.Commit() + err = b.Commit(bg) if err != nil { t.Fatal(err) } @@ -407,12 +410,12 @@ func TestBasicPutGet(t *testing.T) { k := ds.NewKey("foo") val := []byte("Hello Datastore!") - err := d.Put(k, val) + err := d.Put(bg, k, val) if err != nil { t.Fatal("error putting to datastore: ", err) } - have, err := d.Has(k) + have, err := d.Has(bg, k) if err != nil { t.Fatal("error calling has on key we just put: ", err) } @@ -421,7 +424,7 @@ func TestBasicPutGet(t *testing.T) { t.Fatal("should have key foo, has returned false") } - out, err := d.Get(k) + out, err := d.Get(bg, k) if err != nil { t.Fatal("error getting value after put: ", err) } @@ -430,7 +433,7 @@ func TestBasicPutGet(t *testing.T) { t.Fatal("value received on get wasnt what we expected:", out) } - have, err = d.Has(k) + have, err = d.Has(bg, k) if err != nil { t.Fatal("error calling has after get: ", err) } @@ -439,12 +442,12 @@ func TestBasicPutGet(t *testing.T) { t.Fatal("should have key foo, has returned false") } - err = d.Delete(k) + err = d.Delete(bg, k) if err != nil { t.Fatal("error calling delete: ", err) } - have, err = d.Has(k) + have, err = d.Has(bg, k) if err != nil { t.Fatal("error calling has after delete: ", err) } @@ -460,7 +463,7 @@ func TestNotFounds(t *testing.T) { badk := ds.NewKey("notreal") - val, err := d.Get(badk) + val, err := d.Get(bg, badk) if err != ds.ErrNotFound { t.Fatal("expected ErrNotFound for key that doesnt exist, got: ", err) } @@ -469,7 +472,7 @@ func TestNotFounds(t *testing.T) { t.Fatal("get should always return nil for not found values") } - have, err := d.Has(badk) + have, err := d.Has(bg, badk) if err != nil { t.Fatal("error calling has on not found key: ", err) } @@ -498,7 +501,7 @@ func TestManyKeysAndQuery(t *testing.T) { t.Logf("putting %d values", count) for i, k := range keys { - err := d.Put(k, values[i]) + err := d.Put(bg, k, values[i]) if err != nil { t.Fatalf("error on put[%d]: %s", i, err) } @@ -506,7 +509,7 @@ func TestManyKeysAndQuery(t *testing.T) { t.Log("getting values back") for i, k := range keys { - val, err := d.Get(k) + val, err := d.Get(bg, k) if err != nil { t.Fatalf("error on get[%d]: %s", i, err) } @@ -518,7 +521,7 @@ func TestManyKeysAndQuery(t *testing.T) { t.Log("querying values") q := dsq.Query{KeysOnly: true} - resp, err := d.Query(q) + resp, err := d.Query(bg, q) if err != nil { t.Fatal("calling query: ", err) } @@ -553,7 +556,7 @@ func TestManyKeysAndQuery(t *testing.T) { t.Log("deleting all keys") for _, k := range keys { - if err := d.Delete(k); err != nil { + if err := d.Delete(bg, k); err != nil { t.Fatal(err) } } @@ -565,7 +568,7 @@ func TestGC(t *testing.T) { count := 10000 - b, err := d.Batch() + b, err := d.Batch(bg) if err != nil { t.Fatal(err) } @@ -574,36 +577,36 @@ func TestGC(t *testing.T) { for i := 0; i < count; i++ { buf := make([]byte, 6400) rand.Read(buf) - err = b.Put(ds.NewKey(fmt.Sprintf("/key%d", i)), buf) + err = b.Put(bg, ds.NewKey(fmt.Sprintf("/key%d", i)), buf) if err != nil { t.Fatal(err) } } - err = b.Commit() + err = b.Commit(bg) if err != nil { t.Fatal(err) } - b, err = d.Batch() + b, err = d.Batch(bg) if err != nil { t.Fatal(err) } t.Logf("deleting %d values", count) for i := 0; i < count; i++ { - err := b.Delete(ds.NewKey(fmt.Sprintf("/key%d", i))) + err := b.Delete(bg, ds.NewKey(fmt.Sprintf("/key%d", i))) if err != nil { t.Fatal(err) } } - err = b.Commit() + err = b.Commit(bg) if err != nil { t.Fatal(err) } - if err := d.CollectGarbage(); err != nil { + if err := d.CollectGarbage(bg); err != nil { t.Fatal(err) } } @@ -634,7 +637,7 @@ func TestDiskUsage(t *testing.T) { if err != nil { t.Fatal(err) } - s, _ := d.DiskUsage() + s, _ := d.DiskUsage(bg) if s <= 0 { t.Error("expected some size") } @@ -654,16 +657,16 @@ func TestTxnDiscard(t *testing.T) { t.Fatal(err) } - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } key := ds.NewKey("/test/thing") - if err := txn.Put(key, []byte{1, 2, 3}); err != nil { + if err := txn.Put(bg, key, []byte{1, 2, 3}); err != nil { t.Fatal(err) } - txn.Discard() - has, err := d.Has(key) + txn.Discard(bg) + has, err := d.Has(bg, key) if err != nil { t.Fatal(err) } @@ -686,19 +689,19 @@ func TestTxnCommit(t *testing.T) { t.Fatal(err) } - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } key := ds.NewKey("/test/thing") - if err := txn.Put(key, []byte{1, 2, 3}); err != nil { + if err := txn.Put(bg, key, []byte{1, 2, 3}); err != nil { t.Fatal(err) } - err = txn.Commit() + err = txn.Commit(bg) if err != nil { t.Fatal(err) } - has, err := d.Has(key) + has, err := d.Has(bg, key) if err != nil { t.Fatal(err) } @@ -721,7 +724,7 @@ func TestTxnBatch(t *testing.T) { t.Fatal(err) } - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } @@ -735,18 +738,18 @@ func TestTxnBatch(t *testing.T) { } data[key] = bytes - err = txn.Put(key, bytes) + err = txn.Put(bg, key, bytes) if err != nil { t.Fatal(err) } } - err = txn.Commit() + err = txn.Commit(bg) if err != nil { t.Fatal(err) } for key, bytes := range data { - retrieved, err := d.Get(key) + retrieved, err := d.Get(bg, key) if err != nil { t.Fatal(err) } @@ -775,7 +778,7 @@ func TestTTL(t *testing.T) { t.Fatal(err) } - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } @@ -793,32 +796,32 @@ func TestTTL(t *testing.T) { // write data for key, bytes := range data { - err = txn.(ds.TTL).PutWithTTL(key, bytes, time.Second) + err = txn.(ds.TTL).PutWithTTL(bg, key, bytes, time.Second) if err != nil { t.Fatal(err) } } - err = txn.Commit() + err = txn.Commit(bg) if err != nil { t.Fatal(err) } - txn, err = d.NewTransaction(true) + txn, err = d.NewTransaction(bg, true) if err != nil { t.Fatal(err) } for key := range data { - _, err := txn.Get(key) + _, err := txn.Get(bg, key) if err != nil { t.Fatal(err) } } - txn.Discard() + txn.Discard(bg) time.Sleep(time.Second) for key := range data { - has, err := d.Has(key) + has, err := d.Has(bg, key) if err != nil { t.Fatal(err) } @@ -836,12 +839,12 @@ func TestExpirations(t *testing.T) { d, done := newDS(t) defer done() - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } ttltxn := txn.(ds.TTL) - defer txn.Discard() + defer txn.Discard(bg) key := ds.NewKey("/abc/def") val := make([]byte, 32) @@ -853,25 +856,25 @@ func TestExpirations(t *testing.T) { now := time.Now() tgt := now.Add(ttl) - if err = ttltxn.PutWithTTL(key, val, ttl); err != nil { + if err = ttltxn.PutWithTTL(bg, key, val, ttl); err != nil { t.Fatalf("adding with ttl failed: %v", err) } - if err = txn.Commit(); err != nil { + if err = txn.Commit(bg); err != nil { t.Fatalf("commiting transaction failed: %v", err) } // Second transaction to retrieve expirations. - txn, err = d.NewTransaction(true) + txn, err = d.NewTransaction(bg, true) if err != nil { t.Fatal(err) } ttltxn = txn.(ds.TTL) - defer txn.Discard() + defer txn.Discard(bg) // GetExpiration returns expected value. var dsExp time.Time - if dsExp, err = ttltxn.GetExpiration(key); err != nil { + if dsExp, err = ttltxn.GetExpiration(bg, key); err != nil { t.Fatalf("getting expiration failed: %v", err) } else if tgt.Sub(dsExp) >= 5*time.Second { t.Fatal("expiration returned by datastore not within the expected range (tolerance: 5 seconds)") @@ -885,7 +888,7 @@ func TestExpirations(t *testing.T) { KeysOnly: true, } var ress dsq.Results - if ress, err = txn.Query(q); err != nil { + if ress, err = txn.Query(bg, q); err != nil { t.Fatalf("querying datastore failed: %v", err) } @@ -901,13 +904,13 @@ func TestExpirations(t *testing.T) { } // Datastore->GetExpiration() - if exp, err := d.GetExpiration(key); err != nil { + if exp, err := d.GetExpiration(bg, key); err != nil { t.Fatalf("querying datastore failed: %v", err) } else if exp != dsExp { t.Fatalf("expiration returned from DB differs from that returned by txn, expected: %v, actual: %v", dsExp, exp) } - if _, err := d.GetExpiration(ds.NewKey("/foo/bar")); err != ds.ErrNotFound { + if _, err := d.GetExpiration(bg, ds.NewKey("/foo/bar")); err != ds.ErrNotFound { t.Fatalf("wrong error type: %v", err) } } diff --git a/go.mod b/go.mod index d25f242..ff23751 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/ipfs/go-ds-badger require ( github.com/dgraph-io/badger v1.6.2 - github.com/ipfs/go-datastore v0.4.4 + github.com/ipfs/go-datastore v0.5.0 github.com/ipfs/go-log/v2 v2.0.5 github.com/jbenet/goprocess v0.1.4 ) diff --git a/go.sum b/go.sum index 04758c1..2bb85c2 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -11,14 +11,9 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -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/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.1 h1:w9pSFNSdq/JPM1N12Fz/F/bzo993Is1W+Q7HjPzi7yg= -github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= @@ -28,10 +23,6 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -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/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= @@ -39,44 +30,26 @@ 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/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/ipfs/go-datastore v0.4.0 h1:Kiep/Ll245udr3DEnWBG0c5oofT6Dsin7fubWtFdmsc= -github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -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 v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY= -github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= github.com/ipfs/go-log/v2 v2.0.5 h1:fL4YI+1g5V/b1Yxr1qAiXTMg1H8z9vx/VmJxBuQMHvU= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= -github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= 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/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -85,6 +58,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -94,27 +68,25 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 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.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.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= @@ -122,17 +94,14 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/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/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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= @@ -140,5 +109,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 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=