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

kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-erlang.git


The following commit(s) were added to refs/heads/main by this push:
     new ff5969a  fix: arrow_buffer:size/1 use 64 byte padding not 8 (#114)
ff5969a is described below

commit ff5969a77f947f47e044b9d39834512576513063
Author: Benjamin Philip <[email protected]>
AuthorDate: Mon Aug 3 07:49:31 2026 +0530

    fix: arrow_buffer:size/1 use 64 byte padding not 8 (#114)
    
    ## What issue does this PR close?
    
    Closes #113.
    
    Previously, arrow_buffer:size/1 took 8 byte padding to calculate size
    when the buffers actually used 64 bytes. This resulted in various gross
    errors in offsets and other metadata, rendering any IPC binaries
    produced unusable.
    
    ## What's Changed
    
    `arrow_buffer:size/1` now correctly uses 64 byte padding. Record Batch
    test data
    has been updated with the correct offsets.
---
 native/arrow_format_nif/src/lib.rs    | 18 +++++++++---------
 native/arrow_format_nif/src/utils.rs  | 18 +++++++++---------
 src/arrow_buffer.erl                  |  6 +++---
 test/arrow_buffer_SUITE.erl           |  2 +-
 test/arrow_ipc_record_batch_SUITE.erl | 15 ++++++++++-----
 5 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/native/arrow_format_nif/src/lib.rs 
b/native/arrow_format_nif/src/lib.rs
index 1117440..02c3b0f 100644
--- a/native/arrow_format_nif/src/lib.rs
+++ b/native/arrow_format_nif/src/lib.rs
@@ -168,39 +168,39 @@ pub mod test {
                                 length: 1,
                             },
                             ipc::Buffer {
-                                offset: 8,
+                                offset: 64,
                                 length: 4,
                             },
                             ipc::Buffer {
-                                offset: 16,
+                                offset: 128,
                                 length: 1,
                             },
                             ipc::Buffer {
-                                offset: 24,
+                                offset: 192,
                                 length: 20,
                             },
                             ipc::Buffer {
-                                offset: 48,
+                                offset: 256,
                                 length: 15,
                             },
                             ipc::Buffer {
-                                offset: 64,
+                                offset: 320,
                                 length: 1,
                             },
                             ipc::Buffer {
-                                offset: 72,
+                                offset: 384,
                                 length: 4,
                             },
                             ipc::Buffer {
-                                offset: 80,
+                                offset: 448,
                                 length: 1,
                             },
                             ipc::Buffer {
-                                offset: 88,
+                                offset: 512,
                                 length: 2,
                             },
                             ipc::Buffer {
-                                offset: 96,
+                                offset: 576,
                                 length: 10,
                             },
                         ]),
diff --git a/native/arrow_format_nif/src/utils.rs 
b/native/arrow_format_nif/src/utils.rs
index b1920f6..233be19 100644
--- a/native/arrow_format_nif/src/utils.rs
+++ b/native/arrow_format_nif/src/utils.rs
@@ -120,39 +120,39 @@ pub fn record_batch() -> Message {
                     length: 1,
                 },
                 Buffer {
-                    offset: 8,
+                    offset: 64,
                     length: 4,
                 },
                 Buffer {
-                    offset: 16,
+                    offset: 128,
                     length: 1,
                 },
                 Buffer {
-                    offset: 24,
+                    offset: 192,
                     length: 20,
                 },
                 Buffer {
-                    offset: 48,
+                    offset: 256,
                     length: 15,
                 },
                 Buffer {
-                    offset: 64,
+                    offset: 320,
                     length: 1,
                 },
                 Buffer {
-                    offset: 72,
+                    offset: 384,
                     length: 4,
                 },
                 Buffer {
-                    offset: 80,
+                    offset: 448,
                     length: 1,
                 },
                 Buffer {
-                    offset: 88,
+                    offset: 512,
                     length: 2,
                 },
                 Buffer {
-                    offset: 96,
+                    offset: 576,
                     length: 10,
                 },
             ],
diff --git a/src/arrow_buffer.erl b/src/arrow_buffer.erl
index ecec6d5..d64af67 100644
--- a/src/arrow_buffer.erl
+++ b/src/arrow_buffer.erl
@@ -117,10 +117,10 @@ to_erlang(_Buffer) ->
     erlang:error(badarg).
 
 -doc "Returns the size of the buffer inclusive of padding in bytes.".
--spec size(Buffer :: arrow_buffer:buffer()) -> pos_integer().
+-spec size(Buffer :: arrow_buffer:buffer()) -> non_neg_integer().
 size(Buffer) ->
-    Len = Buffer#buffer.length * 8,
-    round((Len + arrow_utils:pad_len(Len)) / 8).
+    Len = Buffer#buffer.length,
+    Len + arrow_utils:pad_len(Len).
 
 -spec slot(
     Value :: arrow_type:native_type(),
diff --git a/test/arrow_buffer_SUITE.erl b/test/arrow_buffer_SUITE.erl
index d91a07f..ca5cdac 100644
--- a/test/arrow_buffer_SUITE.erl
+++ b/test/arrow_buffer_SUITE.erl
@@ -157,7 +157,7 @@ to_erlang(_Config) ->
 
 size(_Config) ->
     Buffer = arrow_buffer:from_erlang([1, 2, 3], {s, 8}),
-    ?assertEqual(arrow_buffer:size(Buffer), 8).
+    ?assertEqual(arrow_buffer:size(Buffer), 
byte_size(arrow_buffer:to_arrow(Buffer))).
 
 %%%%%%%%%%%
 %% Utils %%
diff --git a/test/arrow_ipc_record_batch_SUITE.erl 
b/test/arrow_ipc_record_batch_SUITE.erl
index 157d5b1..2195e4f 100644
--- a/test/arrow_ipc_record_batch_SUITE.erl
+++ b/test/arrow_ipc_record_batch_SUITE.erl
@@ -43,14 +43,19 @@ valid_nodes_on_from_erlang(_Config) ->
     ?assertEqual((?RecordBatch)#record_batch.nodes, FieldNodes).
 
 valid_buffers_on_from_erlang(_Config) ->
-    ID = [#{offset => 0, length => 1}, #{offset => 8, length => 4}],
+    ID = [#{offset => 0, length => 1}, #{offset => 64, length => 4}],
     Name = [
-        #{offset => 16, length => 1}, #{offset => 24, length => 20}, #{offset 
=> 48, length => 15}
+        #{offset => 128, length => 1},
+        #{offset => 192, length => 20},
+        #{offset => 256, length => 15}
     ],
-    Age = [#{offset => 64, length => 1}, #{offset => 72, length => 4}],
+    Age = [#{offset => 320, length => 1}, #{offset => 384, length => 4}],
     Marks =
-        [#{offset => 80, length => 1}] ++
-            [#{offset => 88, length => 2}, #{offset => 96, length => 10}],
+        [
+            #{offset => 448, length => 1},
+            #{offset => 512, length => 2},
+            #{offset => 576, length => 10}
+        ],
     Buffers = ID ++ Name ++ Age ++ Marks,
 
     ?assertEqual((?RecordBatch)#record_batch.buffers, Buffers).

Reply via email to