aboutsummaryrefslogtreecommitdiff
path: root/objectstore/packed/delta_apply.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-21 20:40:05 +0800
committerGravatar Runxi Yu2026-02-21 20:40:05 +0800
commitfd55beb6188350974afd93dfffcef973ebdad6e8 (patch)
treef27ef873c60b7c868bf1173979b65effdf251c76 /objectstore/packed/delta_apply.go
parentobjectstore/packed: Improve delta base caching (diff)
signatureNo signature
objectstore/packed: Don't use full delta reconstruction just to read headers
Diffstat (limited to 'objectstore/packed/delta_apply.go')
-rw-r--r--objectstore/packed/delta_apply.go19
1 files changed, 15 insertions, 4 deletions
diff --git a/objectstore/packed/delta_apply.go b/objectstore/packed/delta_apply.go
index 6d5c736d..5245e0ba 100644
--- a/objectstore/packed/delta_apply.go
+++ b/objectstore/packed/delta_apply.go
@@ -14,11 +14,22 @@ func (store *Store) deltaResolveContent(start location) (objecttype.Type, []byte
if err != nil {
return objecttype.TypeInvalid, nil, err
}
- return store.deltaResolveChain(chain)
+ pack, meta, err := store.entryMetaAt(start)
+ if err != nil {
+ return objecttype.TypeInvalid, nil, err
+ }
+ declaredSize := meta.size
+ if !packfmt.IsBaseObjectType(meta.ty) {
+ declaredSize, err = deltaDeclaredSizeAt(pack, meta.dataOffset)
+ if err != nil {
+ return objecttype.TypeInvalid, nil, err
+ }
+ }
+ return store.deltaResolveChain(chain, declaredSize)
}
// deltaResolveChain resolves one object chain into content bytes.
-func (store *Store) deltaResolveChain(chain deltaChain) (objecttype.Type, []byte, error) {
+func (store *Store) deltaResolveChain(chain deltaChain, declaredSize int64) (objecttype.Type, []byte, error) {
ty, out, nextDelta, err := store.deltaResolveChainStart(chain)
if err != nil {
return objecttype.TypeInvalid, nil, err
@@ -47,11 +58,11 @@ func (store *Store) deltaResolveChain(chain deltaChain) (objecttype.Type, []byte
store.cacheMu.Unlock()
}
- if int64(len(out)) != chain.declaredSize {
+ if int64(len(out)) != declaredSize {
return objecttype.TypeInvalid, nil, fmt.Errorf(
"objectstore/packed: resolved content size mismatch: got %d want %d",
len(out),
- chain.declaredSize,
+ declaredSize,
)
}
if ty != chain.baseType {