Skip to content

test(amber): move state-mat e2e into amber-integration#5682

Open
Yicong-Huang wants to merge 7 commits into
apache:mainfrom
Yicong-Huang:test/state-mat-into-amber-integration
Open

test(amber): move state-mat e2e into amber-integration#5682
Yicong-Huang wants to merge 7 commits into
apache:mainfrom
Yicong-Huang:test/state-mat-into-amber-integration

Conversation

@Yicong-Huang

@Yicong-Huang Yicong-Huang commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

What changes were proposed in this PR?

Drops the macOS-only pyamber-state-materialization-mac diagnostic job and the sqlite-backed SqlCatalog override it relied on. The two state-materialization e2e tests now run under the existing amber-integration ubuntu job, which already provisions postgres + iceberg catalog DB + MinIO + Lakekeeper and runs pytest -m integration as its last step.

Concretely:

Before After
pyamber-state-materialization-mac macOS job (build.yml:742) deleted
SqlCatalog (sqlite) injected in module fixture real postgres-backed JdbcCatalog, matching test_iceberg_document.py:45
Test discovered by an explicit pytest -sv <path> from that job @pytest.mark.integration + picked up by amber-integration's pytest -m integration

StorageConfig.initialize is wrapped in a session-autouse fixture (rather than called at module import time) so it co-exists with test_iceberg_document.py's import-time initialize regardless of pytest collection order.

The unit-style test_process_start_channel_persists_produce_state_on_start_output that the mac job also ran is untouched: it monkeypatches the output manager and is already picked up by the regular pyamber job's pytest -m "not integration" step.

Any related issues, documentation, discussions?

Closes #5681.

How was this PR tested?

Locally against the existing texera-dev infra (postgres on 5432 with texera_iceberg_catalog schema initialized via sql/iceberg_postgres_catalog.sql):

cd amber && pytest -m integration --junit-xml=/tmp/junit-integration.xml -sv
# 3 passed, 502 deselected  -- test_state_written_by_output_manager_is_replayed_by_reader,
#                              test_state_table_persists_across_writer_close,
#                              test_rest_catalog_round_trip

And the regular pyamber suite still green:

cd amber && pytest -m "not integration" -q
# 502 passed, 3 deselected

In CI, the amber-integration job picks these tests up automatically because they're marked @pytest.mark.integration. The mac job is gone so PRs no longer pay for a separate macOS runner just for these two tests.

Was this PR authored or co-authored using generative AI tooling?

Generated-by: Claude Code (Claude Opus 4.7)

@github-actions github-actions Bot added pyamber ci changes related to CI labels Jun 13, 2026
@codecov-commenter

codecov-commenter commented Jun 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.88%. Comparing base (99b9ca2) to head (1a160dd).
⚠️ Report is 12 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##               main    #5682      +/-   ##
============================================
- Coverage     53.09%   52.88%   -0.22%     
- Complexity     2546     2620      +74     
============================================
  Files          1076     1090      +14     
  Lines         41762    42204     +442     
  Branches       4513     4530      +17     
============================================
+ Hits          22174    22318     +144     
- Misses        18278    18580     +302     
+ Partials       1310     1306       -4     
Flag Coverage Δ *Carryforward flag
access-control-service 70.91% <ø> (-0.52%) ⬇️
agent-service 34.36% <ø> (ø)
amber 52.95% <ø> (-1.00%) ⬇️
computing-unit-managing-service 1.65% <ø> (ø)
config-service 56.71% <ø> (ø)
file-service 57.06% <ø> (ø)
frontend 47.86% <ø> (+0.34%) ⬆️
pyamber 89.77% <ø> (-0.95%) ⬇️
python 90.74% <ø> (ø) Carriedforward from f9c7dd5
workflow-compiling-service 58.69% <ø> (ø)

*This pull request uses carry forward flags. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

⚠️ Benchmark changes need a look

🟢 0 better · 🔴 6 worse · ⚪ 9 noise (<±5%) · 0 without baseline

Compared against main 6becb85 benchmarked on this same runner, so the delta is largely free of cross-runner hardware noise. The "7d avg" column still reflects the gh-pages dashboard. Treat <±5% as noise unless repeated.

Dashboard · Run

config throughput MB/s latency max Δ latest / 7d
🔴 bs=10 sw=10 sl=64 412 0.252 21,405/46,815/46,815 us 🔴 +89.8% / 🔴 +33.8%
🔴 bs=100 sw=10 sl=64 929 0.567 103,240/132,706/132,706 us 🔴 +10.4% / 🟢 -8.0%
bs=1000 sw=10 sl=64 1,075 0.656 926,393/967,467/967,467 us ⚪ within ±5% / 🟢 -5.4%
Baseline details

