package sectorstorage import ( "context" "golang.org/x/xerrors" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/stores" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" ) type readonlyProvider struct { index stores.SectorIndex stor *stores.Local remote *stores.Remote } func (l *readonlyProvider) AcquireSector(ctx context.Context, id storage.SectorRef, existing storiface.SectorFileType, allocate storiface.SectorFileType, sealing storiface.PathType) (storiface.SectorPaths, func(), error) { if allocate != storiface.FTNone { return storiface.SectorPaths{}, nil, xerrors.New("read-only storage") } ctx, cancel := context.WithCancel(ctx) // use TryLock to avoid blocking locked, err := l.index.StorageTryLock(ctx, id.ID, existing, storiface.FTNone) if err != nil { cancel() return storiface.SectorPaths{}, nil, xerrors.Errorf("acquiring sector lock: %w", err) } if !locked { cancel() return storiface.SectorPaths{}, nil, xerrors.Errorf("failed to acquire sector lock") } p, _, err := l.stor.AcquireSector(ctx, id, existing, allocate, sealing, storiface.AcquireMove) return p, cancel, err } func (l *readonlyProvider) AcquireSectorPaths(ctx context.Context, id storage.SectorRef, existing storiface.SectorFileType, sealing storiface.PathType) (storiface.SectorPaths, func(), error) { ctx, cancel := context.WithCancel(ctx) // use TryLock to avoid blocking locked, err := l.index.StorageTryLock(ctx, id.ID, existing, storiface.FTNone) if err != nil { cancel() return storiface.SectorPaths{}, nil, xerrors.Errorf("acquiring sector lock: %w", err) } if !locked { cancel() return storiface.SectorPaths{}, nil, xerrors.Errorf("failed to acquire sector lock") } p, _, err := l.remote.AcquireSectorPaths(ctx, id, existing, storiface.FTNone, sealing) return p, cancel, err }