diff --git a/cmd/stbak/cmd/delete.go b/cmd/stbak/cmd/delete.go index 538e7b7..dec0e35 100644 --- a/cmd/stbak/cmd/delete.go +++ b/cmd/stbak/cmd/delete.go @@ -53,7 +53,7 @@ var deleteCmd = &cobra.Command{ tm := tape.NewTapeManager( viper.GetString(driveFlag), viper.GetInt(recordSizeFlag), - viper.GetBool(overwriteFlag), + false, ) ops := operations.NewOperations( diff --git a/cmd/stbak/cmd/move.go b/cmd/stbak/cmd/move.go index 37dc1bc..90b6930 100644 --- a/cmd/stbak/cmd/move.go +++ b/cmd/stbak/cmd/move.go @@ -46,36 +46,24 @@ var moveCmd = &cobra.Command{ return err } - writer, writerIsRegular, err := tape.OpenTapeWriteOnly( + tm := tape.NewTapeManager( viper.GetString(driveFlag), viper.GetInt(recordSizeFlag), false, ) - if err != nil { - return err - } - defer writer.Close() - reader, readerIsRegular, err := tape.OpenTapeReadOnly( - viper.GetString(driveFlag), - ) - if err != nil { - return err - } - defer reader.Close() - return operations.Move( - config.DriveWriterConfig{ - Drive: writer, - DriveIsRegular: writerIsRegular, - }, - config.DriveConfig{ - Drive: reader, - DriveIsRegular: readerIsRegular, - }, - config.DriveReaderConfig{ - Drive: reader, - DriveIsRegular: readerIsRegular, - }, + ops := operations.NewOperations( + tm.GetWriter, + tm.Close, + + tm.GetReader, + tm.Close, + + tm.GetDrive, + tm.Close, + ) + + return ops.Move( config.MetadataConfig{ Metadata: viper.GetString(metadataFlag), }, diff --git a/cmd/stbak/cmd/restore.go b/cmd/stbak/cmd/restore.go index 99c9a9a..ae0d262 100644 --- a/cmd/stbak/cmd/restore.go +++ b/cmd/stbak/cmd/restore.go @@ -50,23 +50,24 @@ var restoreCmd = &cobra.Command{ return err } - reader, readerIsRegular, err := tape.OpenTapeReadOnly( + tm := tape.NewTapeManager( viper.GetString(driveFlag), + viper.GetInt(recordSizeFlag), + false, ) - if err != nil { - return nil - } - defer reader.Close() - return operations.Restore( - config.DriveReaderConfig{ - Drive: reader, - DriveIsRegular: readerIsRegular, - }, - config.DriveConfig{ - Drive: reader, - DriveIsRegular: readerIsRegular, - }, + ops := operations.NewOperations( + tm.GetWriter, + tm.Close, + + tm.GetReader, + tm.Close, + + tm.GetDrive, + tm.Close, + ) + + return ops.Restore( config.MetadataConfig{ Metadata: viper.GetString(metadataFlag), }, diff --git a/cmd/stbak/cmd/update.go b/cmd/stbak/cmd/update.go index 52f8c10..c94dfe1 100644 --- a/cmd/stbak/cmd/update.go +++ b/cmd/stbak/cmd/update.go @@ -53,36 +53,24 @@ var updateCmd = &cobra.Command{ return err } - writer, writerIsRegular, err := tape.OpenTapeWriteOnly( + tm := tape.NewTapeManager( viper.GetString(driveFlag), viper.GetInt(recordSizeFlag), false, ) - if err != nil { - return err - } - defer writer.Close() - reader, readerIsRegular, err := tape.OpenTapeReadOnly( - viper.GetString(driveFlag), - ) - if err != nil { - return err - } - defer reader.Close() - if _, err := operations.Update( - config.DriveWriterConfig{ - Drive: writer, - DriveIsRegular: writerIsRegular, - }, - config.DriveConfig{ - Drive: reader, - DriveIsRegular: readerIsRegular, - }, - config.DriveReaderConfig{ - Drive: reader, - DriveIsRegular: readerIsRegular, - }, + ops := operations.NewOperations( + tm.GetWriter, + tm.Close, + + tm.GetReader, + tm.Close, + + tm.GetDrive, + tm.Close, + ) + + if _, err := ops.Update( config.MetadataConfig{ Metadata: viper.GetString(metadataFlag), }, diff --git a/pkg/operations/archive.go b/pkg/operations/archive.go index 5460cc7..2507da6 100644 --- a/pkg/operations/archive.go +++ b/pkg/operations/archive.go @@ -43,8 +43,8 @@ func (o *Operations) Archive( onHeader func(hdr *models.Header), ) ([]*tar.Header, error) { - o.writeLock.Lock() - defer o.writeLock.Unlock() + o.diskOperationLock.Lock() + defer o.diskOperationLock.Unlock() writer, err := o.getWriter() if err != nil { diff --git a/pkg/operations/delete.go b/pkg/operations/delete.go index c3ab78f..52d6ff9 100644 --- a/pkg/operations/delete.go +++ b/pkg/operations/delete.go @@ -25,8 +25,8 @@ func (o *Operations) Delete( onHeader func(hdr *models.Header), ) error { - o.writeLock.Lock() - defer o.writeLock.Unlock() + o.diskOperationLock.Lock() + defer o.diskOperationLock.Unlock() writer, err := o.getWriter() if err != nil { diff --git a/pkg/operations/move.go b/pkg/operations/move.go index 86c4c64..7d5c79d 100644 --- a/pkg/operations/move.go +++ b/pkg/operations/move.go @@ -16,10 +16,7 @@ import ( "github.com/pojntfx/stfs/pkg/recovery" ) -func Move( - writer config.DriveWriterConfig, - drive config.DriveConfig, - reader config.DriveReaderConfig, +func (o *Operations) Move( metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -30,6 +27,14 @@ func Move( onHeader func(hdr *models.Header), ) error { + o.diskOperationLock.Lock() + defer o.diskOperationLock.Unlock() + + writer, err := o.getWriter() + if err != nil { + return err + } + dirty := false tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, recordSize) if err != nil { @@ -107,6 +112,22 @@ func Move( return err } + if err := o.closeWriter(); err != nil { + return err + } + + reader, err := o.getReader() + if err != nil { + return err + } + defer o.closeReader() + + drive, err := o.getDrive() + if err != nil { + return err + } + defer o.closeDrive() + return recovery.Index( reader, drive, diff --git a/pkg/operations/operations.go b/pkg/operations/operations.go index b459f12..e2dd9d7 100644 --- a/pkg/operations/operations.go +++ b/pkg/operations/operations.go @@ -16,7 +16,7 @@ type Operations struct { getDrive func() (config.DriveConfig, error) closeDrive func() error - writeLock sync.Mutex + diskOperationLock sync.Mutex } func NewOperations( diff --git a/pkg/operations/restore.go b/pkg/operations/restore.go index 8da7297..44e6be2 100644 --- a/pkg/operations/restore.go +++ b/pkg/operations/restore.go @@ -14,9 +14,7 @@ import ( "github.com/pojntfx/stfs/pkg/recovery" ) -func Restore( - reader config.DriveReaderConfig, - drive config.DriveConfig, +func (o *Operations) Restore( metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -28,6 +26,9 @@ func Restore( onHeader func(hdr *models.Header), ) error { + o.diskOperationLock.Lock() + defer o.diskOperationLock.Unlock() + metadataPersister := persisters.NewMetadataPersister(metadata.Metadata) if err := metadataPersister.Open(); err != nil { return err @@ -60,6 +61,18 @@ func Restore( headersToRestore = append(headersToRestore, dbhdrs...) } + reader, err := o.getReader() + if err != nil { + return err + } + defer o.closeReader() + + drive, err := o.getDrive() + if err != nil { + return err + } + defer o.closeDrive() + for _, dbhdr := range headersToRestore { if onHeader != nil { onHeader(dbhdr) diff --git a/pkg/operations/update.go b/pkg/operations/update.go index 78beb02..cf96f79 100644 --- a/pkg/operations/update.go +++ b/pkg/operations/update.go @@ -25,10 +25,7 @@ import ( "github.com/pojntfx/stfs/pkg/recovery" ) -func Update( - writer config.DriveWriterConfig, - drive config.DriveConfig, - reader config.DriveReaderConfig, +func (o *Operations) Update( metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -40,12 +37,19 @@ func Update( onHeader func(hdr *models.Header), ) ([]*tar.Header, error) { + o.diskOperationLock.Lock() + defer o.diskOperationLock.Unlock() + + writer, err := o.getWriter() + if err != nil { + return []*tar.Header{}, err + } + dirty := false tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, recordSize) if err != nil { return []*tar.Header{}, err } - defer cleanup(&dirty) metadataPersister := persisters.NewMetadataPersister(metadata.Metadata) if err := metadataPersister.Open(); err != nil { @@ -284,6 +288,22 @@ func Update( return []*tar.Header{}, err } + if err := o.closeWriter(); err != nil { + return []*tar.Header{}, err + } + + reader, err := o.getReader() + if err != nil { + return []*tar.Header{}, err + } + defer o.closeReader() + + drive, err := o.getDrive() + if err != nil { + return []*tar.Header{}, err + } + defer o.closeDrive() + return hdrs, recovery.Index( reader, drive,