refactor: Remove reader and seeker capabilities from Drive interface to prevent incorrect usage as reader

This commit is contained in:
Felicitas Pojtinger
2022-01-16 22:09:44 +01:00
parent 2a2419e98d
commit 17e3c64f29
6 changed files with 35 additions and 26 deletions

View File

@@ -56,6 +56,10 @@ var recoveryQueryCmd = &cobra.Command{
defer reader.Close()
if _, err := recovery.Query(
config.DriveReaderConfig{
Drive: reader,
DriveIsRegular: readerIsRegular,
},
config.DriveConfig{
Drive: reader,
DriveIsRegular: readerIsRegular,

View File

@@ -18,7 +18,6 @@ type DriveWriterConfig struct {
}
type Drive interface {
io.ReadSeeker
Fd() uintptr
}

View File

@@ -217,13 +217,15 @@ func (f *STFS) Initialize(rootProposal string, rootPerm os.FileMode) (root strin
existingRoot, err := f.metadata.Metadata.GetRootPath(context.Background())
if err == config.ErrNoRootDirectory {
drive, err := f.readOps.GetBackend().GetDrive()
mkdirRoot := func() (string, error) {
if err := f.readOps.GetBackend().CloseDrive(); err != nil {
return "", err
}
if err := f.readOps.GetBackend().CloseReader(); err != nil {
return "", err
}
if f.readOnly {
return "", os.ErrPermission
}
@@ -236,15 +238,18 @@ func (f *STFS) Initialize(rootProposal string, rootPerm os.FileMode) (root strin
return f.metadata.Metadata.GetRootPath(context.Background())
}
drive, err := f.readOps.GetBackend().GetDrive()
if err != nil {
return mkdirRoot()
}
reader, err := f.readOps.GetBackend().GetReader()
if err != nil {
return mkdirRoot()
}
if err := recovery.Index(
config.DriveReaderConfig{
Drive: drive.Drive,
DriveIsRegular: drive.DriveIsRegular,
},
reader,
drive,
f.readOps.GetMetadata(),
f.readOps.GetPipes(),

View File

@@ -50,7 +50,7 @@ func Fetch(
}
// Seek to block
br := bufio.NewReaderSize(drive.Drive, mtio.BlockSize*pipes.RecordSize)
br := bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize)
if _, err := br.Read(make([]byte, block*mtio.BlockSize)); err != nil {
return err
}

View File

@@ -155,7 +155,7 @@ func Index(
}
// Seek to block
br := bufio.NewReaderSize(drive.Drive, mtio.BlockSize*pipes.RecordSize)
br := bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize)
if _, err := br.Read(make([]byte, block*mtio.BlockSize)); err != nil {
return err
}
@@ -184,7 +184,7 @@ func Index(
}
block = 0
br = bufio.NewReaderSize(drive.Drive, mtio.BlockSize*pipes.RecordSize)
br = bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize)
curr = int64(int64(pipes.RecordSize) * mtio.BlockSize * record)
counter = &ioext.CounterReader{Reader: br, BytesRead: int(curr)}
tr = tar.NewReader(counter)

View File

@@ -16,7 +16,8 @@ import (
)
func Query(
state config.DriveConfig,
reader config.DriveReaderConfig,
drive config.DriveConfig,
pipes config.PipeConfig,
crypto config.CryptoConfig,
@@ -27,13 +28,13 @@ func Query(
) ([]*tar.Header, error) {
headers := []*tar.Header{}
if state.DriveIsRegular {
if reader.DriveIsRegular {
// Seek to record and block
if _, err := state.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*record)+block*mtio.BlockSize), 0); err != nil {
if _, err := reader.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*record)+block*mtio.BlockSize), 0); err != nil {
return []*tar.Header{}, err
}
tr := tar.NewReader(state.Drive)
tr := tar.NewReader(reader.Drive)
record := int64(record)
block := int64(block)
@@ -42,7 +43,7 @@ func Query(
hdr, err := tr.Next()
if err != nil {
for {
curr, err := state.Drive.Seek(0, io.SeekCurrent)
curr, err := reader.Drive.Seek(0, io.SeekCurrent)
if err != nil {
return []*tar.Header{}, err
}
@@ -60,11 +61,11 @@ func Query(
}
// Seek to record and block
if _, err := state.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*int(record))+int(block)*mtio.BlockSize), io.SeekStart); err != nil {
if _, err := reader.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*int(record))+int(block)*mtio.BlockSize), io.SeekStart); err != nil {
return []*tar.Header{}, err
}
tr = tar.NewReader(state.Drive)
tr = tar.NewReader(reader.Drive)
hdr, err = tr.Next()
if err != nil {
@@ -91,7 +92,7 @@ func Query(
return []*tar.Header{}, err
}
if err := signature.VerifyHeader(hdr, state.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil {
if err := signature.VerifyHeader(hdr, reader.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil {
return []*tar.Header{}, err
}
@@ -106,7 +107,7 @@ func Query(
headers = append(headers, hdr)
curr, err := state.Drive.Seek(0, io.SeekCurrent)
curr, err := reader.Drive.Seek(0, io.SeekCurrent)
if err != nil {
return []*tar.Header{}, err
}
@@ -115,7 +116,7 @@ func Query(
return []*tar.Header{}, err
}
currAndSize, err := state.Drive.Seek(0, io.SeekCurrent)
currAndSize, err := reader.Drive.Seek(0, io.SeekCurrent)
if err != nil {
return []*tar.Header{}, err
}
@@ -131,12 +132,12 @@ func Query(
}
} else {
// Seek to record
if err := mtio.SeekToRecordOnTape(state.Drive.Fd(), int32(record)); err != nil {
if err := mtio.SeekToRecordOnTape(drive.Drive.Fd(), int32(record)); err != nil {
return []*tar.Header{}, err
}
// Seek to block
br := bufio.NewReaderSize(state.Drive, mtio.BlockSize*pipes.RecordSize)
br := bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize)
if _, err := br.Read(make([]byte, block*mtio.BlockSize)); err != nil {
return []*tar.Header{}, err
}
@@ -152,19 +153,19 @@ func Query(
hdr, err := tr.Next()
if err != nil {
if err == io.EOF {
if err := mtio.GoToNextFileOnTape(state.Drive.Fd()); err != nil {
if err := mtio.GoToNextFileOnTape(drive.Drive.Fd()); err != nil {
// EOD
break
}
record, err = mtio.GetCurrentRecordFromTape(state.Drive.Fd())
record, err = mtio.GetCurrentRecordFromTape(drive.Drive.Fd())
if err != nil {
return []*tar.Header{}, err
}
block = 0
br = bufio.NewReaderSize(state.Drive, mtio.BlockSize*pipes.RecordSize)
br = bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize)
curr := int64(int64(pipes.RecordSize) * mtio.BlockSize * record)
counter := &ioext.CounterReader{Reader: br, BytesRead: int(curr)}
tr = tar.NewReader(counter)
@@ -179,7 +180,7 @@ func Query(
return []*tar.Header{}, err
}
if err := signature.VerifyHeader(hdr, state.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil {
if err := signature.VerifyHeader(hdr, reader.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil {
return []*tar.Header{}, err
}