From d106b3beb7f9069bbf00c63e7b6fcccceb97ffb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Wed, 18 Oct 2023 09:29:59 +0100 Subject: [PATCH] Wrap db.blocks read in a read lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We don't hold db.mtx lock when trying to read db.blocks here so we need a read lock around this loop. Signed-off-by: Ɓukasz Mierzwa --- tsdb/db.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tsdb/db.go b/tsdb/db.go index ea8cbfff0b..001515081d 100644 --- a/tsdb/db.go +++ b/tsdb/db.go @@ -1518,7 +1518,9 @@ func (db *DB) compactBlocks() (err error) { default: } + db.mtx.RLock() uids, err := db.compactor.Compact(db.dir, plan, db.blocks) + db.mtx.RUnlock() if err != nil { return fmt.Errorf("compact %s: %w", plan, err) } @@ -1601,11 +1603,13 @@ func (db *DB) reloadBlocks() (err error) { if len(corrupted) > 0 { // Corrupted but no child loaded for it. // Close all new blocks to release the lock for windows. + db.mtx.RLock() for _, block := range loadable { if _, open := getBlock(db.blocks, block.Meta().ULID); !open { block.Close() } } + db.mtx.RUnlock() errs := tsdb_errors.NewMulti() for ulid, err := range corrupted { if err != nil {