feat: Port tape access management to move, restore and update cmds
This commit is contained in:
@@ -53,7 +53,7 @@ var deleteCmd = &cobra.Command{
|
||||
tm := tape.NewTapeManager(
|
||||
viper.GetString(driveFlag),
|
||||
viper.GetInt(recordSizeFlag),
|
||||
viper.GetBool(overwriteFlag),
|
||||
false,
|
||||
)
|
||||
|
||||
ops := operations.NewOperations(
|
||||
|
||||
@@ -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),
|
||||
},
|
||||
|
||||
@@ -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),
|
||||
},
|
||||
|
||||
@@ -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),
|
||||
},
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -16,7 +16,7 @@ type Operations struct {
|
||||
getDrive func() (config.DriveConfig, error)
|
||||
closeDrive func() error
|
||||
|
||||
writeLock sync.Mutex
|
||||
diskOperationLock sync.Mutex
|
||||
}
|
||||
|
||||
func NewOperations(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user