@@ -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