Latest main 6becb85 from same runner

config metric PR latest main 7d avg Δ latest Δ 7d
bs=10 sw=10 sl=64 throughput 412 tuples/sec 486 tuples/sec 410.82 tuples/sec -15.2% +0.3%
bs=10 sw=10 sl=64 MB/s 0.252 MB/s 0.296 MB/s 0.251 MB/s -14.9% +0.5%
bs=10 sw=10 sl=64 p50 21,405 us 20,930 us 23,785 us +2.3% -10.0%
bs=10 sw=10 sl=64 p95 46,815 us 24,661 us 34,980 us +89.8% +33.8%
bs=10 sw=10 sl=64 p99 46,815 us 24,661 us 34,980 us +89.8% +33.8%
bs=100 sw=10 sl=64 throughput 929 tuples/sec 972 tuples/sec 891.94 tuples/sec -4.4% +4.2%
bs=100 sw=10 sl=64 MB/s 0.567 MB/s 0.593 MB/s 0.544 MB/s -4.4% +4.2%
bs=100 sw=10 sl=64 p50 103,240 us 100,444 us 112,277 us +2.8% -8.0%
bs=100 sw=10 sl=64 p95 132,706 us 120,216 us 139,802 us +10.4% -5.1%
bs=100 sw=10 sl=64 p99 132,706 us 120,216 us 139,802 us +10.4% -5.1%
bs=1000 sw=10 sl=64 throughput 1,075 tuples/sec 1,088 tuples/sec 1,041 tuples/sec -1.2% +3.3%
bs=1000 sw=10 sl=64 MB/s 0.656 MB/s 0.664 MB/s 0.635 MB/s -1.2% +3.2%
bs=1000 sw=10 sl=64 p50 926,393 us 911,571 us 972,714 us +1.6% -4.8%
bs=1000 sw=10 sl=64 p95 967,467 us 959,226 us 1,023,057 us +0.9% -5.4%
bs=1000 sw=10 sl=64 p99 967,467 us 959,226 us 1,023,057 us +0.9% -5.4%
Raw CSV
config_idx,batch_size,schema_width,string_len,num_batches,total_ms,total_tuples,total_bytes,tuples_per_sec,mb_per_sec,lat_p50_us,lat_p95_us,lat_p99_us
0,10,10,64,20,485.24,200,128000,412,0.252,21405.17,46815.30,46815.30
1,100,10,64,20,2152.01,2000,1280000,929,0.567,103239.52,132706.10,132706.10
2,1000,10,64,20,18606.66,20000,12800000,1075,0.656,926393.28,967467.48,967467.48

@Yicong-Huang Yicong-Huang force-pushed the test/state-mat-into-amber-integration branch 3 times, most recently from b9a13f2 to 9f13e26 Compare June 13, 2026 17:59
Drop the macOS-only `pyamber-state-materialization-mac` diagnostic job
and the sqlite-backed `SqlCatalog` override it relied on. Mark the
two e2e tests with @pytest.mark.integration so they run in the
`amber-integration` ubuntu job, which already provisions postgres +
iceberg catalog DB + MinIO + Lakekeeper and runs `pytest -m integration`
as its last step.

Catalog initialization now mirrors test_iceberg_document.py:45 —
postgres-backed JdbcCatalog with a tempdir warehouse — so we exercise
the real prod catalog code path instead of an sqlite shim. The
`StorageConfig.initialize` call is wrapped in a session-autouse
fixture (rather than at module import) so it co-exists with
test_iceberg_document.py's import-time initialize regardless of
pytest collection order.

The unit-style `test_process_start_channel_persists_produce_state_on_start_output`
that the mac job also ran is unaffected: it monkeypatches the output
manager and is already picked up by the regular `pyamber` job's
`pytest -m "not integration"` step.

Closes apache#5681
@Yicong-Huang Yicong-Huang force-pushed the test/state-mat-into-amber-integration branch from 9f13e26 to 009d9e4 Compare June 13, 2026 18:43
Yicong-Huang and others added 3 commits June 13, 2026 14:53
Signed-off-by: Yicong Huang <17627829+Yicong-Huang@users.noreply.github.com>
The macos-latest matrix entry was failing at "Set up job" / "docker:
command not found" because GitHub-hosted macOS runners have no
Docker and `services:` containers are Linux-only. Provision the same
stack natively on macOS:

  * postgres@16 via brew, with a `postgres` superuser created so the
    psql steps stay OS-agnostic;
  * minio via `brew install minio`, backgrounded with nohup;
  * lakekeeper from the upstream aarch64-apple-darwin tarball
    (published v0.11.0 onward — same version as the Linux docker tag);
  * minio-mc via brew for the warehouse bucket-init step;
  * protoc release asset switched on \$RUNNER_OS.

