Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GH-44491: [C++] StatusConstant- cheaply copied const Status #44493

Merged
merged 8 commits into from
Nov 14, 2024

Conversation

bkietz
Copy link
Member

@bkietz bkietz commented Oct 21, 2024

Rationale for this change

It'd be convenient to construct placeholder error Status cheaply.

What changes are included in this PR?

A constant error Status can now be constructed wrapped in a function like

Status UninitializedResult() {
  static StatusConstant uninitialized_result{StatusCode::UnknownError,
                                             "Uninitialized Result<T>"};
  return uninitialized_result;
}

Copying the constant status is relatively cheap (no heap interaction), so it's suitable for use as a placeholder error status.

Added bool Status::State::is_constant which causes copies to be shallow and skips destruction. Also Status::state_ is a const pointer now; this helps to ensure that it is obvious when we mutate state_ (as in AddContextLine).

Are these changes tested?

Minimal unit test added. The main consideration is probably benchmarks to make sure hot paths don't get much slower.

Are there any user-facing changes?

This API is not currently public; no user-facing changes.

Copy link

⚠️ GitHub issue #44491 has been automatically assigned in GitHub to PR creator.

cpp/src/arrow/status.h Outdated Show resolved Hide resolved
cpp/src/arrow/status.h Outdated Show resolved Hide resolved
@github-actions github-actions bot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Oct 21, 2024
@bkietz bkietz force-pushed the 44491-static-status branch from 0634658 to 0a5005e Compare October 25, 2024 15:11
@bkietz bkietz marked this pull request as ready for review October 25, 2024 15:12
@github-actions github-actions bot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Oct 25, 2024
@bkietz bkietz changed the title GH-44491: [C++] Static Status draft GH-44491: [C++] StatusConstant- cheaply copied const Status Oct 25, 2024
ARROW_CHECK_NE(code, StatusCode::OK) << "Cannot construct ok status constant";
}

