feat: Add centralized tape access management to archive cmd
This commit is contained in:
@@ -31,10 +31,7 @@ var (
|
||||
errSocketsNotSupported = errors.New("archive/tar: sockets not supported")
|
||||
)
|
||||
|
||||
func Archive(
|
||||
writer config.DriveWriterConfig,
|
||||
drive config.DriveConfig,
|
||||
reader config.DriveReaderConfig,
|
||||
func (o *Operations) Archive(
|
||||
metadata config.MetadataConfig,
|
||||
pipes config.PipeConfig,
|
||||
crypto config.CryptoConfig,
|
||||
@@ -46,12 +43,19 @@ func Archive(
|
||||
|
||||
onHeader func(hdr *models.Header),
|
||||
) ([]*tar.Header, error) {
|
||||
o.writeLock.Lock()
|
||||
defer o.writeLock.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 {
|
||||
@@ -260,11 +264,31 @@ func Archive(
|
||||
return []*tar.Header{}, err
|
||||
}
|
||||
|
||||
if err := cleanup(&dirty); err != nil {
|
||||
return []*tar.Header{}, err
|
||||
}
|
||||
|
||||
index := 1 // Ignore the first header, which is the last header which we already indexed
|
||||
if overwrite {
|
||||
index = 0 // If we are starting fresh, index from start
|
||||
}
|
||||
|
||||
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,
|
||||
|
||||
@@ -33,7 +33,6 @@ func Delete(
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer cleanup(&dirty)
|
||||
|
||||
metadataPersister := persisters.NewMetadataPersister(metadata.Metadata)
|
||||
if err := metadataPersister.Open(); err != nil {
|
||||
@@ -100,6 +99,10 @@ func Delete(
|
||||
dirty = true
|
||||
}
|
||||
|
||||
if err := cleanup(&dirty); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return recovery.Index(
|
||||
reader,
|
||||
drive,
|
||||
|
||||
@@ -35,7 +35,6 @@ func Move(
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer cleanup(&dirty)
|
||||
|
||||
metadataPersister := persisters.NewMetadataPersister(metadata.Metadata)
|
||||
if err := metadataPersister.Open(); err != nil {
|
||||
@@ -104,6 +103,10 @@ func Move(
|
||||
dirty = true
|
||||
}
|
||||
|
||||
if err := cleanup(&dirty); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return recovery.Index(
|
||||
reader,
|
||||
drive,
|
||||
|
||||
42
pkg/operations/operations.go
Normal file
42
pkg/operations/operations.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package operations
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/pojntfx/stfs/pkg/config"
|
||||
)
|
||||
|
||||
type Operations struct {
|
||||
getWriter func() (config.DriveWriterConfig, error)
|
||||
closeWriter func() error
|
||||
|
||||
getReader func() (config.DriveReaderConfig, error)
|
||||
closeReader func() error
|
||||
|
||||
getDrive func() (config.DriveConfig, error)
|
||||
closeDrive func() error
|
||||
|
||||
writeLock sync.Mutex
|
||||
}
|
||||
|
||||
func NewOperations(
|
||||
getWriter func() (config.DriveWriterConfig, error),
|
||||
closeWriter func() error,
|
||||
|
||||
getReader func() (config.DriveReaderConfig, error),
|
||||
closeReader func() error,
|
||||
|
||||
getDrive func() (config.DriveConfig, error),
|
||||
closeDrive func() error,
|
||||
) *Operations {
|
||||
return &Operations{
|
||||
getWriter: getWriter,
|
||||
closeWriter: closeWriter,
|
||||
|
||||
getReader: getReader,
|
||||
closeReader: closeReader,
|
||||
|
||||
getDrive: getDrive,
|
||||
closeDrive: closeDrive,
|
||||
}
|
||||
}
|
||||
@@ -280,6 +280,10 @@ func Update(
|
||||
return []*tar.Header{}, err
|
||||
}
|
||||
|
||||
if err := cleanup(&dirty); err != nil {
|
||||
return []*tar.Header{}, err
|
||||
}
|
||||
|
||||
return hdrs, recovery.Index(
|
||||
reader,
|
||||
drive,
|
||||
|
||||
Reference in New Issue
Block a user