@@ -29,6 +29,7 @@ import (
2929 "github.com/prometheus/tsdb/chunkenc"
3030 "github.com/prometheus/tsdb/chunks"
3131 tsdb_errors "github.com/prometheus/tsdb/errors"
32+ "github.com/prometheus/tsdb/fileutil"
3233 "github.com/prometheus/tsdb/index"
3334 "github.com/prometheus/tsdb/labels"
3435)
@@ -230,12 +231,17 @@ func readMetaFile(dir string) (*BlockMeta, error) {
230231 return & m , nil
231232}
232233
233- func writeMetaFile (dir string , meta * BlockMeta ) error {
234+ func writeMetaFile (logger log. Logger , dir string , meta * BlockMeta ) error {
234235 meta .Version = 1
235236
236237 // Make any changes to the file appear atomic.
237238 path := filepath .Join (dir , metaFilename )
238239 tmp := path + ".tmp"
240+ defer func () {
241+ if err := os .RemoveAll (tmp ); err != nil {
242+ level .Error (logger ).Log ("msg" , "remove tmp file" , "err" , err .Error ())
243+ }
244+ }()
239245
240246 f , err := os .Create (tmp )
241247 if err != nil {
@@ -246,7 +252,6 @@ func writeMetaFile(dir string, meta *BlockMeta) error {
246252 enc .SetIndent ("" , "\t " )
247253
248254 var merr tsdb_errors.MultiError
249-
250255 if merr .Add (enc .Encode (meta )); merr .Err () != nil {
251256 merr .Add (f .Close ())
252257 return merr .Err ()
@@ -259,7 +264,7 @@ func writeMetaFile(dir string, meta *BlockMeta) error {
259264 if err := f .Close (); err != nil {
260265 return err
261266 }
262- return renameFile (tmp , path )
267+ return fileutil . Replace (tmp , path )
263268}
264269
265270// Block represents a directory of time series data covering a continuous time range.
@@ -278,6 +283,8 @@ type Block struct {
278283 chunkr ChunkReader
279284 indexr IndexReader
280285 tombstones TombstoneReader
286+
287+ logger log.Logger
281288}
282289
283290// OpenBlock opens the block in the directory. It can be passed a chunk pool, which is used
@@ -322,7 +329,7 @@ func OpenBlock(logger log.Logger, dir string, pool chunkenc.Pool) (pb *Block, er
322329 // that would be the logical place for a block size to be calculated.
323330 bs := blockSize (cr , ir , tsr )
324331 meta .Stats .NumBytes = bs
325- err = writeMetaFile (dir , meta )
332+ err = writeMetaFile (logger , dir , meta )
326333 if err != nil {
327334 level .Warn (logger ).Log ("msg" , "couldn't write the meta file for the block size" , "block" , dir , "err" , err )
328335 }
@@ -334,6 +341,7 @@ func OpenBlock(logger log.Logger, dir string, pool chunkenc.Pool) (pb *Block, er
334341 indexr : ir ,
335342 tombstones : tr ,
336343 symbolTableSize : ir .SymbolTableSize (),
344+ logger : logger ,
337345 }
338346 return pb , nil
339347}
@@ -429,7 +437,7 @@ func (pb *Block) GetSymbolTableSize() uint64 {
429437
430438func (pb * Block ) setCompactionFailed () error {
431439 pb .meta .Compaction .Failed = true
432- return writeMetaFile (pb .dir , & pb .meta )
440+ return writeMetaFile (pb .logger , pb . dir , & pb .meta )
433441}
434442
435443type blockIndexReader struct {
@@ -553,10 +561,10 @@ Outer:
553561 pb .tombstones = stones
554562 pb .meta .Stats .NumTombstones = pb .tombstones .Total ()
555563
556- if err := writeTombstoneFile (pb .dir , pb .tombstones ); err != nil {
564+ if err := writeTombstoneFile (pb .logger , pb . dir , pb .tombstones ); err != nil {
557565 return err
558566 }
559- return writeMetaFile (pb .dir , & pb .meta )
567+ return writeMetaFile (pb .logger , pb . dir , & pb .meta )
560568}
561569
562570// CleanTombstones will remove the tombstones and rewrite the block (only if there are any tombstones).
0 commit comments