Skip to content

[10125] arrow-flight decode path optimizations#10206

Open
Rich-T-kid wants to merge 10 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/arrow-flight-decode-opt-impl
Open

[10125] arrow-flight decode path optimizations#10206
Rich-T-kid wants to merge 10 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/arrow-flight-decode-opt-impl

Conversation

@Rich-T-kid

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

see #10137 & #10125

What changes are included in this PR?

  • Adds a with_skip_validation(bool) option to FlightDataDecoder (and threads it through flight_data_to_arrow_batch and read_record_batch) that bypasses UTF-8 and offset validation when decoding Arrow IPC record batches.
  • avoid calling from_slice_ref() which would allocate another buffer and then copy bytes into it. instead replaced with .clone() which just is O(1)

Are these changes tested?

N/A

Are there any user-facing changes?

Users now have the option to skip data validation

@github-actions github-actions Bot added arrow Changes to the arrow crate arrow-flight Changes to the arrow-flight crate labels Jun 23, 2026
@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from e152490 to 080628d Compare June 23, 2026 20:10
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

benchmarks locally look very promising

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@Jefffrey (sorry for the ping) could you run the arrow-flight benchmarks command on this when you get a chance?

@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from 9f81b71 to 65c9b89 Compare June 24, 2026 01:41
@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from 65c9b89 to 316b8bd Compare June 24, 2026 01:42
@Jefffrey

Copy link
Copy Markdown
Contributor

run benchmark flight

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4785185359-646-59hdz 6.12.68+ #1 SMP Sat May 2 07:49:07 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/arrow-flight-decode-opt-impl (316b8bd) to d2f1611 (merge-base) diff
BENCH_NAME=flight
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench flight
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

