GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

GH-48238: [C++] Actually write IPC schema endianness, not host endianness - #48239

Merged
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness
Nov 29, 2025
Merged

GH-48238: [C++] Actually write IPC schema endianness, not host endianness#48239
pitrou merged 1 commit into
apache:mainfrom
pitrou:gh48238-ipc-endianness

Conversation

@pitrou

@pitroupitrou commented Nov 24, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Schema objects have an endianness, but we were ignoring it when serializing a Schema to IPC, and instead writing out the host's endianness.

Are these changes tested?

Yes, by additional test.

Are there any user-facing changes?

No.

This PR contains a "Critical Fix". (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrou requested a review from WillAydNovember 24, 2025 15:12
@pitrou
pitrou marked this pull request as ready for review November 24, 2025 15:13
@pitrou

Copy link
Copy Markdown
MemberAuthor

CI failures are unrelated, some of them due to intermittent download failures on the GH infrastructure.

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

I think we should revise the "Critical Fix" part in the PR description. The code LGTM.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Nov 26, 2025

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

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Nov 27, 2025
@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

I think we should revise the "Critical Fix" part in the PR description.

Currently, if you write non-native endianness data using IPC, the endianness is stored incorrectly (this could happen if you are just passing through data from an other system, think e.g. a Flight proxy). This means the data will be incorrectly byte-swapped when reading.

One unrelated question though: How is the endianness handled for an IPC between platforms having different endiannesses?

It's optionally normalized on read. Which is why it's important for the information to be recorded correctly...

/// \brief Whether to convert incoming data to platform-native endianness
///
/// If the endianness of the received schema is not equal to platform-native
/// endianness, then all buffers with endian-sensitive data will be byte-swapped.
/// This includes the value buffers of numeric types, temporal types, decimal
/// types, as well as the offset buffers of variable-sized binary and list-like
/// types.
///
/// Endianness conversion is achieved by the RecordBatchFileReader,
/// RecordBatchStreamReader and StreamDecoder classes.
bool ensure_native_endian = true;

@pitrou

pitrou commented Nov 27, 2025

Copy link
Copy Markdown
MemberAuthor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

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

LGTM

@emkornfield

Copy link
Copy Markdown
Contributor

The changes look reasonable, but it would this break the "common" case if a machine is BigEndian when writing data?

What do you mean?

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library. I was wondering if this bit gets set automatically in some other way (and if not if it silently reports data from big-endian machines as little endian to consumers of IPC message.)

@pitrou

Copy link
Copy Markdown
MemberAuthor

I might have been misunderstaning the code but it looks like this PR removes automatic detection of endianness and relies the the enddianess set by the client of the library.

The endianness is still set to the machine's default in most cases. For example when calling the Schema constructor without passing the corresponding optional argument.

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Nov 29, 2025
@pitrou
pitrou merged commit 91f6618 into apache:mainNov 29, 2025
68 of 84 checks passed
@pitroupitrou removed the awaiting merge Awaiting merge label Nov 29, 2025
@pitrou
pitrou deleted the gh48238-ipc-endianness branch November 29, 2025 14:22
@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 4 benchmarking runs that have been run so far on merge-commit 91f6618.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

Mottl pushed a commit to Mottl/arrow that referenced this pull request May 26, 2026
…endianness (apache#48239)
### Rationale for this change
`Schema` objects have an endianness, but we were ignoring it when serializing a `Schema` to IPC, and instead writing out the host's endianness.
### Are these changes tested?
Yes, by additional test.
### Are there any user-facing changes?
No.
**This PR contains a "Critical Fix".** (If the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld), please provide explanation. If not, you can remove this.)
* GitHub Issue: apache#48238
Authored-by: Antoine Pitrou <antoine@python.org>
Signed-off-by: Antoine Pitrou <antoine@python.org>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@emkornfield@zanmato1984