The job-level `services.postgres` block is also removed since it's a
Linux-only feature; both branches now start postgres via a step.

Each docker-dependent step branches on \$RUNNER_OS inside its `run:`
script so the YAML keeps one step per concept rather than
Linux/macOS pairs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
protoc 3.19.4 predates upstream arm64-mac builds — the previous
osx-aarch_64 URL 404'd. GitHub's Apple Silicon macOS runners ship
Rosetta 2 preinstalled, so the x86_64 binary runs transparently.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

@aglinxinyuan aglinxinyuan 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 change is correct. I will review it after the CI passes.

Yicong-Huang and others added 3 commits June 13, 2026 16:32
protoc's import resolver walks each -I in order. With `-I=/usr/local/include`
listed first, ambermessage.proto's `import "org/apache/.../controlcommands.proto"`
caused protoc to stat `/usr/local/include/org/apache/...`. On Linux that
path returns ENOENT and protoc falls through to the next -I; on macOS
the unzip-created /usr/local/include lacks +x for the runner user, so
the stat returns EACCES and protoc aborts.

Widen the existing chmod from `/usr/local/include/google` to
`/usr/local/include` so the parent dir is traversable on both OSes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The macOS run dies with `protoc-gen-python_betterproto: Plugin failed
with status code 1` and no plugin stderr is surfaced. Wrap the script
so a failure dumps python/plugin paths, attempts to import
betterproto, and reports protoc's arch — enough to tell whether
the plugin is missing, mis-imported, or hitting an arch mismatch.
Remove this once the macOS path is stable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rch mismatch

Diagnostics from the last run revealed:
  * /usr/local/bin/protoc was Mach-O x86_64 (running under Rosetta);
  * protoc-gen-python_betterproto lived in
    /Users/runner/hostedtoolcache/Python/3.11.9/arm64/bin/ (arm64-only
    setup-python);
  * the actual betterproto package was installed into the universal
    Framework Python at /Library/Frameworks/Python.framework/...

The x86_64-under-Rosetta protoc could exec the arm64 plugin shim, but
the arch/site-packages split meant the import inside the plugin landed
in a Python that didn't have betterproto wired up the same way, hence
"Plugin failed with status code 1" with no stderr surfaced.

Switching macOS to brew's arm64-native protobuf keeps the protoc /
plugin / python triad on a single arch (arm64), sidestepping all of
this. The version drifts from the pinned 3.19.4 used on Linux, but
python_betterproto's output for proto3 sources is determined by the
betterproto package version, not protoc — so the python codegen
stays bit-identical across the two paths.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@Yicong-Huang

Copy link
Copy Markdown
Contributor Author

The change is correct. I will review it after the CI passes.

@aglinxinyuan CI looks green now. Could you please check again?

Copilot AI 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.

Pull request overview

This PR migrates the Python state-materialization end-to-end tests to run as part of the amber-integration CI job (instead of a separate macOS-only diagnostic job), and updates the test setup to exercise the production-like Iceberg catalog path.

Changes:

  • Updated test_state_materialization_e2e.py to use a postgres-backed Iceberg JdbcCatalog path, added @pytest.mark.integration, and moved initialization into an autouse fixture.
  • Refactored amber-integration in .github/workflows/build.yml to provision Postgres/MinIO/Lakekeeper on both Linux and macOS runners, and removed the dedicated pyamber-state-materialization-mac job.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
amber/src/test/python/core/architecture/packaging/test_state_materialization_e2e.py Switches e2e test from sqlite catalog override to postgres-backed catalog and marks it as integration.
.github/workflows/build.yml Removes the old macOS diagnostic job and updates amber-integration infra provisioning / OS matrix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +129 to +132
s3_endpoint="http://localhost:9000",
s3_region="us-east-1",
s3_auth_username="minioadmin",
s3_auth_password="minioadmin",
Comment on lines +79 to +80
@pytest.fixture(autouse=True)
def _init_storage_config(self):
Comment on lines 325 to 327
matrix:
os: [ubuntu-22.04]
os: [ubuntu-22.04, macos-latest]
java-version: [17]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci changes related to CI pyamber

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Move state-materialization e2e tests into amber-integration (drop sqlite SqlCatalog and the macOS-only diagnostic job)

4 participants