Skip to content

Commit b5dea5b

Browse files
author
Ibrahim Jarif
authored
Merge pull request #1273 from dgraph-io/ibrahim/release/v2.0-cherry-pick-v2.0.3
Cherry-pick commits for v2.0.3
2 parents 8fd5740 + b551699 commit b5dea5b

21 files changed

+517
-208
lines changed

.travis.yml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ notifications:
3333
slack:
3434
secure: X7uBLWYbuUhf8QFE16CoS5z7WvFR8EN9j6cEectMW6mKZ3vwXGwVXRIPsgUq/606DsQdCCx34MR8MRWYGlu6TBolbSe9y0EP0i46yipPz22YtuT7umcVUbGEyx8MZKgG0v1u/zA0O4aCsOBpGAA3gxz8h3JlEHDt+hv6U8xRsSllVLzLSNb5lwxDtcfEDxVVqP47GMEgjLPM28Pyt5qwjk7o5a4YSVzkfdxBXxd3gWzFUWzJ5E3cTacli50dK4GVfiLcQY2aQYoYO7AAvDnvP+TPfjDkBlUEE4MUz5CDIN51Xb+WW33sX7g+r3Bj7V5IRcF973RiYkpEh+3eoiPnyWyxhDZBYilty3b+Hysp6d4Ov/3I3ll7Bcny5+cYjakjkMH3l9w3gs6Y82GlpSLSJshKWS8vPRsxFe0Pstj6QSJXTd9EBaFr+l1ScXjJv/Sya9j8N9FfTuOTESWuaL1auX4Y7zEEVHlA8SCNOO8K0eTfxGZnC/YcIHsR8rePEAcFxfOYQppkyLF/XvAtnb/LMUuu0g4y2qNdme6Oelvyar1tFEMRtbl4mRCdu/krXBFtkrsfUaVY6WTPdvXAGotsFJ0wuA53zGVhlcd3+xAlSlR3c1QX95HIMeivJKb5L4nTjP+xnrmQNtnVk+tG4LSH2ltuwcZSSczModtcBmRefrk=
3535

36-
before_script:
37-
- go get github.com/mattn/goveralls
3836
script:
39-
- bash contrib/cover.sh $HOME/build coverage.out || travis_terminate 1
40-
- goveralls -service=travis-ci -coverprofile=coverage.out || true
41-
- goveralls -coverprofile=coverage.out -service=travis-ci
37+
- go test -v ./...
38+
# Another round of tests after turning off mmap
39+
- go test -v -vlog_mmap=false github.com/dgraph-io/badger

CHANGELOG.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,32 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Serialization Versioning](VERSIONING.md).
66

