Skip to content
This repository was archived by the owner on Aug 13, 2019. It is now read-only.

Commit 7912b39

Browse files
committed
cleanup tmp file if file renaming failed
Signed-off-by: zhulongcheng <[email protected]>
1 parent 4b3a5ac commit 7912b39

File tree

5 files changed

+51
-28
lines changed

5 files changed

+51
-28
lines changed

block.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
)
@@ -236,6 +237,9 @@ func writeMetaFile(dir string, meta *BlockMeta) error {
236237
// Make any changes to the file appear atomic.
237238
path := filepath.Join(dir, metaFilename)
238239
tmp := path + ".tmp"
240+
defer func() {
241+
os.RemoveAll(tmp)
242+
}()
239243

240244
f, err := os.Create(tmp)
241245
if err != nil {
@@ -259,7 +263,13 @@ func writeMetaFile(dir string, meta *BlockMeta) error {
259263
if err := f.Close(); err != nil {
260264
return err
261265
}
262-
return renameFile(tmp, path)
266+
267+
if err := fileutil.Rename(tmp, path); err != nil {
268+
merr.Add(err)
269+
return merr.Err()
270+
}
271+
272+
return nil
263273
}
264274

265275
// Block represents a directory of time series data covering a continuous time range.

compact.go

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ func (c *LeveledCompactor) write(dest string, meta *BlockMeta, blocks ...BlockRe
639639
df = nil
640640

641641
// Block successfully written, make visible and remove old ones.
642-
if err := renameFile(tmp, dir); err != nil {
642+
if err := fileutil.Rename(tmp, dir); err != nil {
643643
return errors.Wrap(err, "rename block dir")
644644
}
645645

@@ -1013,24 +1013,3 @@ func (c *compactionMerger) Err() error {
10131013
func (c *compactionMerger) At() (labels.Labels, []chunks.Meta, Intervals) {
10141014
return c.l, c.c, c.intervals
10151015
}
1016-
1017-
func renameFile(from, to string) error {
1018-
if err := os.RemoveAll(to); err != nil {
1019-
return err
1020-
}
1021-
if err := os.Rename(from, to); err != nil {
1022-
return err
1023-
}
1024-
1025-
// Directory was renamed; sync parent dir to persist rename.
1026-
pdir, err := fileutil.OpenDir(filepath.Dir(to))
1027-
if err != nil {
1028-
return err
1029-
}
1030-
1031-
if err = pdir.Sync(); err != nil {
1032-
pdir.Close()
1033-
return err
1034-
}
1035-
return pdir.Close()
1036-
}

repair.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
"github.com/go-kit/kit/log"
2424
"github.com/go-kit/kit/log/level"
2525
"github.com/pkg/errors"
26+
tsdb_errors "github.com/prometheus/tsdb/errors"
27+
"github.com/prometheus/tsdb/fileutil"
2628
)
2729

2830
// repairBadIndexVersion repairs an issue in index and meta.json persistence introduced in
@@ -38,6 +40,16 @@ func repairBadIndexVersion(logger log.Logger, dir string) error {
3840
wrapErr := func(err error, d string) error {
3941
return errors.Wrapf(err, "block dir: %q", d)
4042
}
43+
44+
tmpFiles := make([]string, 0, len(dir))
45+
defer func() {
46+
for _, tmp := range tmpFiles {
47+
if err := os.RemoveAll(tmp); err != nil {
48+
level.Error(logger).Log("msg", "remove tmp file", "err", err.Error())
49+
}
50+
}
51+
}()
52+
4153
for _, d := range dirs {
4254
meta, err := readBogusMetaFile(d)
4355
if err != nil {
@@ -63,27 +75,36 @@ func repairBadIndexVersion(logger log.Logger, dir string) error {
6375
if err != nil {
6476
return wrapErr(err, d)
6577
}
78+
tmpFiles = append(tmpFiles, repl.Name())
79+
6680
broken, err := os.Open(filepath.Join(d, indexFilename))
6781
if err != nil {
6882
return wrapErr(err, d)
6983
}
7084
if _, err := io.Copy(repl, broken); err != nil {
7185
return wrapErr(err, d)
7286
}
87+
88+
var merr tsdb_errors.MultiError
89+
7390
// Set the 5th byte to 2 to indicate the correct file format version.
7491
if _, err := repl.WriteAt([]byte{2}, 4); err != nil {
75-
return wrapErr(err, d)
92+
merr.Add(wrapErr(err, d))
93+
merr.Add(wrapErr(repl.Close(), d))
94+
return merr.Err()
7695
}
7796
if err := repl.Sync(); err != nil {
78-
return wrapErr(err, d)
97+
merr.Add(wrapErr(err, d))
98+
merr.Add(wrapErr(repl.Close(), d))
99+
return merr.Err()
79100
}
80101
if err := repl.Close(); err != nil {
81102
return wrapErr(err, d)
82103
}
83104
if err := broken.Close(); err != nil {
84105
return wrapErr(err, d)
85106
}
86-
if err := renameFile(repl.Name(), broken.Name()); err != nil {
107+
if err := fileutil.Replace(repl.Name(), broken.Name()); err != nil {
87108
return wrapErr(err, d)
88109
}
89110
// Reset version of meta.json to 1.

tombstones.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/pkg/errors"
2626
"github.com/prometheus/tsdb/encoding"
2727
tsdb_errors "github.com/prometheus/tsdb/errors"
28+
"github.com/prometheus/tsdb/fileutil"
2829
)
2930

3031
const tombstoneFilename = "tombstones"
@@ -55,6 +56,9 @@ func writeTombstoneFile(dir string, tr TombstoneReader) error {
5556
path := filepath.Join(dir, tombstoneFilename)
5657
tmp := path + ".tmp"
5758
hash := newCRC32()
59+
defer func() {
60+
os.RemoveAll(tmp)
61+
}()
5862

5963
f, err := os.Create(tmp)
6064
if err != nil {
@@ -111,7 +115,11 @@ func writeTombstoneFile(dir string, tr TombstoneReader) error {
111115
return err
112116
}
113117
f = nil
114-
return renameFile(tmp, path)
118+
119+
if err := fileutil.Rename(tmp, path); err != nil {
120+
return err
121+
}
122+
return nil
115123
}
116124

117125
// Stone holds the information on the posting and time-range

wal.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,10 @@ func (w *SegmentWAL) Truncate(mint int64, keep func(uint64) bool) error {
338338
if err != nil {
339339
return errors.Wrap(err, "create compaction segment")
340340
}
341+
defer func() {
342+
os.RemoveAll(f.Name())
343+
}()
344+
341345
var (
342346
csf = newSegmentFile(f)
343347
crc32 = newCRC32()
@@ -389,9 +393,10 @@ func (w *SegmentWAL) Truncate(mint int64, keep func(uint64) bool) error {
389393
csf.Close()
390394

391395
candidates[0].Close() // need close before remove on platform windows
392-
if err := renameFile(csf.Name(), candidates[0].Name()); err != nil {
396+
if err := fileutil.Replace(csf.Name(), candidates[0].Name()); err != nil {
393397
return errors.Wrap(err, "rename compaction segment")
394398
}
399+
395400
for _, f := range candidates[1:] {
396401
f.Close() // need close before remove on platform windows
397402
if err := os.RemoveAll(f.Name()); err != nil {

0 commit comments

Comments
 (0)