Skip to content

Commit 7bfa328

Browse files
author
Ivan Sim
committed
Update tar write function to handle irregular files
Signed-off-by: Ivan Sim <isim@redhat.com>
1 parent 7dc0559 commit 7bfa328

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

core/cmd/main.go

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -164,27 +164,11 @@ func compressed(dataDir string, blocks []*promtsdb.Block, writer *io.PipeWriter)
164164
var (
165165
buf = &bytes.Buffer{}
166166
tw = tar.NewWriter(buf)
167-
168-
dirChunksHead = filepath.Join(dataDir, "chunks_head")
169-
dirWAL = filepath.Join(dataDir, "wal")
170167
)
171168

172-
writeHeader := func(path string, info os.FileInfo, typeFlag byte) error {
173-
name := path[len(dataDir)+1:]
174-
header := &tar.Header{
175-
Name: name,
176-
Mode: int64(info.Mode()),
177-
ModTime: info.ModTime(),
178-
Size: info.Size(),
179-
Typeflag: typeFlag,
180-
}
181-
182-
return tw.WriteHeader(header)
183-
}
184-
185169
dirs := []string{
186-
dirChunksHead,
187-
dirWAL,
170+
filepath.Join(dataDir, "chunks_head"),
171+
filepath.Join(dataDir, "wal"),
188172
}
189173
for _, block := range blocks {
190174
dirs = append(dirs, block.Dir())
@@ -197,7 +181,20 @@ func compressed(dataDir string, blocks []*promtsdb.Block, writer *io.PipeWriter)
197181
return err
198182
}
199183

200-
if err := writeHeader(path, info, tar.TypeReg); err != nil {
184+
var link string
185+
if info.Mode()&os.ModeSymlink == os.ModeSymlink {
186+
if link, err = os.Readlink(path); err != nil {
187+
return err
188+
}
189+
}
190+
191+
header, err := tar.FileInfoHeader(info, link)
192+
if err != nil {
193+
return err
194+
}
195+
196+
header.Name = path[len(dataDir)+1:]
197+
if err = tw.WriteHeader(header); err != nil {
201198
return err
202199
}
203200

@@ -210,7 +207,8 @@ func compressed(dataDir string, blocks []*promtsdb.Block, writer *io.PipeWriter)
210207
return fmt.Errorf("failed to read data file: %w", err)
211208
}
212209

213-
if _, err := tw.Write(data); err != nil {
210+
buf := bytes.NewBuffer(data)
211+
if _, err := io.Copy(tw, buf); err != nil {
214212
return fmt.Errorf("failed to write compressed file: %w", err)
215213
}
216214

0 commit comments

Comments
 (0)