diff options
| author | 2026-02-21 20:40:05 +0800 | |
|---|---|---|
| committer | 2026-02-21 20:40:05 +0800 | |
| commit | fd55beb6188350974afd93dfffcef973ebdad6e8 (patch) | |
| tree | f27ef873c60b7c868bf1173979b65effdf251c76 /objectstore/packed/delta_apply.go | |
| parent | objectstore/packed: Improve delta base caching (diff) | |
| signature | No 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.go | 19 |
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 { |
