@@ -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.
0 commit comments