diff options
| author | 2026-03-08 15:33:36 +0800 | |
|---|---|---|
| committer | 2026-03-08 15:44:32 +0800 | |
| commit | dd027e1e5379019bfeffc48ff1274b5e05581ff3 (patch) | |
| tree | 1f6b8f55957e706eeed801079ab42f3069085746 /objectstore/packed/store_lookup.go | |
| parent | format/pack/ingest: Thin fix error handling (diff) | |
| signature | No signature | |
objectstore: Refresh v0.1.80
* Add manual Refresh for various objectstore's
* RefreshPolicy option
* Refreshable MRU and atomic snapshotting
Diffstat (limited to 'objectstore/packed/store_lookup.go')
| -rw-r--r-- | objectstore/packed/store_lookup.go | 73 |
1 files changed, 64 insertions, 9 deletions
diff --git a/objectstore/packed/store_lookup.go b/objectstore/packed/store_lookup.go index cf5a580d..a1bd9b85 100644 --- a/objectstore/packed/store_lookup.go +++ b/objectstore/packed/store_lookup.go @@ -14,38 +14,93 @@ func (store *Store) lookup(id objectid.ObjectID) (location, error) { return zero, errors.New("objectstore/packed: object id algorithm mismatch") } - err := store.ensureCandidates() + snapshot, err := store.ensureCandidates() if err != nil { return zero, err } - nextPackName := store.firstCandidatePackName() + loc, ok, err := store.lookupInCandidates(id, snapshot) + if err != nil { + return zero, err + } + + if ok { + return loc, nil + } + + if store.refreshPolicy == RefreshPolicyOnMissing { + err = store.Refresh() + if err != nil { + return zero, err + } + + refreshed := store.candidates.Load() + if refreshed != nil && refreshed != snapshot { + loc, ok, err = store.lookupInCandidates(id, refreshed) + if err != nil { + return zero, err + } + + if ok { + return loc, nil + } + } + } + + return zero, objectstore.ErrObjectNotFound +} + +func (store *Store) lookupInCandidates( + id objectid.ObjectID, + snapshot *candidateSnapshot, +) (location, bool, error) { + var zero location + + nextPackName := store.firstCandidatePackName(snapshot) for nextPackName != "" { - candidate, ok := store.candidateForPack(nextPackName) + candidate, ok := snapshot.candidateByPack[nextPackName] if !ok { - nextPackName = store.firstCandidatePackName() + nextPackName = store.firstCandidatePackName(snapshot) continue } - nextPackName = store.nextCandidatePackName(candidate.packName) + nextPackName = store.nextCandidatePackName(candidate.packName, snapshot) index, err := store.openIndex(candidate) if err != nil { - return zero, err + return zero, false, err } offset, ok, err := index.lookup(id) if err != nil { - return zero, err + return zero, false, err } if ok { store.touchCandidate(candidate.packName) - return location{packName: index.packName, offset: offset}, nil + return location{packName: index.packName, offset: offset}, true, nil } } - return zero, objectstore.ErrObjectNotFound + for _, candidate := range snapshot.candidates { + index, err := store.openIndex(candidate) + if err != nil { + return zero, false, err + } + + offset, ok, err := index.lookup(id) + if err != nil { + return zero, false, err + } + + if ok { + store.touchCandidate(candidate.packName) + + return location{packName: index.packName, offset: offset}, true, nil + } + } + + return zero, false, nil } |
