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

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