group                                     main                                    rich-T-kid_arrow-flight-decode-opt-impl
-----                                     ----                                    ---------------------------------------
decode/fixed/65536x1                      5.74      9.5±0.04µs    51.4 GB/sec     1.00   1655.7±7.62ns   295.0 GB/sec
decode/fixed/65536x4                      11.46    44.2±0.95µs    44.2 GB/sec     1.00      3.9±0.03µs   506.3 GB/sec
decode/fixed/65536x8                      12.25   118.1±1.33µs    33.1 GB/sec     1.00      9.6±0.04µs   405.3 GB/sec
decode/fixed/8192x1                       1.66      2.7±0.01µs    22.3 GB/sec     1.00   1653.8±8.81ns    37.0 GB/sec
decode/fixed/8192x4                       2.01      7.8±0.03µs    31.5 GB/sec     1.00      3.9±0.02µs    63.3 GB/sec
decode/fixed/8192x8                       2.18     15.2±0.06µs    32.1 GB/sec     1.00      7.0±0.04µs    70.1 GB/sec
decode/nested/65536x1                     1.21   159.2±41.31µs     7.7 GB/sec     1.00   131.3±41.57µs     9.3 GB/sec
decode/nested/65536x4                     1.32  702.7±165.67µs     6.9 GB/sec     1.00  534.0±165.43µs     9.1 GB/sec
decode/nested/65536x8                     1.37  1494.7±336.50µs     6.5 GB/sec    1.00  1089.5±329.23µs     9.0 GB/sec
decode/nested/8192x1                      1.14     21.4±5.16µs     7.1 GB/sec     1.00     18.8±5.23µs     8.1 GB/sec
decode/nested/8192x4                      1.18    84.6±20.76µs     7.2 GB/sec     1.00    71.9±20.65µs     8.5 GB/sec
decode/nested/8192x8                      1.20   171.2±41.14µs     7.1 GB/sec     1.00   143.1±41.28µs     8.5 GB/sec
decode/variable/65536x1                   1.22   274.9±44.54µs     8.0 GB/sec     1.00   226.0±44.41µs     9.7 GB/sec
decode/variable/65536x4                   1.34  1245.5±184.78µs     7.1 GB/sec    1.00  927.3±185.87µs     9.5 GB/sec
decode/variable/65536x8                   1.28      2.6±0.38ms     6.9 GB/sec     1.00      2.0±0.37ms     8.8 GB/sec
decode/variable/8192x1                    1.14     32.9±5.48µs     8.4 GB/sec     1.00     28.9±5.64µs     9.5 GB/sec
decode/variable/8192x4                    1.18   136.3±22.69µs     8.1 GB/sec     1.00   115.7±21.45µs     9.5 GB/sec
decode/variable/8192x8                    1.20   281.5±44.86µs     7.8 GB/sec     1.00   235.0±43.27µs     9.4 GB/sec
do_put_dictionary/dict/hydrate/65536x1    1.01    381.5±5.74µs   659.0 MB/sec     1.00    379.0±6.47µs   663.3 MB/sec
do_put_dictionary/dict/hydrate/65536x4    1.06  1563.8±108.86µs   643.1 MB/sec    1.00  1473.5±100.85µs   682.5 MB/sec
do_put_dictionary/dict/hydrate/65536x8    1.24      4.6±0.40ms   439.1 MB/sec     1.00      3.7±0.34ms   546.6 MB/sec
do_put_dictionary/dict/hydrate/8192x1     1.00     92.3±1.02µs   353.9 MB/sec     1.00     92.4±1.75µs   353.5 MB/sec
do_put_dictionary/dict/hydrate/8192x4     1.00    211.1±3.21µs   618.8 MB/sec     1.00    210.9±3.70µs   619.5 MB/sec
do_put_dictionary/dict/hydrate/8192x8     1.01    384.8±5.91µs   679.1 MB/sec     1.00    381.9±6.43µs   684.3 MB/sec
do_put_dictionary/dict/resend/65536x1     1.02    108.9±1.22µs     2.3 GB/sec     1.00    106.4±1.53µs     2.3 GB/sec
do_put_dictionary/dict/resend/65536x4     1.00    291.1±3.37µs     3.4 GB/sec     1.01    293.4±3.44µs     3.3 GB/sec
do_put_dictionary/dict/resend/65536x8     1.02    522.9±5.65µs     3.8 GB/sec     1.00    513.9±7.30µs     3.8 GB/sec
do_put_dictionary/dict/resend/8192x1      1.01     62.0±0.73µs   526.9 MB/sec     1.00     61.2±0.73µs   533.5 MB/sec
do_put_dictionary/dict/resend/8192x4      1.02     84.5±1.27µs  1546.1 MB/sec     1.00     82.9±1.48µs  1575.8 MB/sec
do_put_dictionary/dict/resend/8192x8      1.00    113.8±1.69µs     2.2 GB/sec     1.01    115.0±1.59µs     2.2 GB/sec
encode/fixed/65536x1                      1.02     10.2±0.03µs    47.8 GB/sec     1.00     10.0±0.02µs    48.9 GB/sec
encode/fixed/65536x4                      1.27     62.8±0.34µs    31.1 GB/sec     1.00     49.3±0.18µs    39.6 GB/sec
encode/fixed/65536x8                      1.00   1037.0±2.29µs     3.8 GB/sec     1.01   1045.8±2.94µs     3.7 GB/sec
encode/fixed/8192x1                       1.03      3.2±0.01µs    19.1 GB/sec     1.00      3.1±0.01µs    19.6 GB/sec
encode/fixed/8192x4                       1.01      8.6±0.02µs    28.3 GB/sec     1.00      8.6±0.01µs    28.6 GB/sec
encode/fixed/8192x8                       1.03     17.4±0.03µs    28.1 GB/sec     1.00     16.9±0.03µs    28.9 GB/sec
encode/nested/65536x1                     1.00     28.4±0.22µs    43.0 GB/sec     1.02     28.8±0.15µs    42.4 GB/sec
encode/nested/65536x4                     1.00   1380.0±3.51µs     3.5 GB/sec     1.01   1400.3±3.24µs     3.5 GB/sec
encode/nested/65536x8                     1.00      3.0±0.03ms     3.3 GB/sec     1.01      3.0±0.03ms     3.3 GB/sec
encode/nested/8192x1                      1.01      5.7±0.02µs    26.8 GB/sec     1.00      5.7±0.00µs    26.9 GB/sec
encode/nested/8192x4                      1.06     21.9±0.06µs    27.9 GB/sec     1.00     20.8±0.05µs    29.5 GB/sec
encode/nested/8192x8                      1.00     47.4±0.20µs    25.8 GB/sec     1.04     49.2±0.12µs    24.9 GB/sec
encode/variable/65536x1                   1.00     61.6±0.46µs    35.7 GB/sec     1.00     61.9±0.28µs    35.5 GB/sec
encode/variable/65536x4                   1.02      2.5±0.03ms     3.6 GB/sec     1.00      2.4±0.03ms     3.6 GB/sec
encode/variable/65536x8                   1.03      5.5±0.13ms     3.2 GB/sec     1.00      5.3±0.09ms     3.3 GB/sec
encode/variable/8192x1                    1.04      7.2±0.01µs    38.3 GB/sec     1.00      6.9±0.01µs    39.9 GB/sec
encode/variable/8192x4                    1.00     26.8±0.08µs    41.0 GB/sec     1.22     32.6±0.12µs    33.7 GB/sec
encode/variable/8192x8                    1.07     84.3±0.31µs    26.1 GB/sec     1.00     79.1±0.25µs    27.8 GB/sec
roundtrip/fixed/65536x1                   1.01    319.8±3.79µs  1563.9 MB/sec     1.00    318.1±3.45µs  1572.0 MB/sec
roundtrip/fixed/65536x4                   1.00  1219.1±14.25µs  1640.8 MB/sec     1.00  1214.8±18.24µs  1646.7 MB/sec
roundtrip/fixed/65536x8                   1.00      2.2±0.02ms  1790.1 MB/sec     1.01      2.2±0.03ms  1780.7 MB/sec
roundtrip/fixed/8192x1                    1.01     95.9±1.13µs   652.5 MB/sec     1.00     94.9±1.19µs   659.5 MB/sec
roundtrip/fixed/8192x4                    1.03    203.2±4.49µs  1232.2 MB/sec     1.00    198.1±3.23µs  1264.0 MB/sec
roundtrip/fixed/8192x8                    1.00    344.8±5.31µs  1452.4 MB/sec     1.00    346.2±4.50µs  1446.4 MB/sec
roundtrip/nested/65536x1                  1.00   884.8±39.33µs  1412.9 MB/sec     1.01   895.6±41.27µs  1396.0 MB/sec
roundtrip/nested/65536x4                  1.00      4.3±0.10ms  1172.3 MB/sec     1.00      4.3±0.15ms  1170.5 MB/sec
roundtrip/nested/65536x8                  1.00      9.0±0.39ms  1115.7 MB/sec     1.12     10.0±0.53ms   995.6 MB/sec
roundtrip/nested/8192x1                   1.02    167.2±5.53µs   935.8 MB/sec     1.00    163.7±5.44µs   955.7 MB/sec
roundtrip/nested/8192x4                   1.01   480.4±20.49µs  1302.6 MB/sec     1.00   476.1±20.98µs  1314.5 MB/sec
roundtrip/nested/8192x8                   1.00   940.0±45.52µs  1331.5 MB/sec     1.00   939.3±43.19µs  1332.5 MB/sec
roundtrip/variable/65536x1                1.03  1339.3±63.71µs  1680.1 MB/sec     1.00  1306.5±75.08µs  1722.3 MB/sec
roundtrip/variable/65536x4                1.04      8.2±0.32ms  1104.0 MB/sec     1.00      7.9±0.33ms  1143.8 MB/sec
roundtrip/variable/65536x8                1.00     15.0±0.52ms  1204.1 MB/sec     1.10     16.4±0.51ms  1099.1 MB/sec
roundtrip/variable/8192x1                 1.04    214.9±5.85µs  1309.7 MB/sec     1.00    206.4±5.79µs  1363.3 MB/sec
roundtrip/variable/8192x4                 1.03   691.2±22.36µs  1628.6 MB/sec     1.00   672.1±23.27µs  1674.9 MB/sec
roundtrip/variable/8192x8                 1.02  1263.0±25.08µs  1782.6 MB/sec     1.00  1241.2±23.92µs  1813.9 MB/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 685.2s
Peak memory 129.0 MiB
Avg memory 68.2 MiB
CPU user 705.5s
CPU sys 122.4s
Peak spill 0 B

