@@ -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,12 @@ 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+ if err := fileutil .Replace (tmp , path ); err != nil {
269+ return err
270+ }
271+
272+ return nil
263273}
264274
265275// Block represents a directory of time series data covering a continuous time range.
@@ -278,6 +288,8 @@ type Block struct {
278288 chunkr ChunkReader
279289 indexr IndexReader
280290 tombstones TombstoneReader
291+
292+ logger log.Logger
281293}
282294
283295// OpenBlock opens the block in the directory. It can be passed a chunk pool, which is used
@@ -322,7 +334,7 @@ func OpenBlock(logger log.Logger, dir string, pool chunkenc.Pool) (pb *Block, er
322334 // that would be the logical place for a block size to be calculated.
323335 bs := blockSize (cr , ir , tsr )
324336 meta .Stats .NumBytes = bs
325- err = writeMetaFile (dir , meta )
337+ err = writeMetaFile (logger , dir , meta )
326338 if err != nil {
327339 level .Warn (logger ).Log ("msg" , "couldn't write the meta file for the block size" , "block" , dir , "err" , err )
328340 }
@@ -334,6 +346,7 @@ func OpenBlock(logger log.Logger, dir string, pool chunkenc.Pool) (pb *Block, er
334346 indexr : ir ,
335347 tombstones : tr ,
336348 symbolTableSize : ir .SymbolTableSize (),
349+ logger : logger ,
337350 }
338351 return pb , nil
339352}
@@ -429,7 +442,7 @@ func (pb *Block) GetSymbolTableSize() uint64 {
429442
430443func (pb * Block ) setCompactionFailed () error {
431444 pb .meta .Compaction .Failed = true
432- return writeMetaFile (pb .dir , & pb .meta )
445+ return writeMetaFile (pb .logger , pb . dir , & pb .meta )
433446}
434447
435448type blockIndexReader struct {
@@ -553,10 +566,10 @@ Outer:
553566 pb .tombstones = stones
554567 pb .meta .Stats .NumTombstones = pb .tombstones .Total ()
555568
556- if err := writeTombstoneFile (pb .dir , pb .tombstones ); err != nil {
569+ if err := writeTombstoneFile (pb .logger , pb . dir , pb .tombstones ); err != nil {
557570 return err
558571 }
559- return writeMetaFile (pb .dir , & pb .meta )
572+ return writeMetaFile (pb .logger , pb . dir , & pb .meta )
560573}
561574
562575// CleanTombstones will remove the tombstones and rewrite the block (only if there are any tombstones).
0 commit comments