From b60929205a83b44d7bdd0b7d6cf22c9243e07f51 Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Wed, 1 Dec 2021 00:01:18 +0100 Subject: [PATCH] fix: Don't assume EOF filemark size on disk --- cmd/stbak/cmd/recovery_index.go | 27 +++++++++++++++++---------- cmd/stbak/cmd/recovery_query.go | 19 +++++++++++++------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/cmd/stbak/cmd/recovery_index.go b/cmd/stbak/cmd/recovery_index.go index 8fc9e84..f320e88 100644 --- a/cmd/stbak/cmd/recovery_index.go +++ b/cmd/stbak/cmd/recovery_index.go @@ -96,27 +96,26 @@ func index( for { hdr, err := tr.Next() if err != nil { - // Seek right after the next two blocks to skip the trailer - if _, err := f.Seek((controllers.BlockSize * 2), io.SeekCurrent); err == nil { + for { curr, err := f.Seek(0, io.SeekCurrent) if err != nil { return err } nextTotalBlocks := math.Ceil(float64((curr)) / float64(controllers.BlockSize)) - record = int64(nextTotalBlocks) / int64(recordSize) - block = int64(nextTotalBlocks) - (record * int64(recordSize)) - 2 + record = int64(nextTotalBlocks) / int64(viper.GetInt(recordSizeFlag)) + block = int64(nextTotalBlocks) - (record * int64(viper.GetInt(recordSizeFlag))) if block < 0 { record-- - block = int64(recordSize) - 1 - } else if block >= int64(recordSize) { + block = int64(viper.GetInt(recordSizeFlag)) - 1 + } else if block >= int64(viper.GetInt(recordSizeFlag)) { record++ block = 0 } // Seek to record and block - if _, err := f.Seek(int64((recordSize*controllers.BlockSize*int(record))+int(block)*controllers.BlockSize), io.SeekStart); err != nil { + if _, err := f.Seek(int64((viper.GetInt(recordSizeFlag)*controllers.BlockSize*int(record))+int(block)*controllers.BlockSize), io.SeekStart); err != nil { return err } @@ -125,16 +124,24 @@ func index( hdr, err = tr.Next() if err != nil { if err == io.EOF { + // EOF + break } - return err + continue } - } else { - return err + + break } } + if hdr == nil { + // EOF + + break + } + if err := indexHeader(record, block, hdr, metadataPersister, compressionFormat); err != nil { return nil } diff --git a/cmd/stbak/cmd/recovery_query.go b/cmd/stbak/cmd/recovery_query.go index 4029a86..bdb15fd 100644 --- a/cmd/stbak/cmd/recovery_query.go +++ b/cmd/stbak/cmd/recovery_query.go @@ -47,8 +47,7 @@ var recoveryQueryCmd = &cobra.Command{ for { hdr, err := tr.Next() if err != nil { - // Seek right after the next two blocks to skip the trailer - if _, err := f.Seek((controllers.BlockSize * 2), io.SeekCurrent); err == nil { + for { curr, err := f.Seek(0, io.SeekCurrent) if err != nil { return err @@ -56,7 +55,7 @@ var recoveryQueryCmd = &cobra.Command{ nextTotalBlocks := math.Ceil(float64((curr)) / float64(controllers.BlockSize)) record = int64(nextTotalBlocks) / int64(viper.GetInt(recordSizeFlag)) - block = int64(nextTotalBlocks) - (record * int64(viper.GetInt(recordSizeFlag))) - 2 + block = int64(nextTotalBlocks) - (record * int64(viper.GetInt(recordSizeFlag))) if block < 0 { record-- @@ -76,16 +75,24 @@ var recoveryQueryCmd = &cobra.Command{ hdr, err = tr.Next() if err != nil { if err == io.EOF { + // EOF + break } - return err + continue } - } else { - return err + + break } } + if hdr == nil { + // EOF + + break + } + if record == 0 && block == 0 { if err := formatting.PrintCSV(formatting.TARHeaderCSV); err != nil { return err