7-
## [2.0.2] - 2020-02-26
7+
## [2.0.3] - 2020-03-24
8+
9+
### Fixed
10+
11+
- Add support for watching nil prefix in subscribe API (#1246)
12+
13+
### Performance
14+
15+
- Compress/Encrypt Blocks in the background (#1227)
16+
- Disable cache by default (#1257)
17+
18+
### Features
19+
20+
- Add BypassDirLock option (#1243)
21+
- Add separate cache for bloomfilters (#1260)
22+
23+
### New APIs
24+
- badger.DB
25+
- BfCacheMetrics (#1260)
26+
- DataCacheMetrics (#1260)
27+
- badger.Options
28+
- WithBypassLockGuard (#1243)
29+
- WithLoadBloomsOnOpen (#1260)
30+
- WithMaxBfCacheSize (#1260)
31+
32+
## [2.0.2] - 2020-03-02
833

934
### Fixed
1035

@@ -293,6 +318,8 @@ Bug fix:
293318
## [1.0.1] - 2017-11-06
294319
* Fix an uint16 overflow when resizing key slice
295320

321+
[Unreleased]: https://github.com/dgraph-io/badger/compare/v2.0.3...HEAD
322+
[2.0.3]: https://github.com/dgraph-io/badger/compare/v2.0.2...v2.0.3
296323
[2.0.2]: https://github.com/dgraph-io/badger/compare/v2.0.1...v2.0.2
297324
[2.0.1]: https://github.com/dgraph-io/badger/compare/v2.0.0...v2.0.1
298325
[2.0.0]: https://github.com/dgraph-io/badger/compare/v1.6.0...v2.0.0

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,7 @@ Below is a list of known projects that use Badger:
776776
* [Volument](https://volument.com/) - A new take on website analytics backed by Badger.
777777
* [Sloop](https://github.com/salesforce/sloop) - Kubernetes History Visualization.
778778
* [KVdb](https://kvdb.io/) - Hosted key-value store and serverless platform built on top of Badger.
779+
* [Dkron](https://dkron.io/) - Distributed, fault tolerant job scheduling system.
779780

780781
If you are using Badger in a project please send a pull request to add it to the list.
781782

contrib/cover.sh

Lines changed: 0 additions & 24 deletions
This file was deleted.

db.go

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ type DB struct {
9292
pub *publisher
9393
registry *KeyRegistry
9494
blockCache *ristretto.Cache
95+
bfCache *ristretto.Cache
9596
}
9697

9798
const (
@@ -234,33 +235,35 @@ func Open(opt Options) (db *DB, err error) {
234235
if err := createDirs(opt); err != nil {
235236
return nil, err
236237
}
237-
dirLockGuard, err = acquireDirectoryLock(opt.Dir, lockFile, opt.ReadOnly)
238-
if err != nil {
239-
return nil, err
240-
}
241-
defer func() {
242-
if dirLockGuard != nil {
243-
_ = dirLockGuard.release()
244-
}
245-
}()
246-
absDir, err := filepath.Abs(opt.Dir)
247-
if err != nil {
248-
return nil, err
249-
}
250-
absValueDir, err := filepath.Abs(opt.ValueDir)
251-
if err != nil {
252-
return nil, err
253-
}
254-
if absValueDir != absDir {
255-
valueDirLockGuard, err = acquireDirectoryLock(opt.ValueDir, lockFile, opt.ReadOnly)
238+
if !opt.BypassLockGuard {
239+
dirLockGuard, err = acquireDirectoryLock(opt.Dir, lockFile, opt.ReadOnly)
256240
if err != nil {
257241
return nil, err
258242
}
259243
defer func() {
260-
if valueDirLockGuard != nil {
261-
_ = valueDirLockGuard.release()
244+
if dirLockGuard != nil {
245+
_ = dirLockGuard.release()
262246
}
263247
}()
248+
absDir, err := filepath.Abs(opt.Dir)
249+
if err != nil {
250+
return nil, err
251+
}
252+
absValueDir, err := filepath.Abs(opt.ValueDir)
253+
if err != nil {
254+
return nil, err
255+
}
256+
if absValueDir != absDir {
257+
valueDirLockGuard, err = acquireDirectoryLock(opt.ValueDir, lockFile, opt.ReadOnly)
258+
if err != nil {
259+
return nil, err
260+
}
261+
defer func() {
262+
if valueDirLockGuard != nil {
263+
_ = valueDirLockGuard.release()
264+
}
265+
}()
266+
}
264267
}
265268
}
266269

@@ -302,13 +305,28 @@ func Open(opt Options) (db *DB, err error) {
302305
}
303306
db.blockCache, err = ristretto.NewCache(&config)
304307
if err != nil {
305-
return nil, errors.Wrap(err, "failed to create cache")
308+
return nil, errors.Wrap(err, "failed to create data cache")
309+
}
310+
}
311+
312+
if opt.MaxBfCacheSize > 0 {
313+
config := ristretto.Config{
314+
// Use 5% of cache memory for storing counters.
315+
NumCounters: int64(float64(opt.MaxBfCacheSize) * 0.05 * 2),
316+
MaxCost: int64(float64(opt.MaxBfCacheSize) * 0.95),
317+
BufferItems: 64,
318+
Metrics: true,
319+
}
320+
db.blockCache, err = ristretto.NewCache(&config)
321+
if err != nil {
322+
return nil, errors.Wrap(err, "failed to create bf cache")
306323
}
307324
}
308325

309326
if db.opt.InMemory {
310327
db.opt.SyncWrites = false
311-
db.opt.ValueThreshold = maxValueThreshold
328+
// If badger is running in memory mode, push everything into the LSM Tree.
329+
db.opt.ValueThreshold = math.MaxInt32
312330
}
313331
krOpt := KeyRegistryOptions{
314332
ReadOnly: opt.ReadOnly,
@@ -331,6 +349,9 @@ func Open(opt Options) (db *DB, err error) {
331349
return nil, err
332350
}
333351

352+
// Initialize vlog struct.
353+
db.vlog.init(db)
354+
334355
if !opt.ReadOnly {
335356
db.closers.compactors = y.NewCloser(1)
336357
db.lc.startCompact(db.closers.compactors)
@@ -387,14 +408,22 @@ func Open(opt Options) (db *DB, err error) {
387408
return db, nil
388409
}
389410

390-
// CacheMetrics returns the metrics for the underlying cache.
391-
func (db *DB) CacheMetrics() *ristretto.Metrics {
411+
// DataCacheMetrics returns the metrics for the underlying data cache.
412+
func (db *DB) DataCacheMetrics() *ristretto.Metrics {
392413
if db.blockCache != nil {
393414
return db.blockCache.Metrics
394415
}
395416
return nil
396417
}
397418

419+
// BfCacheMetrics returns the metrics for the underlying bloom filter cache.
420+
func (db *DB) BfCacheMetrics() *ristretto.Metrics {
421+
if db.bfCache != nil {
422+
return db.bfCache.Metrics
423+
}
424+
return nil
425+
}
426+
398427
// Close closes a DB. It's crucial to call it to ensure all the pending updates make their way to
399428
// disk. Calling DB.Close() multiple times would still only close the DB once.
400429
func (db *DB) Close() error {
@@ -484,6 +513,7 @@ func (db *DB) close() (err error) {
484513
db.closers.updateSize.SignalAndWait()
485514
db.orc.Stop()
486515
db.blockCache.Close()
516+
db.bfCache.Close()
487517

488518
db.elog.Finish()
489519
if db.opt.InMemory {
@@ -951,6 +981,7 @@ func (db *DB) handleFlushTask(ft flushTask) error {
951981
bopts.DataKey = dk
952982
// Builder does not need cache but the same options are used for opening table.
953983
bopts.Cache = db.blockCache
984+
bopts.BfCache = db.bfCache
954985
tableData := buildL0Table(ft, bopts)
955986

956987
fileID := db.lc.reserveFileID()
@@ -1509,6 +1540,7 @@ func (db *DB) dropAll() (func(), error) {
15091540
db.lc.nextFileID = 1
15101541
db.opt.Infof("Deleted %d value log files. DropAll done.\n", num)
15111542
db.blockCache.Clear()
1543+
db.bfCache.Clear()
15121544

15131545
return resume, nil
15141546
}
@@ -1576,9 +1608,7 @@ func (db *DB) Subscribe(ctx context.Context, cb func(kv *KVList) error, prefixes
15761608
if cb == nil {
15771609
return ErrNilCallback
15781610
}
1579-
if len(prefixes) == 0 {
1580-
return ErrNoPrefixes
1581-
}
1611+
15821612
c := y.NewCloser(1)
15831613
recvCh, id := db.pub.newSubscriber(c, prefixes...)
15841614
slurp := func(batch *pb.KVList) error {
@@ -1612,7 +1642,7 @@ func (db *DB) Subscribe(ctx context.Context, cb func(kv *KVList) error, prefixes
16121642
err := slurp(batch)
16131643
if err != nil {
16141644
c.Done()
1615-
// Delete the subsriber if there is an error by the callback.
1645+
// Delete the subscriber if there is an error by the callback.
16161646
db.pub.deleteSubscriber(id)
16171647
return err
16181648
}

db2_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -669,16 +669,13 @@ func TestL0GCBug(t *testing.T) {
669669
// Simulate a crash by not closing db1 but releasing the locks.
670670
if db1.dirLockGuard != nil {
671671
require.NoError(t, db1.dirLockGuard.release())
672+
db1.dirLockGuard = nil
672673
}
673674
if db1.valueDirGuard != nil {
674675
require.NoError(t, db1.valueDirGuard.release())
676+
db1.valueDirGuard = nil
675677
}
676-
for _, f := range db1.vlog.filesMap {
677-
require.NoError(t, f.fd.Close())
678-
}
679-
require.NoError(t, db1.registry.Close())
680-
require.NoError(t, db1.lc.close())
681-
require.NoError(t, db1.manifest.close())
678+
require.NoError(t, db1.Close())
682679

683680
db2, err := Open(opts)
684681
require.NoError(t, err)

errors.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,6 @@ var (
110110
// ErrNilCallback is returned when subscriber's callback is nil.
111111
ErrNilCallback = errors.New("Callback cannot be nil")
112112

113-
// ErrNoPrefixes is returned when subscriber doesn't provide any prefix.
114-
ErrNoPrefixes = errors.New("At least one key prefix is required")
115-
116113
// ErrEncryptionKeyMismatch is returned when the storage key is not
117114
// matched with the key previously given.
118115
ErrEncryptionKeyMismatch = errors.New("Encryption key mismatch")

levels.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ func newLevelsController(db *DB, mf *Manifest) (*levelsController, error) {
160160
topt.Compression = tf.Compression
161161
topt.DataKey = dk
162162
topt.Cache = db.blockCache
163+
topt.BfCache = db.bfCache
163164
t, err := table.OpenTable(fd, topt)
164165
if err != nil {
165166
if strings.HasPrefix(err.Error(), "CHECKSUM_MISMATCH:") {
@@ -530,6 +531,7 @@ func (s *levelsController) compactBuildTables(
530531
bopts.DataKey = dk
531532
// Builder does not need cache but the same options are used for opening table.
532533
bopts.Cache = s.kv.blockCache
534+
bopts.BfCache = s.kv.bfCache
533535
builder := table.NewTableBuilder(bopts)
534536
var numKeys, numSkips uint64
535537
for ; it.Valid(); it.Next() {

0 commit comments

Comments
 (0)