branch

Metric Value
Wall time 660.1s
Peak memory 100.5 MiB
Avg memory 37.4 MiB
CPU user 684.9s
CPU sys 120.3s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid

Rich-T-kid commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

Nice, decode path shows a large performance boost. The more data is being passed around, the larger the performance gains.
I think the largest performance boost is finding a way to align the buffers that are being decoded without needing to copy every single buffer.

This is difficult because of the lack of control we have over the byte offset that is handed to us by tonic. looking at

pub fn align_buffers(&mut self) {
        let layout = layout(&self.data_type);
        for (buffer, spec) in self.buffers.iter_mut().zip(&layout.buffers) {
            if let BufferSpec::FixedWidth { alignment, .. } = spec {
                if buffer.as_ptr().align_offset(*alignment) != 0 {
                    *buffer = Buffer::from_slice_ref(buffer.as_ref());
                }
            }
        }
        // align children data recursively
        for data in self.child_data.iter_mut() {
            data.align_buffers()
        }
    }

it seems that the math for checking if the buffer is aligned just comes down to ptr_address % alignment (64) if this isnt 0 it copys the buffer into a new buffer that is aligned correctly. MutableBuffer "Buffers created from MutableBuffer (via into) are guaranteed to be aligned along cache lines and in multiples of 64 bytes."

