fix: Don't assume EOF filemark size on disk
This commit is contained in:
@@ -96,27 +96,26 @@ func index(
|
|||||||
for {
|
for {
|
||||||
hdr, err := tr.Next()
|
hdr, err := tr.Next()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Seek right after the next two blocks to skip the trailer
|
for {
|
||||||
if _, err := f.Seek((controllers.BlockSize * 2), io.SeekCurrent); err == nil {
|
|
||||||
curr, err := f.Seek(0, io.SeekCurrent)
|
curr, err := f.Seek(0, io.SeekCurrent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
nextTotalBlocks := math.Ceil(float64((curr)) / float64(controllers.BlockSize))
|
nextTotalBlocks := math.Ceil(float64((curr)) / float64(controllers.BlockSize))
|
||||||
record = int64(nextTotalBlocks) / int64(recordSize)
|
record = int64(nextTotalBlocks) / int64(viper.GetInt(recordSizeFlag))
|
||||||
block = int64(nextTotalBlocks) - (record * int64(recordSize)) - 2
|
block = int64(nextTotalBlocks) - (record * int64(viper.GetInt(recordSizeFlag)))
|
||||||
|
|
||||||
if block < 0 {
|
if block < 0 {
|
||||||
record--
|
record--
|
||||||
block = int64(recordSize) - 1
|
block = int64(viper.GetInt(recordSizeFlag)) - 1
|
||||||
} else if block >= int64(recordSize) {
|
} else if block >= int64(viper.GetInt(recordSizeFlag)) {
|
||||||
record++
|
record++
|
||||||
block = 0
|
block = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seek to record and block
|
// 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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,16 +124,24 @@ func index(
|
|||||||
hdr, err = tr.Next()
|
hdr, err = tr.Next()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
|
// EOF
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
continue
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
return err
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if hdr == nil {
|
||||||
|
// EOF
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
if err := indexHeader(record, block, hdr, metadataPersister, compressionFormat); err != nil {
|
if err := indexHeader(record, block, hdr, metadataPersister, compressionFormat); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,8 +47,7 @@ var recoveryQueryCmd = &cobra.Command{
|
|||||||
for {
|
for {
|
||||||
hdr, err := tr.Next()
|
hdr, err := tr.Next()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Seek right after the next two blocks to skip the trailer
|
for {
|
||||||
if _, err := f.Seek((controllers.BlockSize * 2), io.SeekCurrent); err == nil {
|
|
||||||
curr, err := f.Seek(0, io.SeekCurrent)
|
curr, err := f.Seek(0, io.SeekCurrent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -56,7 +55,7 @@ var recoveryQueryCmd = &cobra.Command{
|
|||||||
|
|
||||||
nextTotalBlocks := math.Ceil(float64((curr)) / float64(controllers.BlockSize))
|
nextTotalBlocks := math.Ceil(float64((curr)) / float64(controllers.BlockSize))
|
||||||
record = int64(nextTotalBlocks) / int64(viper.GetInt(recordSizeFlag))
|
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 {
|
if block < 0 {
|
||||||
record--
|
record--
|
||||||
@@ -76,16 +75,24 @@ var recoveryQueryCmd = &cobra.Command{
|
|||||||
hdr, err = tr.Next()
|
hdr, err = tr.Next()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
|
// EOF
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
continue
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
return err
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if hdr == nil {
|
||||||
|
// EOF
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
if record == 0 && block == 0 {
|
if record == 0 && block == 0 {
|
||||||
if err := formatting.PrintCSV(formatting.TARHeaderCSV); err != nil {
|
if err := formatting.PrintCSV(formatting.TARHeaderCSV); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user