@@ -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,8 @@ func writeMetaFile(dir string, meta *BlockMeta) error {
259264 if err := f .Close (); err != nil {
260265 return err
261266 }
262- return renameFile (tmp , path )
267+
268+ return fileutil .Replace (tmp , path )
263269}
264270
265271// Block represents a directory of time series data covering a continuous time range.
@@ -278,6 +284,8 @@ type Block struct {
278284 chunkr ChunkReader
279285 indexr IndexReader
280286 tombstones TombstoneReader
287+
288+ logger log.Logger
281289}
282290
283291// OpenBlock opens the block in the directory. It can be passed a chunk pool, which is used
@@ -322,7 +330,7 @@ func OpenBlock(logger log.Logger, dir string, pool chunkenc.Pool) (pb *Block, er
322330 // that would be the logical place for a block size to be calculated.
323331 bs := blockSize (cr , ir , tsr )
324332 meta .Stats .NumBytes = bs
325- err = writeMetaFile (dir , meta )
333+ err = writeMetaFile (logger , dir , meta )
326334 if err != nil {
327335 level .Warn (logger ).Log ("msg" , "couldn't write the meta file for the block size" , "block" , dir , "err" , err )
328336 }
@@ -334,6 +342,7 @@ func OpenBlock(logger log.Logger, dir string, pool chunkenc.Pool) (pb *Block, er
334342 indexr : ir ,
335343 tombstones : tr ,
336344 symbolTableSize : ir .SymbolTableSize (),
345+ logger : logger ,
337346 }
338347 return pb , nil
339348}
@@ -429,7 +438,7 @@ func (pb *Block) GetSymbolTableSize() uint64 {
429438
430439func (pb * Block ) setCompactionFailed () error {
431440 pb .meta .Compaction .Failed = true
432- return writeMetaFile (pb .dir , & pb .meta )
441+ return writeMetaFile (pb .logger , pb . dir , & pb .meta )
433442}
434443
435444type blockIndexReader struct {
@@ -553,10 +562,10 @@ Outer:
553562 pb .tombstones = stones
554563 pb .meta .Stats .NumTombstones = pb .tombstones .Total ()
555564
556- if err := writeTombstoneFile (pb .dir , pb .tombstones ); err != nil {
565+ if err := writeTombstoneFile (pb .logger , pb . dir , pb .tombstones ); err != nil {
557566 return err
558567 }
559- return writeMetaFile (pb .dir , & pb .meta )
568+ return writeMetaFile (pb .logger , pb . dir , & pb .meta )
560569}
561570
562571// CleanTombstones will remove the tombstones and rewrite the block (only if there are any tombstones).
0 commit comments