Skip to content

[10125] arrow-flight decode path optimizations (add skip_validation to arrow-flight)#10206

Merged
alamb merged 13 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/arrow-flight-decode-opt-impl
Jul 1, 2026
Merged

[10125] arrow-flight decode path optimizations (add skip_validation to arrow-flight)#10206
alamb merged 13 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
@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 thread arrow-flight/src/decode.rs Outdated
@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

@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
Comment thread arrow-ipc/src/reader.rs Outdated
@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.

@alamb alamb changed the title [10125] arrow-flight decode path optimizations [10125] arrow-flight decode path optimizations (add skip_validation to arrow-flight) Jun 26, 2026
Comment thread arrow-flight/src/decode.rs Outdated
@Rich-T-kid Rich-T-kid force-pushed the rich-T-kid/arrow-flight-decode-opt-impl branch from 9b3c27b to aa41dc9 Compare June 29, 2026 19:05
Comment thread arrow-flight/src/decode.rs Outdated
Comment on lines +339 to +343
let buf = if data.data_body.as_ptr() as usize % 64 == 0 {
Buffer::from(data.data_body.clone())
} else {
Buffer::from(data.data_body.as_ref())
};

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.

This is a bit subtle, how about adding a comment here about why this is needed?

@gabotechs gabotechs Jun 30, 2026

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.

Or even leave this optimization aside for now, as it seems a different topic than exposing the with_skip_validation() method.

One thought I'm having is that it seems easy to shoot ourselves in the foot with this very low-level optimizations. For example, if it wasn't for the current tests it would have been very easy to introduce a silent bug in main (#10206 (comment)).

If it turns out that one of these small optimizations introduces one of these subtle bugs, but it happens that there's no specific test for that one, it will blow up in people's codebases instead of here. If that happens, the problematic PR in arrow-rs needs to be rolled back, but if that PR happens to introduce a mix of 4 or 5 minor optimizations, we would be rolling back all those minor optimizations instead of just the problematic one.

With this I mean that there's value in making different PRs for the different optimizations even if they are extra small, and avoiding the "small optimizations collection"-style PRs just for the sake of being able to roll them back manually if things go south.

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.

Ill introduce this change in a follow up PR once this is merged to avoid git conflicts.

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.

This is great advice @gabotechs -- and thank you @Rich-T-kid for bearing with us

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@gabotechs is exposing (adding) new public methods considered a breaking API change?

@gabotechs

Copy link
Copy Markdown
Contributor

No, because existing code consuming this library will keep working without further changes from their maintainers.

I'd anyways make sure it's strictly necessary to expose those new methods though. If there's another way that does not require broadening the public API that would be ideal.

@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.

Thank you @Rich-T-kid and @gabotechs

Comment thread arrow-flight/src/decode.rs
Comment thread arrow-ipc/src/reader.rs Outdated
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@alamb pushed up the changes.

is the idea to deprecate flight_data_to_arrow_batch and expose flight_data_to_arrow_batch directly in a follow on PR? I can file a ticket if so

I can open the ticket for this later today If you don't a chance to. In any case, it should be a pretty small change so I'll open a follow up PR for it afterwards

@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.

💯

@alamb alamb merged commit 38230b0 into apache:main Jul 1, 2026
31 checks passed
@alamb

alamb commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Let's do it

@alamb

alamb commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Codex also noticed that dictionary decoding will always validate (there is no way to turn it off). I filed a ticket to track

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

nice, ill check it out. I pushed a PR (#10256) closing #10249

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 performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants