Skip to content

Commit cd5884e

Browse files
Breaking Change: Fix WriteBatch APIs(#845)
* Remove SetWithTTL from WriteBatch as part of New EntryAPIs. As we have removed SetWith functions from Txn struct. We can do same for WriteBatch. Anyone can create Entry using new Entry APIs and call SetEntry on WriteBatch. * Change WriteBatch Set method to have same syntax as Txn.Set * Fix DOCs for Entry APIs
1 parent 18f8a33 commit cd5884e

File tree

8 files changed

+60
-32
lines changed

8 files changed

+60
-32
lines changed

README.md

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,18 @@ err := db.Update(func(txn *badger.Txn) error {
209209
})
210210
```
211211

212+
Key/Value pair can also be saved by first creating `Entry`, then setting this
213+
`Entry` using `Txn.SetEntry()`. `Entry` also exposes methods to set properties
214+
on it.
215+
216+
```go
217+
err := db.Update(func(txn *badger.Txn) error {
218+
e := NewEntry([]byte("answer"), []byte("42"))
219+
err := txn.SetEntry(e)
220+
return err
221+
})
222+
```
223+
212224
This will set the value of the `"answer"` key to `"42"`. To retrieve this
213225
value, we can use the `Txn.Get()` method:
214226

@@ -347,16 +359,40 @@ res, _ := m.Get() // res should have value 6 encoded
347359
### Setting Time To Live(TTL) and User Metadata on Keys
348360
Badger allows setting an optional Time to Live (TTL) value on keys. Once the TTL has
349361
elapsed, the key will no longer be retrievable and will be eligible for garbage
350-
collection. A TTL can be set as a `time.Duration` value using the `Txn.SetWithTTL()`
351-
API method.
362+
collection. A TTL can be set as a `time.Duration` value using the `Entry.WithTTL()`
363+
and `Txn.SetEntry()` API methods.
364+
365+
```go
366+
err := db.Update(func(txn *badger.Txn) error {
367+
e := NewEntry([]byte("answer"), []byte("42")).WithTTL(time.Hour)
368+
err := txn.SetEntry(e)
369+
return err
370+
})
371+
```
352372

353373
An optional user metadata value can be set on each key. A user metadata value
354374
is represented by a single byte. It can be used to set certain bits along
355375
with the key to aid in interpreting or decoding the key-value pair. User
356-
metadata can be set using the `Txn.SetWithMeta()` API method.
376+
metadata can be set using `Entry.WithMeta()` and `Txn.SetEntry()` API methods.
357377

358-
`Txn.SetEntry()` can be used to set the key, value, user metatadata and TTL,
359-
all at once.
378+
```go
379+
err := db.Update(func(txn *badger.Txn) error {
380+
e := NewEntry([]byte("answer"), []byte("42")).WithMeta(byte(1))
381+
err := txn.SetEntry(e)
382+
return err
383+
})
384+
```
385+
386+
`Entry` APIs can be used to add the user metadata and TTL for same key. This `Entry`
387+
then can be set using `Txn.SetEntry()`.
388+
389+
```go
390+
err := db.Update(func(txn *badger.Txn) error {
391+
e := NewEntry([]byte("answer"), []byte("42")).WithMeta(byte(1)).WithTTL(time.Hour)
392+
err := txn.SetEntry(e)
393+
return err
394+
})
395+
```
360396

361397
### Iterating over keys
362398
To iterate over keys, we can use an `Iterator`, which can be obtained using the

badger/cmd/bank.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ func runTest(cmd *cobra.Command, args []string) error {
388388

389389
wb := db.NewWriteBatch()
390390
for i := 0; i < numAccounts; i++ {
391-
y.Check(wb.Set(key(i), toSlice(initialBal), 0))
391+
y.Check(wb.Set(key(i), toSlice(initialBal)))
392392
}
393393
log.Println("Waiting for writes to be done...")
394394
y.Check(wb.Flush())
@@ -485,7 +485,7 @@ func runTest(cmd *cobra.Command, args []string) error {
485485
stream := db.NewStream()
486486
stream.Send = func(list *pb.KVList) error {
487487
for _, kv := range list.Kv {
488-
if err := batch.Set(kv.Key, kv.Value, 0); err != nil {
488+
if err := batch.Set(kv.Key, kv.Value); err != nil {
489489
return err
490490
}
491491
}

badger/cmd/fill.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func fillRandom(db *badger.DB, num uint64) error {
6262
for i := uint64(1); i <= num; i++ {
6363
key := make([]byte, keySz)
6464
y.Check2(rand.Read(key))
65-
if err := batch.Set(key, value, 0); err != nil {
65+
if err := batch.Set(key, value); err != nil {
6666
return err
6767
}
6868
if i%1e5 == 0 {

batch.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package badger
1818

1919
import (
2020
"sync"
21-
"time"
2221

2322
"github.com/dgraph-io/badger/y"
2423
)
@@ -102,16 +101,9 @@ func (wb *WriteBatch) SetEntry(e *Entry) error {
102101
return nil
103102
}
104103

105-
// Set is equivalent of Txn.SetWithMeta.
106-
func (wb *WriteBatch) Set(k, v []byte, meta byte) error {
107-
e := &Entry{Key: k, Value: v, UserMeta: meta}
108-
return wb.SetEntry(e)
109-
}
110-
111-
// SetWithTTL is equivalent of Txn.SetWithTTL.
112-
func (wb *WriteBatch) SetWithTTL(key, val []byte, dur time.Duration) error {
113-
expire := time.Now().Add(dur).Unix()
114-
e := &Entry{Key: key, Value: val, ExpiresAt: uint64(expire)}
104+
// Set is equivalent of Txn.Set().
105+
func (wb *WriteBatch) Set(k, v []byte) error {
106+
e := &Entry{Key: k, Value: v}
115107
return wb.SetEntry(e)
116108
}
117109

batch_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func TestWriteBatch(t *testing.T) {
4040
start := time.Now()
4141

4242
for i := 0; i < N; i++ {
43-
require.NoError(t, wb.Set(key(i), val(i), 0))
43+
require.NoError(t, wb.Set(key(i), val(i)))
4444
}
4545
for i := 0; i < M; i++ {
4646
require.NoError(t, wb.Delete(key(i)))

iterator_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func TestIteratePrefix(t *testing.T) {
7979
if (i % 1000) == 0 {
8080
t.Logf("Put i=%d\n", i)
8181
}
82-
require.NoError(t, batch.Set(bkey(i), val, 0))
82+
require.NoError(t, batch.Set(bkey(i), val))
8383
}
8484
require.NoError(t, batch.Flush())
8585

@@ -193,7 +193,7 @@ func BenchmarkIteratePrefixSingleKey(b *testing.B) {
193193

194194
batch := db.NewWriteBatch()
195195
for i := 0; i < N; i++ {
196-
y.Check(batch.Set(bkey(i), val, 0))
196+
y.Check(batch.Set(bkey(i), val))
197197
}
198198
y.Check(batch.Flush())
199199
var lsmFiles int

managed_db_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func TestDropAll(t *testing.T) {
114114
populate := func(db *DB) {
115115
writer := db.NewWriteBatch()
116116
for i := uint64(0); i < N; i++ {
117-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
117+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
118118
}
119119
require.NoError(t, writer.Flush())
120120
}
@@ -150,7 +150,7 @@ func TestDropAllTwice(t *testing.T) {
150150
populate := func(db *DB) {
151151
writer := db.NewWriteBatch()
152152
for i := uint64(0); i < N; i++ {
153-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
153+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
154154
}
155155
require.NoError(t, writer.Flush())
156156
}
@@ -178,7 +178,7 @@ func TestDropAllWithPendingTxn(t *testing.T) {
178178
populate := func(db *DB) {
179179
writer := db.NewWriteBatch()
180180
for i := uint64(0); i < N; i++ {
181-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
181+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
182182
}
183183
require.NoError(t, writer.Flush())
184184
}
@@ -243,7 +243,7 @@ func TestDropReadOnly(t *testing.T) {
243243
populate := func(db *DB) {
244244
writer := db.NewWriteBatch()
245245
for i := uint64(0); i < N; i++ {
246-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
246+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
247247
}
248248
require.NoError(t, writer.Flush())
249249
}
@@ -275,7 +275,7 @@ func TestWriteAfterClose(t *testing.T) {
275275
populate := func(db *DB) {
276276
writer := db.NewWriteBatch()
277277
for i := uint64(0); i < N; i++ {
278-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
278+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
279279
}
280280
require.NoError(t, writer.Flush())
281281
}
@@ -366,7 +366,7 @@ func TestDropPrefix(t *testing.T) {
366366
populate := func(db *DB) {
367367
writer := db.NewWriteBatch()
368368
for i := uint64(0); i < N; i++ {
369-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
369+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
370370
}
371371
require.NoError(t, writer.Flush())
372372
}
@@ -417,7 +417,7 @@ func TestDropPrefixWithPendingTxn(t *testing.T) {
417417
populate := func(db *DB) {
418418
writer := db.NewWriteBatch()
419419
for i := uint64(0); i < N; i++ {
420-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
420+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
421421
}
422422
require.NoError(t, writer.Flush())
423423
}
@@ -485,7 +485,7 @@ func TestDropPrefixReadOnly(t *testing.T) {
485485
populate := func(db *DB) {
486486
writer := db.NewWriteBatch()
487487
for i := uint64(0); i < N; i++ {
488-
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true), 0))
488+
require.NoError(t, writer.Set([]byte(key("key", int(i))), val(true)))
489489
}
490490
require.NoError(t, writer.Flush())
491491
}

value_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,8 @@ func TestPersistLFDiscardStats(t *testing.T) {
455455
require.NoError(t, txn.Commit(), "error while committing txn")
456456

457457
for i := 0; i < 500; i++ {
458-
// use SetWithDiscard to delete entries, because this causes data to be flushed on disk,
459-
// creating SSTs. Simple Delete was having data in Memtables only.
458+
// use Entry.WithDiscard() to delete entries, because this causes data to be flushed on
459+
// disk, creating SSTs. Simple Delete was having data in Memtables only.
460460
err = db.Update(func(txn *Txn) error {
461461
return txn.SetEntry(NewEntry([]byte(fmt.Sprintf("key%d", i)), v).WithDiscard())
462462
})

0 commit comments

Comments
 (0)