aboutsummaryrefslogtreecommitdiff
path: root/objectstore/packed/store_lookup.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-08 15:33:36 +0800
committerGravatar Runxi Yu2026-03-08 15:44:32 +0800
commitdd027e1e5379019bfeffc48ff1274b5e05581ff3 (patch)
tree1f6b8f55957e706eeed801079ab42f3069085746 /objectstore/packed/store_lookup.go
parentformat/pack/ingest: Thin fix error handling (diff)
signatureNo 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.go73
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
}