operator Status() const { // NOLINT(runtime/explicit)
Copy link
Member Author

Choose a reason for hiding this comment

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

We could alternatively make StatusConstant a subclass of Status

@github-actions github-actions bot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Oct 25, 2024
@bkietz
Copy link
Member Author

bkietz commented Oct 25, 2024

@pitrou @felipecrv which benchmark would be convincing as a demonstration this doesn't slow us down? I don't think we have an explicit status or result benchmark

For now (since it seems to me to have the deepest Status bubbling stack),

@ursabot please benchmark command=cpp-micro --suite-filter=grouper

@github-actions github-actions bot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Oct 25, 2024
@pitrou
Copy link
Member

pitrou commented Oct 25, 2024

I don't think we have an explicit status or result benchmark

We do, but for some reason I had stuffed it in type_benchmark.cc

BENCHMARK(ErrorSchemeNoError);
BENCHMARK(ErrorSchemeBool);
BENCHMARK(ErrorSchemeStatus);
BENCHMARK(ErrorSchemeResult);
BENCHMARK(ErrorSchemeException);
BENCHMARK(ErrorSchemeNoErrorNoInline);
BENCHMARK(ErrorSchemeBoolNoInline);
BENCHMARK(ErrorSchemeStatusNoInline);
BENCHMARK(ErrorSchemeResultNoInline);
BENCHMARK(ErrorSchemeExceptionNoInline);

@github-actions github-actions bot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Oct 25, 2024
@bkietz
Copy link
Member Author

bkietz commented Oct 25, 2024

@ursabot please benchmark command=cpp-micro --suite-filter=type

@ursabot
Copy link

ursabot commented Oct 25, 2024

Benchmark runs are scheduled for commit f7d3fff. Watch https://buildkite.com/apache-arrow and https://conbench.ursa.dev for updates. A comment will be posted here when the runs are complete.

Copy link

Thanks for your patience. Conbench analyzed the 3 benchmarking runs that have been run so far on PR commit f7d3fff.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

@github-actions github-actions bot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Oct 30, 2024
@felipecrv
Copy link
Contributor

@pitrou @felipecrv which benchmark would be convincing as a demonstration this doesn't slow us down? I don't think we have an explicit status or result benchmark

Can you check the binary size impact with bloaty?

The performance impact is very tiny but everywhere a Status gets destroyed (all over the place). I think checking binary size is a good proxy to keeping the shape of the code the same.

cpp/src/arrow/status.cc Outdated Show resolved Hide resolved
cpp/src/arrow/status_internal.h Outdated Show resolved Hide resolved
@github-actions github-actions bot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Nov 4, 2024
@bkietz
Copy link
Member Author

bkietz commented Nov 4, 2024

@ursabot please benchmark command=cpp-micro --suite-filter=type --benchmark-filter=Error

@ursabot
Copy link

ursabot commented Nov 4, 2024

Benchmark runs are scheduled for commit 86741d6. Watch https://buildkite.com/apache-arrow and https://conbench.ursa.dev for updates. A comment will be posted here when the runs are complete.

Copy link

Thanks for your patience. Conbench analyzed the 3 benchmarking runs that have been run so far on PR commit 86741d6.

There were 2 benchmark results indicating a performance regression:

The full Conbench report has more details.

@bkietz
Copy link
Member Author

bkietz commented Nov 4, 2024

Those regressions have got to be flukes; they don't even touch Status

@pitrou
Copy link
Member

pitrou commented Nov 4, 2024

Yes, the code changes probably trigger random variation in code placement in these benchmarks, that could explain the false regressions.

@bkietz bkietz force-pushed the 44491-static-status branch from 86741d6 to d13d04e Compare November 8, 2024 17:17
@bkietz bkietz requested a review from pitrou November 12, 2024 16:31
@pitrou pitrou force-pushed the 44491-static-status branch from d13d04e to d552fa5 Compare November 14, 2024 14:49
@pitrou
Copy link
Member

pitrou commented Nov 14, 2024

@github-actions crossbow submit -g cpp

Copy link
Member

@pitrou pitrou left a comment

Choose a reason for hiding this comment

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

Sorry for the delayed review and approval @bkietz . It's a nice improvement.

@@ -511,13 +511,8 @@ TEST(TestBuffer, CopySliceEmpty) {
}

TEST(TestBuffer, ToHexString) {
const uint8_t data_array[] = "\a0hex string\xa9";
Copy link
Member

Choose a reason for hiding this comment

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

(unrelated quick fix for CI compile error)

Copy link

Revision: be910af

Submitted crossbow builds: ursacomputing/crossbow @ actions-daf4798abf

Task Status
example-cpp-minimal-build-static GitHub Actions
example-cpp-minimal-build-static-system-dependency GitHub Actions
example-cpp-tutorial GitHub Actions
test-alpine-linux-cpp GitHub Actions
test-build-cpp-fuzz GitHub Actions
test-conda-cpp GitHub Actions
test-conda-cpp-valgrind GitHub Actions
test-cuda-cpp-ubuntu-20.04-cuda-11.2.2 GitHub Actions
test-cuda-cpp-ubuntu-22.04-cuda-11.7.1 GitHub Actions
test-debian-12-cpp-amd64 GitHub Actions
test-debian-12-cpp-i386 GitHub Actions
test-fedora-39-cpp GitHub Actions
test-ubuntu-20.04-cpp GitHub Actions
test-ubuntu-20.04-cpp-bundled GitHub Actions
test-ubuntu-22.04-cpp GitHub Actions
test-ubuntu-22.04-cpp-20 GitHub Actions
test-ubuntu-22.04-cpp-emscripten GitHub Actions
test-ubuntu-22.04-cpp-no-threading GitHub Actions
test-ubuntu-24.04-cpp GitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundled GitHub Actions
test-ubuntu-24.04-cpp-gcc-14 GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formats GitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizer GitHub Actions

@pitrou
Copy link
Member

pitrou commented Nov 14, 2024

CI failures are unrelated, I'll merge.

@pitrou pitrou merged commit 29e8ea0 into apache:main Nov 14, 2024
41 checks passed
@pitrou pitrou removed the awaiting change review Awaiting change review label Nov 14, 2024
@bkietz bkietz deleted the 44491-static-status branch November 14, 2024 23:03
Copy link

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit 29e8ea0.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 114 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for free to 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.

4 participants