aboutsummaryrefslogtreecommitdiff
path: root/object
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-06-14 02:26:56 +0000
committerGravatar Runxi Yu2026-06-14 02:26:56 +0000
commita6b62ce10a102345aba2de3fbc6ce4cd5d6b91d1 (patch)
tree267a66d1fb105156b74a0c281400b095026a3a53 /object
parentobject/store/packed: Use zlib.NewReaderBytes where appropriate to reduce allocs (diff)
object/store/packed: Add a delta header pool
Diffstat (limited to 'object')
-rw-r--r--object/store/packed/delta.go11
1 files changed, 10 insertions, 1 deletions
diff --git a/object/store/packed/delta.go b/object/store/packed/delta.go
index c8fe8f75..5b538221 100644
--- a/object/store/packed/delta.go
+++ b/object/store/packed/delta.go
@@ -10,8 +10,14 @@ import (
"lindenii.org/go/furgit/internal/format/packfile"
"lindenii.org/go/furgit/internal/format/packfile/delta"
"lindenii.org/go/lgo/intconv"
+ "lindenii.org/go/lgo/sync"
)
+//nolint:gochecknoglobals
+var deltaHeaderPool = sync.NewPool(func() *[delta.MaxHeaderSizesLen]byte {
+ return new([delta.MaxHeaderSizesLen]byte)
+})
+
// deltaNode is a delta entry on a resolution chain.
type deltaNode struct {
// payload is the entry's compressed delta payload view.
@@ -214,9 +220,12 @@ func deltaResultSize(payload []byte, deltaSize uint64) (int, error) {
defer func() { _ = zr.Close() }()
+ buf := deltaHeaderPool.Get()
+ defer deltaHeaderPool.Put(buf)
+
prefixLen := min(uint64(delta.MaxHeaderSizesLen), deltaSize)
- prefix := make([]byte, prefixLen)
+ prefix := buf[:prefixLen]
_, err = io.ReadFull(zr, prefix)
if err != nil {