diff options
| -rw-r--r-- | objectstore/chain/bytes.go | 8 | ||||
| -rw-r--r-- | objectstore/chain/chain.go | 5 | ||||
| -rw-r--r-- | objectstore/chain/close.go | 25 | ||||
| -rw-r--r-- | objectstore/chain/header.go | 4 | ||||
| -rw-r--r-- | objectstore/chain/new.go | 3 | ||||
| -rw-r--r-- | objectstore/chain/reader.go | 8 | ||||
| -rw-r--r-- | objectstore/chain/refresh.go | 4 | ||||
| -rw-r--r-- | objectstore/chain/size.go | 4 | ||||
| -rw-r--r-- | objectstore/mix/close.go | 34 | ||||
| -rw-r--r-- | objectstore/mix/mix.go | 2 | ||||
| -rw-r--r-- | objectstore/mix/new.go | 7 | ||||
| -rw-r--r-- | receivepack/service/run_hook.go | 16 | ||||
| -rw-r--r-- | refstore/chain/chain.go | 2 | ||||
| -rw-r--r-- | refstore/chain/close.go | 25 | ||||
| -rw-r--r-- | refstore/chain/list.go | 4 | ||||
| -rw-r--r-- | refstore/chain/new.go | 3 | ||||
| -rw-r--r-- | refstore/chain/resolve.go | 4 | ||||
| -rw-r--r-- | repository/close.go | 8 | ||||
| -rw-r--r-- | repository/objects.go | 46 | ||||
| -rw-r--r-- | repository/open.go | 6 | ||||
| -rw-r--r-- | repository/repository.go | 15 | ||||
| -rw-r--r-- | repository/write_loose.go | 2 |
22 files changed, 74 insertions, 161 deletions
diff --git a/objectstore/chain/bytes.go b/objectstore/chain/bytes.go index 007c7522..64771608 100644 --- a/objectstore/chain/bytes.go +++ b/objectstore/chain/bytes.go @@ -12,10 +12,6 @@ import ( // ReadBytesFull reads a full serialized object from the first backend that has it. func (chain *Chain) ReadBytesFull(id objectid.ObjectID) ([]byte, error) { for i, backend := range chain.backends { - if backend == nil { - continue - } - full, err := backend.ReadBytesFull(id) if err == nil { return full, nil @@ -34,10 +30,6 @@ func (chain *Chain) ReadBytesFull(id objectid.ObjectID) ([]byte, error) { // ReadBytesContent reads an object's type and content bytes from the first backend that has it. func (chain *Chain) ReadBytesContent(id objectid.ObjectID) (objecttype.Type, []byte, error) { for i, backend := range chain.backends { - if backend == nil { - continue - } - ty, content, err := backend.ReadBytesContent(id) if err == nil { return ty, content, nil diff --git a/objectstore/chain/chain.go b/objectstore/chain/chain.go index 2b17369d..00e98b91 100644 --- a/objectstore/chain/chain.go +++ b/objectstore/chain/chain.go @@ -1,4 +1,5 @@ -// Package chain provides a wrapper object storage backend to query a chain of backends. +// Package chain provides a wrapper object storage backend to query a chain of +// backends. package chain import ( @@ -6,6 +7,8 @@ import ( ) // Chain queries multiple object databases in order. +// +// Chain borrows its backend stores. type Chain struct { backends []objectstore.Store } diff --git a/objectstore/chain/close.go b/objectstore/chain/close.go index 440afb10..6bd74565 100644 --- a/objectstore/chain/close.go +++ b/objectstore/chain/close.go @@ -1,21 +1,8 @@ package chain -import "errors" - -// Close closes all backends and joins close errors. -func (chain *Chain) Close() error { - var errs []error - - for _, backend := range chain.backends { - if backend == nil { - continue - } - - err := backend.Close() - if err != nil { - errs = append(errs, err) - } - } - - return errors.Join(errs...) -} +// Close releases wrapper-local resources. +// +// Chain borrows its backends, so Close does not close them. +// +// Repeated calls to Close are undefined behavior. +func (chain *Chain) Close() error { return nil } diff --git a/objectstore/chain/header.go b/objectstore/chain/header.go index c1d4692c..59f6bba6 100644 --- a/objectstore/chain/header.go +++ b/objectstore/chain/header.go @@ -12,10 +12,6 @@ import ( // ReadHeader reads object header data from the first backend that has it. func (chain *Chain) ReadHeader(id objectid.ObjectID) (objecttype.Type, int64, error) { for i, backend := range chain.backends { - if backend == nil { - continue - } - ty, size, err := backend.ReadHeader(id) if err == nil { return ty, size, nil diff --git a/objectstore/chain/new.go b/objectstore/chain/new.go index ca00e9be..887904e3 100644 --- a/objectstore/chain/new.go +++ b/objectstore/chain/new.go @@ -3,6 +3,9 @@ package chain import "codeberg.org/lindenii/furgit/objectstore" // New creates an ordered object database chain. +// +// The provided backends must be non-nil and distinct. +// Chain borrows the provided backends and does not close them in Close. func New(backends ...objectstore.Store) *Chain { return &Chain{ backends: append([]objectstore.Store(nil), backends...), diff --git a/objectstore/chain/reader.go b/objectstore/chain/reader.go index e005d929..41060a5b 100644 --- a/objectstore/chain/reader.go +++ b/objectstore/chain/reader.go @@ -13,10 +13,6 @@ import ( // ReadReaderFull reads a full serialized object stream from the first backend that has it. func (chain *Chain) ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error) { for i, backend := range chain.backends { - if backend == nil { - continue - } - reader, err := backend.ReadReaderFull(id) if err == nil { return reader, nil @@ -35,10 +31,6 @@ func (chain *Chain) ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error) // ReadReaderContent reads an object's type, declared content length, and content stream from the first backend that has it. func (chain *Chain) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, int64, io.ReadCloser, error) { for i, backend := range chain.backends { - if backend == nil { - continue - } - ty, size, reader, err := backend.ReadReaderContent(id) if err == nil { return ty, size, reader, nil diff --git a/objectstore/chain/refresh.go b/objectstore/chain/refresh.go index 66c6f0a0..c47352dc 100644 --- a/objectstore/chain/refresh.go +++ b/objectstore/chain/refresh.go @@ -7,10 +7,6 @@ func (chain *Chain) Refresh() error { var errs []error for _, backend := range chain.backends { - if backend == nil { - continue - } - err := backend.Refresh() if err != nil { errs = append(errs, err) diff --git a/objectstore/chain/size.go b/objectstore/chain/size.go index 38aa7abc..9815317f 100644 --- a/objectstore/chain/size.go +++ b/objectstore/chain/size.go @@ -11,10 +11,6 @@ import ( // ReadSize reads object content length from the first backend that has it. func (chain *Chain) ReadSize(id objectid.ObjectID) (int64, error) { for i, backend := range chain.backends { - if backend == nil { - continue - } - size, err := backend.ReadSize(id) if err == nil { return size, nil diff --git a/objectstore/mix/close.go b/objectstore/mix/close.go index b30116dc..53f6cd30 100644 --- a/objectstore/mix/close.go +++ b/objectstore/mix/close.go @@ -1,30 +1,8 @@ package mix -import ( - "errors" - - "codeberg.org/lindenii/furgit/objectstore" -) - -// Close closes all backends and joins close errors. -func (mix *Mix) Close() error { - mix.mu.RLock() - - backends := make([]objectstore.Store, 0, len(mix.backendNodeByStore)) - for node := mix.backendHead; node != nil; node = node.next { - backends = append(backends, node.backend) - } - - mix.mu.RUnlock() - - var errs []error - - for _, backend := range backends { - err := backend.Close() - if err != nil { - errs = append(errs, err) - } - } - - return errors.Join(errs...) -} +// Close releases wrapper-local resources. +// +// Mix borrows its backends, so Close does not close them. +// +// Repeated calls to Close are undefined behavior. +func (mix *Mix) Close() error { return nil } diff --git a/objectstore/mix/mix.go b/objectstore/mix/mix.go index e2757705..ef381b95 100644 --- a/objectstore/mix/mix.go +++ b/objectstore/mix/mix.go @@ -9,6 +9,8 @@ import ( ) // Mix queries multiple object databases with an MRU backend preference. +// +// Mix borrows its backend stores. type Mix struct { mu sync.RWMutex diff --git a/objectstore/mix/new.go b/objectstore/mix/new.go index c6fdeeee..16c6c9eb 100644 --- a/objectstore/mix/new.go +++ b/objectstore/mix/new.go @@ -3,6 +3,9 @@ package mix import "codeberg.org/lindenii/furgit/objectstore" // New creates a Mix from backends. +// +// The provided backends must be non-nil and distinct. +// Mix borrows the provided backends and does not close them in Close. func New(backends ...objectstore.Store) *Mix { nodeByStore := make(map[objectstore.Store]*backendNode, len(backends)) @@ -12,10 +15,6 @@ func New(backends ...objectstore.Store) *Mix { ) for _, backend := range backends { - if backend == nil { - continue - } - node := &backendNode{ backend: backend, prev: tail, diff --git a/receivepack/service/run_hook.go b/receivepack/service/run_hook.go index ada897d8..1ab76599 100644 --- a/receivepack/service/run_hook.go +++ b/receivepack/service/run_hook.go @@ -41,6 +41,8 @@ func (service *Service) runHook( var ( quarantineObjectsStore objectstore.Store + quarantineLooseStore *loose.Store + quarantinePackedStore *packed.Store quarantineLooseRoot *os.Root quarantinePackRoot *os.Root err error @@ -54,7 +56,7 @@ func (service *Service) runHook( return nil, nil, nil, false, err.Error() } - quarantineLooseStore, err := loose.New(quarantineLooseRoot, service.opts.Algorithm) + quarantineLooseStore, err = loose.New(quarantineLooseRoot, service.opts.Algorithm) if err != nil { _ = quarantineLooseRoot.Close() @@ -68,7 +70,9 @@ func (service *Service) runHook( quarantinePackRoot, err = quarantineLooseRoot.OpenRoot("pack") if err == nil { - quarantinePackedStore, packedErr := packed.New(quarantinePackRoot, service.opts.Algorithm, packed.Options{}) + var packedErr error + + quarantinePackedStore, packedErr = packed.New(quarantinePackRoot, service.opts.Algorithm, packed.Options{}) if packedErr != nil { _ = quarantineLooseStore.Close() _ = quarantinePackRoot.Close() @@ -95,6 +99,14 @@ func (service *Service) runHook( _ = quarantineObjectsStore.Close() } + if quarantinePackedStore != nil { + _ = quarantinePackedStore.Close() + } + + if quarantineLooseStore != nil { + _ = quarantineLooseStore.Close() + } + if quarantinePackRoot != nil { _ = quarantinePackRoot.Close() } diff --git a/refstore/chain/chain.go b/refstore/chain/chain.go index 882d4b56..0feb97c3 100644 --- a/refstore/chain/chain.go +++ b/refstore/chain/chain.go @@ -5,6 +5,8 @@ package chain import "codeberg.org/lindenii/furgit/refstore" // Chain queries multiple reference stores in order. +// +// Chain borrows its backend stores. type Chain struct { backends []refstore.ReadingStore } diff --git a/refstore/chain/close.go b/refstore/chain/close.go index 440afb10..6bd74565 100644 --- a/refstore/chain/close.go +++ b/refstore/chain/close.go @@ -1,21 +1,8 @@ package chain -import "errors" - -// Close closes all backends and joins close errors. -func (chain *Chain) Close() error { - var errs []error - - for _, backend := range chain.backends { - if backend == nil { - continue - } - - err := backend.Close() - if err != nil { - errs = append(errs, err) - } - } - - return errors.Join(errs...) -} +// Close releases wrapper-local resources. +// +// Chain borrows its backends, so Close does not close them. +// +// Repeated calls to Close are undefined behavior. +func (chain *Chain) Close() error { return nil } diff --git a/refstore/chain/list.go b/refstore/chain/list.go index e1594e95..c577ca85 100644 --- a/refstore/chain/list.go +++ b/refstore/chain/list.go @@ -15,10 +15,6 @@ func (chain *Chain) List(pattern string) ([]ref.Ref, error) { seen := map[string]struct{}{} for i, backend := range chain.backends { - if backend == nil { - continue - } - listed, err := backend.List(pattern) if err != nil { return nil, fmt.Errorf("refstore: backend %d list: %w", i, err) diff --git a/refstore/chain/new.go b/refstore/chain/new.go index ebf5e2bb..f8bdcb13 100644 --- a/refstore/chain/new.go +++ b/refstore/chain/new.go @@ -3,6 +3,9 @@ package chain import "codeberg.org/lindenii/furgit/refstore" // New creates an ordered reference store chain. +// +// The provided backends must be non-nil and distinct. +// Chain borrows the provided backends and does not close them in Close. func New(backends ...refstore.ReadingStore) *Chain { return &Chain{ backends: append([]refstore.ReadingStore(nil), backends...), diff --git a/refstore/chain/resolve.go b/refstore/chain/resolve.go index 99ada284..97dee24b 100644 --- a/refstore/chain/resolve.go +++ b/refstore/chain/resolve.go @@ -13,10 +13,6 @@ import ( //nolint:ireturn func (chain *Chain) Resolve(name string) (ref.Ref, error) { for i, backend := range chain.backends { - if backend == nil { - continue - } - resolved, err := backend.Resolve(name) if err == nil { return resolved, nil diff --git a/repository/close.go b/repository/close.go index 9654918c..b76570bb 100644 --- a/repository/close.go +++ b/repository/close.go @@ -21,15 +21,15 @@ func (repo *Repository) Close() error { } } - if repo.objectsLooseForWritingOnly != nil { - err := repo.objectsLooseForWritingOnly.Close() + if repo.objectsPacked != nil { + err := repo.objectsPacked.Close() if err != nil { errs = append(errs, err) } } - if repo.objectsWriteRoot != nil { - err := repo.objectsWriteRoot.Close() + if repo.objectsLoose != nil { + err := repo.objectsLoose.Close() if err != nil { errs = append(errs, err) } diff --git a/repository/objects.go b/repository/objects.go index 207ac7f1..b7ca2094 100644 --- a/repository/objects.go +++ b/repository/objects.go @@ -20,8 +20,8 @@ func openObjectStore( objects objectstore.Store, objectsRoot *os.Root, objectsPackRoot *os.Root, - objectsLooseForWritingOnly *objectloose.Store, - objectsWriteRoot *os.Root, + objectsLoose *objectloose.Store, + objectsPacked *objectpacked.Store, err error, ) { objectsRoot, err = root.OpenRoot("objects") @@ -29,35 +29,33 @@ func openObjectStore( return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects: %w", err) } - looseStore, err := objectloose.New(objectsRoot, algo) + objectsLoose, err = objectloose.New(objectsRoot, algo) if err != nil { _ = objectsRoot.Close() return nil, nil, nil, nil, nil, err } - backends := []objectstore.Store{looseStore} + backends := []objectstore.Store{objectsLoose} objectsPackRoot, err = objectsRoot.OpenRoot("pack") if err == nil { - var packedStore *objectpacked.Store - - packedStore, err = objectpacked.New( + objectsPacked, err = objectpacked.New( objectsPackRoot, algo, objectpacked.Options{RefreshPolicy: objectpacked.RefreshPolicyNever}, ) if err != nil { _ = objectsPackRoot.Close() - _ = looseStore.Close() + _ = objectsLoose.Close() _ = objectsRoot.Close() return nil, nil, nil, nil, nil, err } - backends = append(backends, packedStore) + backends = append(backends, objectsPacked) } else if !errors.Is(err, os.ErrNotExist) { - _ = looseStore.Close() + _ = objectsLoose.Close() _ = objectsRoot.Close() return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects/pack: %w", err) @@ -65,33 +63,7 @@ func openObjectStore( objects = objectmix.New(backends...) - objectsWriteRoot, err = root.OpenRoot("objects") - if err != nil { - _ = objects.Close() - if objectsPackRoot != nil { - _ = objectsPackRoot.Close() - } - - _ = objectsRoot.Close() - - return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects for loose writing: %w", err) - } - - objectsLooseForWritingOnly, err = objectloose.New(objectsWriteRoot, algo) - if err != nil { - _ = objects.Close() - - _ = objectsWriteRoot.Close() - if objectsPackRoot != nil { - _ = objectsPackRoot.Close() - } - - _ = objectsRoot.Close() - - return nil, nil, nil, nil, nil, err - } - - return objects, objectsRoot, objectsPackRoot, objectsLooseForWritingOnly, objectsWriteRoot, nil + return objects, objectsRoot, objectsPackRoot, objectsLoose, objectsPacked, nil } // Objects returns the configured object store. diff --git a/repository/open.go b/repository/open.go index f7f2dd1c..c7dca578 100644 --- a/repository/open.go +++ b/repository/open.go @@ -33,7 +33,7 @@ func Open(root *os.Root) (repo *Repository, err error) { repo.algo = algo - objects, objectsRoot, objectsPackRoot, objectsLooseForWritingOnly, objectsWriteRoot, err := openObjectStore(root, algo) + objects, objectsRoot, objectsPackRoot, objectsLoose, objectsPacked, err := openObjectStore(root, algo) if err != nil { return nil, err } @@ -41,8 +41,8 @@ func Open(root *os.Root) (repo *Repository, err error) { repo.objects = objects repo.objectsRoot = objectsRoot repo.objectsPackRoot = objectsPackRoot - repo.objectsLooseForWritingOnly = objectsLooseForWritingOnly - repo.objectsWriteRoot = objectsWriteRoot + repo.objectsLoose = objectsLoose + repo.objectsPacked = objectsPacked refRoot, err := root.OpenRoot(".") if err != nil { diff --git a/repository/repository.go b/repository/repository.go index f9bb2d2b..c56827cd 100644 --- a/repository/repository.go +++ b/repository/repository.go @@ -8,6 +8,7 @@ import ( "codeberg.org/lindenii/furgit/objectid" "codeberg.org/lindenii/furgit/objectstore" objectloose "codeberg.org/lindenii/furgit/objectstore/loose" + objectpacked "codeberg.org/lindenii/furgit/objectstore/packed" "codeberg.org/lindenii/furgit/refstore" ) @@ -19,11 +20,11 @@ type Repository struct { config *config.Config algo objectid.Algorithm - objects objectstore.Store - objectsRoot *os.Root - objectsPackRoot *os.Root - objectsLooseForWritingOnly *objectloose.Store - objectsWriteRoot *os.Root - refRoot *os.Root - refs refstore.ReadWriteStore + objects objectstore.Store + objectsRoot *os.Root + objectsPackRoot *os.Root + objectsLoose *objectloose.Store + objectsPacked *objectpacked.Store + refRoot *os.Root + refs refstore.ReadWriteStore } diff --git a/repository/write_loose.go b/repository/write_loose.go index 86f73e52..bd8d7f57 100644 --- a/repository/write_loose.go +++ b/repository/write_loose.go @@ -5,5 +5,5 @@ import ( ) func (repo *Repository) LooseStoreForWriting() *objectloose.Store { - return repo.objectsLooseForWritingOnly + return repo.objectsLoose } |
