Fix interval check, make DB shutdown concurrent

This commit is contained in:
Fabian Reinartz 2017-03-06 12:13:15 +01:00
parent 04783831e2
commit 87d270fe11
1 changed files with 11 additions and 9 deletions

20
db.go
View File

@ -407,15 +407,18 @@ func (db *DB) Close() error {
// the block to be used afterwards. // the block to be used afterwards.
db.mtx.Lock() db.mtx.Lock()
var merr MultiError var g errgroup.Group
for _, pb := range db.persisted { for _, pb := range db.persisted {
merr.Add(pb.Close()) g.Go(pb.Close)
} }
for _, hb := range db.heads { for _, hb := range db.heads {
merr.Add(hb.Close()) g.Go(hb.Close)
} }
var merr MultiError
merr.Add(g.Wait())
merr.Add(db.lockf.Unlock()) merr.Add(db.lockf.Unlock())
return merr.Err() return merr.Err()
@ -526,10 +529,9 @@ func (a *dbAppender) appenderFor(t int64) (*headAppender, error) {
return nil, ErrNotFound return nil, ErrNotFound
} }
// ensureHead makes sure that there is a head block for the timestamp t if
// it is within or after the currently appendable window.
func (db *DB) ensureHead(t int64) error { func (db *DB) ensureHead(t int64) error {
// db.mtx.Lock()
// defer db.mtx.Unlock()
// Initial case for a new database: we must create the first // Initial case for a new database: we must create the first
// AppendableBlocks-1 front padding heads. // AppendableBlocks-1 front padding heads.
if len(db.heads) == 0 { if len(db.heads) == 0 {
@ -585,17 +587,17 @@ func (db *DB) appendable() []*headBlock {
} }
func intervalOverlap(amin, amax, bmin, bmax int64) bool { func intervalOverlap(amin, amax, bmin, bmax int64) bool {
if bmin >= amin && bmin <= amax { if bmin >= amin && bmin < amax {
return true return true
} }
if amin >= bmin && amin <= bmax { if amin >= bmin && amin < bmax {
return true return true
} }
return false return false
} }
func intervalContains(min, max, t int64) bool { func intervalContains(min, max, t int64) bool {
return t >= min && t <= max return t >= min && t < max
} }
// blocksForInterval returns all blocks within the partition that may contain // blocksForInterval returns all blocks within the partition that may contain