This is an automated email from the ASF dual-hosted git repository.

zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-go.git


The following commit(s) were added to refs/heads/main by this push:
     new 172b4f0e5 perf(puffin): skip sorting blobs already in offset order 
(#2250)
172b4f0e5 is described below

commit 172b4f0e5790a7d66cd0a16bb4751fbf83449469
Author: Minh Vu <[email protected]>
AuthorDate: Wed Oct 21 22:49:40 2026 +0200

    perf(puffin): skip sorting blobs already in offset order (#2250)
    
    * perf(puffin): skip sorting blobs already in offset order
    
    Signed-off-by: Minh Vu <[email protected]>
    
    * style(puffin): satisfy nlreturn before breaking sort scan
    
    ---------
    
    Signed-off-by: Minh Vu <[email protected]>
---
 puffin/puffin_reader.go | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/puffin/puffin_reader.go b/puffin/puffin_reader.go
index 186876105..951961456 100644
--- a/puffin/puffin_reader.go
+++ b/puffin/puffin_reader.go
@@ -620,19 +620,30 @@ func (r *Reader) ReadAllBlobs() ([]*BlobData, error) {
                return nil, nil
        }
 
-       // Keep only indexes in the temporary read-order slice.
-       // Results retain defensive metadata copies in footer order.
-       order := make([]int, len(footer.Blobs))
-       for i := range order {
-               order[i] = i
+       // Footer metadata is usually already in offset order. Only allocate
+       // and sort indexes if it is not, keeping reads in physical order.
+       var order []int
+       for i := 1; i < len(footer.Blobs); i++ {
+               if footer.Blobs[i-1].Offset > footer.Blobs[i].Offset {
+                       order = make([]int, len(footer.Blobs))
+                       for j := range order {
+                               order[j] = j
+                       }
+                       slices.SortFunc(order, func(a, b int) int {
+                               return cmp.Compare(footer.Blobs[a].Offset, 
footer.Blobs[b].Offset)
+                       })
+
+                       break
+               }
        }
-       slices.SortFunc(order, func(a, b int) int {
-               return cmp.Compare(footer.Blobs[a].Offset, 
footer.Blobs[b].Offset)
-       })
 
-       // Read blobs in offset order, store in original order
+       // Read blobs in offset order, store in original order.
        results := make([]*BlobData, len(footer.Blobs))
-       for _, index := range order {
+       for i := range footer.Blobs {
+               index := i
+               if order != nil {
+                       index = order[i]
+               }
                meta := footer.Blobs[index]
                data, err := r.readBlobData(meta)
                if err != nil {

Reply via email to