feat: Port tape access management to move, restore and update cmds

This commit is contained in:
Felicitas Pojtinger
2021-12-14 22:54:53 +01:00
parent ca905ef225
commit b610287fad
10 changed files with 113 additions and 82 deletions

View File

@@ -53,7 +53,7 @@ var deleteCmd = &cobra.Command{
tm := tape.NewTapeManager(
viper.GetString(driveFlag),
viper.GetInt(recordSizeFlag),
viper.GetBool(overwriteFlag),
false,
)
ops := operations.NewOperations(

View File

@@ -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),
},

View File

@@ -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),
},

View File

@@ -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),
},

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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,

View File

@@ -16,7 +16,7 @@ type Operations struct {
getDrive func() (config.DriveConfig, error)
closeDrive func() error
writeLock sync.Mutex
diskOperationLock sync.Mutex
}
func NewOperations(

View File

@@ -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)

View File

@@ -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,