From my understanding arrow-ipc adds padding within the IPC body to account for alignment.
Image 6-23-26 at 10 43 PM

The issue occurs when the initial buffer returned by Tonic starts at a misaligned byte offset. For example, if the buffer starts at byte offset 253, it isn't aligned to a 32 or 64-byte boundary. Because Arrow IPC's internal padding is relative to the start of the buffer, a misaligned starting offset means all the sub-buffers inside it are also misaligned, the padding does nothing to fix this. The result is that every sub-buffer has to be copied into a fresh, correctly aligned allocation anyway.
Since alignment is determined by where the overall buffer starts, the fix should happen upfront: check whether the buffer Tonic returns is aligned before beginning to decode it, and if not, reallocate it once at that point rather than discovering the problem per sub-buffer during decoding.

This would avoid N buffer copies in exchange for 1 large buffer copy at the start.

for future readers who are wondering why alignment is important:
Performance reasons & arrow-perf
rust spec & rust UB

Comment thread arrow-flight/src/decode.rs Outdated
.map_err(|e| {
FlightError::DecodeError(format!("Error decoding ipc RecordBatch: {e}"))
})?;
let data_buffer = if data.data_body.as_ptr() as usize % 64 != 0 {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see context here

@Rich-T-kid

Rich-T-kid commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

[ Alignment implementation ] local benchmarks show 2-25% (most from 2-10%) improvement which is slightly less than I was expecting. This is largely random though, if tonic returns an aligned buffer the re-alignment path is never hit and ideally all the buffers are correctly aligned already.

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@gabotechs this PR is ready for review 🚀.
There are a couple of optimizations I see for the dictionary path but for the general decode path these are the largest wins I see.

@gabotechs gabotechs left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool! just have on comment, but otherwise LGTM

Comment thread arrow-flight/src/utils.rs Outdated
Comment on lines +73 to +74
&Buffer::from(data.data_body.as_ref()),
&Buffer::from(data.data_body.clone()),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! I this is a sneaky one, but indeed this is avoiding a full clone

Comment thread arrow-flight/src/decode.rs Outdated
Comment on lines +261 to +266
/// Only set for trusted senders, invalid data may cause undefined behavior.
/// Can improve performance by skipping validation
pub fn with_skip_validation(mut self, skip_validation: bool) -> Self {
self.skip_validation = skip_validation;
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than exposing this as a plan bool flag, I think we should be requiring an UnsafeFlag here.

By requiring an UnsafeFlag, we force consumers to explicitly have an unsafe block in their codebase, making sure they are aware that what they are doing is not safe, and that they are responsible for ensuring memory safety there.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me! pushed up a revision

@Rich-T-kid

Rich-T-kid commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

@alamb could you take a look when you get a chance 🚀 We may also want to run the benchmarks again to see how much the buffer re-alignment impacted performance.

@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from b13b3da to 6379781 Compare June 24, 2026 14:08
@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from 6379781 to a2c436b Compare June 24, 2026 14:15
@gabotechs

Copy link
Copy Markdown
Contributor

run benchmarks flight

@gabotechs

Copy link
Copy Markdown
Contributor

run benchmarks ipc_reader

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4790467877-661-l75ph 6.12.68+ #1 SMP Sat May 2 07:49:07 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/arrow-flight-decode-opt-impl (a2c436b) to d2f1611 (merge-base) diff
BENCH_NAME=flight
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench flight
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4790472720-662-gdxjl 6.12.68+ #1 SMP Sat May 2 07:49:07 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing rich-T-kid/arrow-flight-decode-opt-impl (a2c436b) to d2f1611 (merge-base) diff
BENCH_NAME=ipc_reader
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench ipc_reader
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

group                                                       main                                   rich-T-kid_arrow-flight-decode-opt-impl
-----                                                       ----                                   ---------------------------------------
arrow_ipc_reader/FileReader/no_validation/read_10           1.04    131.5±1.86µs        ? ?/sec    1.00    126.2±2.17µs        ? ?/sec
arrow_ipc_reader/FileReader/no_validation/read_10/mmap      1.00     57.3±0.31µs        ? ?/sec    1.00     57.1±0.43µs        ? ?/sec
arrow_ipc_reader/FileReader/read_10                         1.01   420.0±56.78µs        ? ?/sec    1.00   415.6±58.86µs        ? ?/sec
arrow_ipc_reader/FileReader/read_10/mmap                    1.00   467.7±56.96µs        ? ?/sec    1.01   472.1±56.89µs        ? ?/sec
arrow_ipc_reader/StreamReader/no_validation/read_10         1.00    125.1±1.96µs        ? ?/sec    1.00    124.8±2.71µs        ? ?/sec
arrow_ipc_reader/StreamReader/no_validation/read_10/zstd    1.00      2.5±0.02ms        ? ?/sec    1.00      2.4±0.02ms        ? ?/sec
arrow_ipc_reader/StreamReader/read_10                       1.02   419.8±53.69µs        ? ?/sec    1.00   411.4±57.96µs        ? ?/sec
arrow_ipc_reader/StreamReader/read_10/zstd                  1.01      2.7±0.08ms        ? ?/sec    1.00      2.7±0.08ms        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 90.0s
Peak memory 16.6 MiB
Avg memory 11.5 MiB
CPU user 73.8s
CPU sys 9.8s
Peak spill 0 B

branch

Metric Value
Wall time 75.0s
Peak memory 15.1 MiB
Avg memory 11.6 MiB
CPU user 63.6s
CPU sys 9.4s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

group                                     main                                    rich-T-kid_arrow-flight-decode-opt-impl
-----                                     ----                                    ---------------------------------------
decode/fixed/65536x1                      5.62      9.4±0.02µs    52.2 GB/sec     1.00   1663.5±8.99ns   293.6 GB/sec
decode/fixed/65536x4                      1.00     43.9±0.58µs    44.5 GB/sec     1.01     44.2±0.64µs    44.2 GB/sec
decode/fixed/65536x8                      2.32    118.1±0.91µs    33.1 GB/sec     1.00     51.0±2.42µs    76.7 GB/sec
decode/fixed/8192x1                       1.05      2.7±0.01µs    22.3 GB/sec     1.00      2.6±0.03µs    23.5 GB/sec
decode/fixed/8192x4                       1.02      7.7±0.02µs    31.8 GB/sec     1.00      7.5±0.03µs    32.5 GB/sec
decode/fixed/8192x8                       2.18     15.1±0.05µs    32.3 GB/sec     1.00      6.9±0.04µs    70.5 GB/sec
decode/nested/65536x1                     1.00   160.0±40.92µs     7.6 GB/sec     1.00   159.8±41.68µs     7.6 GB/sec
decode/nested/65536x4                     1.09  697.8±163.75µs     7.0 GB/sec     1.00  643.0±165.30µs     7.6 GB/sec
decode/nested/65536x8                     1.00  1448.3±328.06µs     6.7 GB/sec    1.07  1554.6±679.26µs     6.3 GB/sec
decode/nested/8192x1                      1.01     21.4±5.14µs     7.1 GB/sec     1.00     21.3±5.17µs     7.2 GB/sec
decode/nested/8192x4                      1.15    83.6±20.63µs     7.3 GB/sec     1.00    72.9±20.67µs     8.4 GB/sec
decode/nested/8192x8                      1.00   172.7±41.55µs     7.1 GB/sec     1.00   172.9±41.75µs     7.1 GB/sec
decode/variable/65536x1                   1.19   269.2±43.86µs     8.2 GB/sec     1.00   226.7±44.34µs     9.7 GB/sec
decode/variable/65536x4                   1.10  1202.6±180.94µs     7.3 GB/sec    1.00  1089.0±184.65µs     8.1 GB/sec
decode/variable/65536x8                   1.26      2.8±0.95ms     6.4 GB/sec     1.00      2.2±0.38ms     8.0 GB/sec
decode/variable/8192x1                    1.00     33.1±5.36µs     8.3 GB/sec     1.00     33.0±5.44µs     8.3 GB/sec
decode/variable/8192x4                    1.08   149.1±16.19µs     7.4 GB/sec     1.00   138.7±21.84µs     7.9 GB/sec
decode/variable/8192x8                    1.00   278.1±45.94µs     7.9 GB/sec     1.01   281.3±43.96µs     7.8 GB/sec
do_put_dictionary/dict/hydrate/65536x1    1.00    374.6±7.49µs   671.2 MB/sec     1.00    375.2±7.36µs   670.1 MB/sec
do_put_dictionary/dict/hydrate/65536x4    1.00  1342.1±48.86µs   749.3 MB/sec     1.04  1389.3±64.06µs   723.8 MB/sec
do_put_dictionary/dict/hydrate/65536x8    1.00      3.0±0.27ms   661.5 MB/sec     1.28      3.9±0.35ms   516.2 MB/sec
do_put_dictionary/dict/hydrate/8192x1     1.00     90.7±1.18µs   360.1 MB/sec     1.01     92.0±2.04µs   355.2 MB/sec
do_put_dictionary/dict/hydrate/8192x4     1.00    206.0±4.17µs   634.1 MB/sec     1.00    205.2±4.03µs   636.6 MB/sec
do_put_dictionary/dict/hydrate/8192x8     1.00    370.8±6.05µs   704.7 MB/sec     1.01    374.2±8.18µs   698.2 MB/sec
do_put_dictionary/dict/resend/65536x1     1.02    107.1±1.52µs     2.3 GB/sec     1.00    105.2±1.03µs     2.3 GB/sec
do_put_dictionary/dict/resend/65536x4     1.02    291.3±3.97µs     3.4 GB/sec     1.00    287.0±4.94µs     3.4 GB/sec
do_put_dictionary/dict/resend/65536x8     1.00    501.2±6.74µs     3.9 GB/sec     1.00    499.6±5.88µs     3.9 GB/sec
do_put_dictionary/dict/resend/8192x1      1.00     59.9±1.15µs   545.2 MB/sec     1.03     61.9±1.30µs   527.8 MB/sec
do_put_dictionary/dict/resend/8192x4      1.00     81.2±0.85µs  1609.3 MB/sec     1.04     84.5±1.28µs  1546.6 MB/sec
do_put_dictionary/dict/resend/8192x8      1.00    111.9±1.72µs     2.3 GB/sec     1.01    113.1±1.82µs     2.3 GB/sec
encode/fixed/65536x1                      1.08     11.0±0.03µs    44.3 GB/sec     1.00     10.2±0.03µs    48.0 GB/sec
encode/fixed/65536x4                      1.00     49.2±0.22µs    39.7 GB/sec     1.01     49.6±0.35µs    39.3 GB/sec
encode/fixed/65536x8                      1.00   1088.0±1.73µs     3.6 GB/sec     1.06   1148.9±4.17µs     3.4 GB/sec
encode/fixed/8192x1                       1.03      3.2±0.01µs    19.1 GB/sec     1.00      3.1±0.01µs    19.6 GB/sec
encode/fixed/8192x4                       1.00      8.8±0.02µs    27.9 GB/sec     1.01      8.8±0.03µs    27.7 GB/sec
encode/fixed/8192x8                       1.00     17.2±0.05µs    28.4 GB/sec     1.14     19.6±0.08µs    24.9 GB/sec
encode/nested/65536x1                     1.00     37.9±0.29µs    32.2 GB/sec     1.00     37.9±0.34µs    32.3 GB/sec
encode/nested/65536x4                     1.00   1453.4±4.14µs     3.4 GB/sec     1.05   1525.4±6.41µs     3.2 GB/sec
encode/nested/65536x8                     1.00      3.0±0.02ms     3.2 GB/sec     1.04      3.1±0.02ms     3.1 GB/sec
encode/nested/8192x1                      1.07      6.3±0.01µs    24.3 GB/sec     1.00      5.9±0.02µs    26.0 GB/sec
encode/nested/8192x4                      1.00     21.8±0.04µs    28.0 GB/sec     1.03     22.5±0.12µs    27.2 GB/sec
encode/nested/8192x8                      1.00     49.4±0.09µs    24.7 GB/sec     1.01     50.0±0.27µs    24.4 GB/sec
encode/variable/65536x1                   1.00     68.9±0.34µs    31.9 GB/sec     1.00     69.2±0.88µs    31.7 GB/sec
encode/variable/65536x4                   1.01      2.6±0.02ms     3.4 GB/sec     1.00      2.6±0.02ms     3.4 GB/sec
encode/variable/65536x8                   1.00      5.1±0.07ms     3.5 GB/sec     1.07      5.4±0.07ms     3.2 GB/sec
encode/variable/8192x1                    1.45     11.4±0.01µs    24.1 GB/sec     1.00      7.9±0.02µs    35.0 GB/sec
encode/variable/8192x4                    1.00     26.0±0.05µs    42.3 GB/sec     1.23     32.0±0.13µs    34.4 GB/sec
encode/variable/8192x8                    1.00     80.6±0.15µs    27.3 GB/sec     1.08     86.8±0.97µs    25.3 GB/sec
roundtrip/fixed/65536x1                   1.00    309.0±4.70µs  1618.6 MB/sec     1.03    317.2±4.32µs  1576.4 MB/sec
roundtrip/fixed/65536x4                   1.00  1179.2±17.52µs  1696.4 MB/sec     1.01  1192.4±19.45µs  1677.6 MB/sec
roundtrip/fixed/65536x8                   1.01      2.2±0.02ms  1813.2 MB/sec     1.00      2.2±0.03ms  1835.1 MB/sec
roundtrip/fixed/8192x1                    1.00     95.4±0.70µs   656.2 MB/sec     1.00     95.0±1.42µs   658.8 MB/sec
roundtrip/fixed/8192x4                    1.00    197.5±2.97µs  1267.7 MB/sec     1.00    198.3±2.77µs  1262.3 MB/sec
roundtrip/fixed/8192x8                    1.00    334.1±3.82µs  1498.5 MB/sec     1.01    338.7±7.92µs  1478.5 MB/sec
roundtrip/nested/65536x1                  1.00   858.6±44.35µs  1456.1 MB/sec     1.02   872.0±39.37µs  1433.8 MB/sec
roundtrip/nested/65536x4                  1.00      4.2±0.13ms  1202.3 MB/sec     1.03      4.3±0.12ms  1170.3 MB/sec
roundtrip/nested/65536x8                  1.00      8.7±0.34ms  1154.6 MB/sec     1.01      8.8±0.36ms  1138.1 MB/sec
roundtrip/nested/8192x1                   1.00    159.1±5.15µs   983.4 MB/sec     1.03    163.5±5.23µs   956.9 MB/sec
roundtrip/nested/8192x4                   1.00   463.7±21.70µs  1349.5 MB/sec     1.03   479.6±27.51µs  1304.9 MB/sec
roundtrip/nested/8192x8                   1.00   913.5±43.88µs  1370.2 MB/sec     1.01   923.8±44.34µs  1354.8 MB/sec
roundtrip/variable/65536x1                1.00  1285.4±61.31µs  1750.6 MB/sec     1.02  1307.6±59.69µs  1720.8 MB/sec
roundtrip/variable/65536x4                1.00      7.7±0.29ms  1166.1 MB/sec     1.03      7.9±0.25ms  1135.1 MB/sec
roundtrip/variable/65536x8                1.00     14.4±0.47ms  1249.7 MB/sec     1.02     14.6±0.42ms  1229.1 MB/sec
roundtrip/variable/8192x1                 1.00    206.0±5.73µs  1365.9 MB/sec     1.03    213.0±5.63µs  1321.2 MB/sec
roundtrip/variable/8192x4                 1.00   670.8±24.01µs  1678.3 MB/sec     1.02   682.3±23.10µs  1649.8 MB/sec
roundtrip/variable/8192x8                 1.00  1223.7±25.70µs  1839.8 MB/sec     1.01  1241.7±39.31µs  1813.1 MB/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 680.2s
Peak memory 140.2 MiB
Avg memory 68.8 MiB
CPU user 708.0s
CPU sys 117.3s
Peak spill 0 B

branch

Metric Value
Wall time 695.2s
Peak memory 128.9 MiB
Avg memory 62.0 MiB
CPU user 722.1s
CPU sys 119.3s
Peak spill 0 B

File an issue against this benchmark runner

@gabotechs

Copy link
Copy Markdown
Contributor

🤔 The pipelines seem to still be showing this issue:

  ################# FAILURES #################
  FAILED TEST: union Rust producing,  Rust consuming
  <class 'RuntimeError'>: Command failed: /build/rust/debug/flight-test-integration-client --host localhost --port=41623 --path /tmp/arrow-integration-q5v75h5_/generated_union.json
  With output:
  --------------
  
  thread 'main' (28314) panicked at /__w/arrow-rs/arrow-rs/rust/arrow-buffer/src/buffer/scalar.rs:194:43:
  Memory pointer from external source (e.g, FFI) is not aligned with the specified scalar type. Before importing buffer through FFI, please make sure the allocation is aligned.
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

@Rich-T-kid

Rich-T-kid commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

that error has been present since the first commit. the first commit only pre-allocated vectors, propagated the flag down to arrow-ipc and changed data_body.as_ref() to data_body.clone() to avoid copys. I've changed the call back to as_ref() to see if thats whats causing these alignment errors

@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from bf08213 to ef64f12 Compare June 24, 2026 16:08
@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from ef64f12 to 4053b0a Compare June 24, 2026 17:04
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

The alignment issue was coming from the .clone() call.

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

With f2fcc0c, buffers are only copied when they're actually misaligned. Out of ~18 million total calls during benchmarking, only ~46k required reallocation, meaning 99.75% of the time we skip the copy entirely, while still correctly handling the cases where alignment is off.
This also feeds directly into the N-buffer copy issue

@Rich-T-kid

Rich-T-kid commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

This should be good to go ( for real this time 😅). we may want to run the benchmarks again
cc @alamb

@alamb alamb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @Rich-T-kid -- the code looks good to me (I had only some minor nits)

The biggest comment is baout the breaking API change -- I had a suggestion. let me know what you think

Comment thread arrow-flight/src/decode.rs Outdated
Comment thread arrow-flight/src/decode.rs
Comment thread arrow-flight/Cargo.toml
Comment thread arrow-ipc/src/reader.rs Outdated
skip_validation: UnsafeFlag,
) -> Result<RecordBatch, ArrowError> {
RecordBatchDecoder::try_new(buf, batch, schema, dictionaries_by_id, metadata)?
let decoder = RecordBatchDecoder::try_new(buf, batch, schema, dictionaries_by_id, metadata)?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: we can probably make this more concise by not adding a let decoder = ...

Comment thread arrow-ipc/src/reader.rs Outdated
dictionaries_by_id: &HashMap<i64, ArrayRef>,
projection: Option<&[usize]>,
metadata: &MetadataVersion,
skip_validation: UnsafeFlag,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this is a public API it means we can't release this until the next major (breaking) API release

https://docs.rs/arrow-ipc/latest/arrow_ipc/reader/fn.read_record_batch.html

do we really need to make this change? Perhaps we should just direct people to use RecordBatchDecoder directly if they want more control over the decoding process rather than changing this signature.

However, not much of that strucutre seems to be public at the moment: https://docs.rs/arrow-ipc/latest/arrow_ipc/reader/struct.RecordBatchDecoder.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So maybe we could (as a separate PR) deprecate read_record_batch and make all the corresponding methods on RecordBatchDecoder pub 🤔

Then this PR would simply add the with_disable_validation 🤔

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes sense to make RecordBatchDecoder public. flightdata_to_record_batch/read_record_batch is a wrapper around the RecordBatchDecoder.read_record_batch() function.

to avoid making this a breaking PR change I can just call RecordBatchDecoder.read_record_batch() directly in flightDataDecoder::extract_message().

@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from 76cc53b to 2d22728 Compare June 24, 2026 20:07
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@alamb pushed up a revision.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arrow Changes to the arrow crate arrow-flight Changes to the arrow-flight crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants