refactor: Remove reader and seeker capabilities from Drive interface to prevent incorrect usage as reader
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -18,7 +18,6 @@ type DriveWriterConfig struct {
|
||||
}
|
||||
|
||||
type Drive interface {
|
||||
io.ReadSeeker
|
||||
Fd() uintptr
|
||||
}
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user