feat: Port tape access management to move, restore and update cmds
This commit is contained in:
@@ -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