Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
8439875
feat(memory): persist versioned source evidence
MaoMengww Oct 14, 2026
5dfa2ad
feat(memory): verify historical evidence during projection rebuild
MaoMengww Oct 14, 2026
034e0cc
fix(memory): enforce evidence schema safety and backend conformance
MaoMengww Oct 14, 2026
4d1bf17
fix(memory): preserve unrelated database inspection
MaoMengww Oct 14, 2026
cf8068a
test(memory): consolidate source evidence E2E acceptance
MaoMengww Oct 14, 2026
dd1d128
merge: integrate upstream artifact handles with evidence migration
MaoMengww Oct 14, 2026
0d70cba
fix(memory): verify evidence against retained source material
MaoMengww Oct 15, 2026
3305b6b
fix(sources): align remote payload aliases with manifests
MaoMengww Oct 15, 2026
c9ee82d
fix(sources): preserve envelope keys with alias generators
MaoMengww Oct 16, 2026
dc9b6a1
fix(sources): align envelope validation with serialization
MaoMengww Oct 17, 2026
8ee3aba
fix(memory): preserve source identity and shared evidence
MaoMengww Oct 18, 2026
6a836b1
fix(sqlite): preserve startup catalog compatibility
MaoMengww Oct 19, 2026
b5a4c1e
fix(sources): keep unverifiable evidence neutral
MaoMengww Oct 19, 2026
40d6c80
Merge upstream master into source evidence declarations
MaoMengww Oct 19, 2026
2bce54e
fix(sources): reject omitted identity before capture
MaoMengww Oct 19, 2026
bb36c93
fix(sources): reject transformed identity before capture
MaoMengww Oct 19, 2026
88cd8f2
Merge upstream master into source evidence declarations
MaoMengww Oct 19, 2026
73ec5aa
fix(sources): separate worker and historical identity decoding
MaoMengww Oct 20, 2026
25d9e7a
fix(sources): disambiguate canonical history from business aliases
MaoMengww Oct 20, 2026
5ceed57
fix(sources): normalize recursive transport root schemas
MaoMengww Oct 20, 2026
f4ca7f8
merge: integrate upstream retrieval lifecycle validation
MaoMengww Oct 20, 2026
2b95df6
fix(sources): preserve versioned alias compatibility
MaoMengww Oct 21, 2026
1e67e5d
chore(migrations): initialize issue 2154 implementation branch
Zxf-xufeng Oct 21, 2026
13517fd
fix(sources): keep upgraded alias definitions compatible
MaoMengww Oct 21, 2026
579b67e
fix(migrations): parse arithmetic CHECK constraints
Zxf-xufeng Oct 21, 2026
d7f2d89
ci(release): gate database upgrade support on installed artifacts
Zxf-xufeng Oct 21, 2026
c4fc8ab
fix(migrations): preserve literal percent in CHECK validation
Zxf-xufeng Oct 22, 2026
eff8bac
ci(release): discover upgrade sources and exercise embedded seekdb
Zxf-xufeng Oct 22, 2026
2be0739
ci(release): pin upgrade baseline and add OceanBase coverage
Zxf-xufeng Oct 22, 2026
76d4863
fix(ci): select OceanBase for the historical upgrade fixture
Zxf-xufeng Oct 22, 2026
8391cf9
fix(ci): provide OceanBase maintenance coordination options
Zxf-xufeng Oct 22, 2026
3c5c0ec
merge: sync upstream master and refresh the atomic maintenance baseline
MaoMengww Oct 21, 2026
fd4173d
ci(release): require successful full database upgrades
Zxf-xufeng Oct 22, 2026
7941a90
test(release): use embedded-compatible Server roles
Zxf-xufeng Oct 22, 2026
3b27a25
Merge remote-tracking branch 'origin/master' into codex/2084-full-ser…
AlexStocks Oct 22, 2026
10efc32
fix(release): normalize review hashes and validate all artifacts
Zxf-xufeng Oct 22, 2026
8b7ec35
feat(migrations): recognize complete released SQLite Server schemas
AlexStocks Oct 22, 2026
e44c8b7
Merge commit '3c5c0eccdfc65da04c509c005fe230252990d00a' into codex/20…
AlexStocks Oct 22, 2026
8f3c0d6
Merge commit 'refs/pull/2178/head' of https://github.com/oceanbase/po…
AlexStocks Oct 22, 2026
3a8b38b
fix(sources): preserve stable remote manifest fingerprints
MaoMengww Oct 22, 2026
8a89520
feat(migrations): register immutable MySQL schema layout fragments
AlexStocks Oct 22, 2026
01c680b
Merge remote-tracking branch 'origin/master' into codex/2084-full-ser…
AlexStocks Oct 22, 2026
8662724
Merge commit '3a8b38be1037672010f0bba1597060a9994c4dd3' into codex/20…
AlexStocks Oct 22, 2026
881335f
feat(migrations): recognize complete released seekDB Server schemas
AlexStocks Oct 22, 2026
54f8802
feat(migrations): execute registered MySQL revision wrappers
AlexStocks Oct 22, 2026
9e0088b
fix(migrations): bind plans to target Processing declarations
AlexStocks Oct 22, 2026
bcd3657
feat(migrations): recognize complete OceanBase Server baseline
AlexStocks Oct 22, 2026
5e23222
feat(migrations): complete registered Server upgrade path
Zxf-xufeng Oct 22, 2026
4f53f05
feat(migrations): integrate OceanBase baseline and execution registra…
Zxf-xufeng Oct 22, 2026
dc6e188
fix(migrations): validate durable task ownership before admission
Zxf-xufeng Oct 22, 2026
29f0512
fix(migrations): preserve Server resource checksums across checkouts
AlexStocks Oct 22, 2026
0a89ec7
test(upgrades): shut down embedded servers gracefully
Zxf-xufeng Oct 22, 2026
72b16a7
test(migrations): align startup guards with full Server readiness
AlexStocks Oct 22, 2026
e2e91ac
Merge commit '0a89ec706db5f016c3efa698ca3fbe831f549f11' into codex/20…
AlexStocks Oct 22, 2026
69fd6ee
test(migrations): exercise installed background workers after upgrade
AlexStocks Oct 22, 2026
c615a90
fix(migrations): allow worker takeover after Server upgrade
AlexStocks Oct 22, 2026
3c3e866
refactor(migrations): separate Source evidence feature from upgrade f…
Zxf-xufeng Oct 22, 2026
5b58308
merge: preserve upstream worker takeover fix after feature separation
Zxf-xufeng Oct 22, 2026
0ba95e9
merge: reconcile upgrade compatibility review with current master
AlexStocks Oct 22, 2026
1a1b159
test(server): initialize OceanBase acceptance storage explicitly
AlexStocks Oct 22, 2026
aa15b5f
test(server): prepare managed storage before fixture seeding
AlexStocks Oct 22, 2026
bc235ff
fix(storage): preserve canonical schema in legacy tag maintenance
AlexStocks Oct 22, 2026
110cecc
test(server): migrate legacy fixtures before normal admission
AlexStocks Oct 22, 2026
8c581a0
fix(migrations): register the offline Memory archive
AlexStocks Oct 22, 2026
f7a328c
fix(migrations): connect managed upgrades to local service maintenance
AlexStocks Oct 22, 2026
3ade379
fix(e2e): initialize managed OceanBase before Compose startup
AlexStocks Oct 22, 2026
9b7bd48
test(migrations): exercise managed upgrades with native services
AlexStocks Oct 22, 2026
0270f63
test(migrations): cover native full Server interruption recovery
AlexStocks Oct 22, 2026
752477f
fix(ci): retain bounded seekDB upgrade diagnostics
AlexStocks Oct 22, 2026
20f2c12
feat(migrations): coordinate managed Processing maintenance
AlexStocks Oct 22, 2026
0a1056f
chore(release): review managed Processing maintenance
AlexStocks Oct 22, 2026
70c73c1
fix(ci): retain installed Desktop fixture Server diagnostics
AlexStocks Oct 22, 2026
015026c
fix(migrations): delegate managed Atomic conversion to the Server chain
AlexStocks Oct 22, 2026
c0e585e
test(desktop): retain diagnostics for both isolated Server harnesses
AlexStocks Oct 22, 2026
3a62282
test(migrations): isolate native CLI capture from live SQL logging
AlexStocks Oct 22, 2026
cbad742
fix(migrations): coordinate managed Atomic projection repair
AlexStocks Oct 22, 2026
0a7a749
test(kimi): retain bounded Server startup failure evidence
AlexStocks Oct 22, 2026
1c24549
fix(migrations): prevent Topic bundle writes to managed storage
AlexStocks Oct 22, 2026
be53c1b
fix(server): avoid identity schema DDL on managed storage
AlexStocks Oct 22, 2026
f8c9487
docs(migrations): inventory startup and maintenance ownership
AlexStocks Oct 22, 2026
4fe1309
test(service): cover native upgrades from installed 1.3.0
AlexStocks Oct 22, 2026
66962ec
test(migrations): recover after an OceanBase client exits
AlexStocks Oct 22, 2026
d64d6b5
ci(migrations): budget the full native Server acceptance suite
AlexStocks Oct 22, 2026
793861b
test(service): retry installed upgrades after backup failure
AlexStocks Oct 22, 2026
3c99205
fix(migrations): preserve separate Code caches through Server upgrades
AlexStocks Oct 22, 2026
cb40660
test(upgrades): accept installed Code configuration and query status
AlexStocks Oct 22, 2026
f22862e
test(code): initialize Server storage before SDK fixture writes
AlexStocks Oct 22, 2026
9f20986
test(service): recover installed upgrades after switch and startup fa…
AlexStocks Oct 22, 2026
772ab5e
test(migrations): verify recovery after an OceanBase engine crash
AlexStocks Oct 22, 2026
017abf5
fix(ci): create the engine recovery evidence parent before pytest
AlexStocks Oct 22, 2026
5563b65
test(service): bind the Unix startup conflict after TIME_WAIT
AlexStocks Oct 22, 2026
35ed35c
feat(migrations): register the embedded seekDB Code schema
AlexStocks Oct 23, 2026
a60065b
test(migrations): exercise installed SQLite backup restoration
AlexStocks Oct 23, 2026
e645a24
fix(migrations): reflect native vector index definitions explicitly
AlexStocks Oct 23, 2026
5f769d6
feat(migrations): register exact Server vector profiles
AlexStocks Oct 23, 2026
a8643b8
test(upgrades): require installed vector profiles across backends
AlexStocks Oct 23, 2026
747dac3
fix(migrations): reject incomplete projections before admission
Zxf-xufeng Oct 23, 2026
3ad35d6
test(server): initialize managed authorization fixtures before startup
AlexStocks Oct 23, 2026
04a33ff
fix(runtime): validate managed SQLite without reserving the writer
AlexStocks Oct 23, 2026
23323a4
fix(migrations): pin SQLite startup validation snapshot
Zxf-xufeng Oct 23, 2026
1f6c89c
test(migrations): initialize long-query storage before event loop
Zxf-xufeng Oct 23, 2026
0b1d6f3
ci(oceanbase): budget isolated long-query acceptance (#2211)
AlexStocks Oct 23, 2026
8f10c56
fix(migrations): resolve review gaps after syncing master
Zxf-xufeng Oct 24, 2026
c3d642d
fix(migrations): register native portable receipt boolean
Zxf-xufeng Oct 24, 2026
135838e
fix(desktop): qualify current Server protocol
Zxf-xufeng Oct 24, 2026
d12e791
fix(ci): stabilize isolated migration validation
Zxf-xufeng Oct 24, 2026
9b457be
fix(migrations): guard background startup and upgrade cleanup
Zxf-xufeng Oct 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,8 @@ integrations/dsh/plugins/powercontext/lib/*.js text eol=lf
integrations/dsh/plugins/powercontext/lib/*.d.ts text eol=lf
# Generated guidance compares canonical bytes; keep user notes outside its markers untouched.
integrations/**/skills/powercontext-project-context/** text eol=lf
# Migration evidence hashes exact resource bytes on every platform.
src/powercontext/builtin/persistence/migrations/resources/** text eol=lf
src/powercontext/builtin/persistence/migrations/mysql_resources/** text eol=lf
src/powercontext/builtin/persistence/migrations/server_resources/** text eol=lf
src/powercontext/builtin/persistence/migration_resources/** text eol=lf
62 changes: 62 additions & 0 deletions .github/actions/setup-upgrade-oceanbase/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Setup upgrade OceanBase
description: Start the disposable MySQL tenant used by installed-release upgrade checks
runs:
using: composite
steps:
- name: Start and verify OceanBase
shell: bash
env:
OCEANBASE_IMAGE: ghcr.io/oceanbase/oceanbase-ce:4.3.5.6-106000012026040916
run: |
docker run --detach --name upgrade-oceanbase \
--publish 127.0.0.1:2881:2881 \
--ulimit nofile=65536:65536 \
--env MODE=slim \
--env OB_DATABASE=pc_upgrade_test \
--env OB_TENANT_PASSWORD=powercontext-e2e \
"$OCEANBASE_IMAGE"
for attempt in $(seq 1 120); do
if docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@test -ppowercontext-e2e \
-Dpc_upgrade_test -e 'SELECT 1' >/dev/null 2>&1; then
# The slim image's default 1 GB maximum is too small for the
# indexes created across the clean migration acceptance cases.
docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@sys \
-e "ALTER SYSTEM SET datafile_maxsize='8G'; ALTER SYSTEM SET datafile_next='512M'; ALTER SYSTEM SET datafile_size='4G';"
datafile_ready=false
for config_attempt in $(seq 1 30); do
docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@sys --batch --skip-column-names \
-e "SHOW PARAMETERS WHERE name IN ('datafile_size', 'datafile_maxsize', 'datafile_next');" \
> "$RUNNER_TEMP/upgrade-datafile.tsv"
if awk '
$5 == "datafile_size" && $7 == "4G" { size = 1 }
$5 == "datafile_maxsize" && $7 == "8G" { maximum = 1 }
$5 == "datafile_next" && $7 == "512M" { increment = 1 }
END { exit !(size && maximum && increment) }
' "$RUNNER_TEMP/upgrade-datafile.tsv"; then
datafile_ready=true
break
fi
sleep 2
done
cat "$RUNNER_TEMP/upgrade-datafile.tsv"
if [ "$datafile_ready" != true ]; then
echo 'OceanBase datafile configuration did not become effective within one minute.' >&2
exit 1
fi
docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@test -ppowercontext-e2e \
-Dpc_upgrade_test \
-e "CREATE DATABASE pc_upgrade_fresh; CREATE DATABASE pc_upgrade_code_test; CREATE DATABASE pc_upgrade_code_fresh; CREATE DATABASE pc_upgrade_vector_test; CREATE DATABASE pc_upgrade_vector_fresh; CREATE DATABASE pc_upgrade_vector_code_test; CREATE DATABASE pc_upgrade_vector_code_fresh; SET GLOBAL recyclebin=OFF; SELECT VERSION(); SHOW VARIABLES LIKE 'ob_compatibility_mode'; SHOW VARIABLES LIKE 'recyclebin';"
exit 0
fi
if [ "$(docker inspect --format '{{.State.Running}}' upgrade-oceanbase)" != true ]; then
echo 'OceanBase exited before becoming ready.' >&2
exit 1
fi
sleep 5
done
echo 'OceanBase did not become ready within 10 minutes.' >&2
exit 1
2 changes: 2 additions & 0 deletions .github/workflows/desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,15 @@ jobs:
desktop/.artifacts/windows-smoke.json
desktop/.artifacts/ci-compatibility.json
desktop/.artifacts/real-server.json
desktop/.artifacts/real-server-*/
desktop/.artifacts/real-cli.json
desktop/.artifacts/installed-ui.json
desktop/.artifacts/installed-ui.png
desktop/.artifacts/installed-ui-driver.log
desktop/.artifacts/installed-ui-app.log
desktop/.artifacts/installed-ui-processes.json
desktop/.artifacts/installed-ui-window.png
desktop/.artifacts/installed-ui-server-*/
# Early validation failures can leave no installer or acceptance evidence.
# Still reject missing artifacts when every preceding step succeeded.
if-no-files-found: ${{ job.status == 'success' && 'error' || 'warn' }}
Expand Down
47 changes: 44 additions & 3 deletions .github/workflows/e2e-harness.yml
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,46 @@ jobs:
tests/builtin/persistence/test_database_snapshots.py \
--junitxml=.powercontext/recall-effort-ci/regressions.xml -q -rs

- name: Recover and maintain the full Server chain on real OceanBase without skips
env:
POWERCONTEXT_TEST_MIGRATION_OCEANBASE_URL: >-
mysql+aoceanbase://root%40test:powercontext-e2e@127.0.0.1:2881/pc_migration_probe_server_recovery?charset=utf8mb4
run: |
docker exec recall-effort-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@test -ppowercontext-e2e \
-Dpowercontext_test -e 'CREATE DATABASE pc_migration_probe_server_recovery'
timeout --signal=TERM --kill-after=10s 600s uv run --locked pytest -q -rs \
tests/builtin/persistence/test_mysql_migration_runner.py::test_mysql_full_server_interruption_preserves_history_and_original_maintenance \
tests/builtin/persistence/test_mysql_migration_runner.py::test_oceanbase_full_server_client_exit_requires_acknowledgement_and_preserves_recovery \
-o faulthandler_timeout=180 --durations=10 \
-k oceanbase --junitxml=.powercontext/recall-effort-ci/full-server-recovery.xml

- name: Maintain the registered Server chain on real OceanBase without skips
env:
POWERCONTEXT_TEST_MIGRATION_OCEANBASE_URL: >-
mysql+aoceanbase://root%40test:powercontext-e2e@127.0.0.1:2881/pc_migration_probe_server_recovery?charset=utf8mb4
run: |
timeout --signal=TERM --kill-after=10s 600s uv run --locked pytest -q -rs \
tests/builtin/persistence/test_mysql_migration_runner.py::test_mysql_registered_processing_mode_switch_preserves_revision_and_history \
tests/builtin/persistence/test_mysql_migration_runner.py::test_mysql_atomic_compatibility_command_uses_shared_server_upgrade \
tests/builtin/persistence/test_mysql_migration_runner.py::test_mysql_registered_projection_repair_preserves_authority_and_revision \
tests/builtin/persistence/test_mysql_migration_runner.py::test_mysql_topic_bundle_refuses_managed_server_storage \
tests/builtin/persistence/test_mysql_migration_runner.py::test_mysql_managed_identity_initialization_requires_no_ddl \
-o faulthandler_timeout=180 --durations=10 \
-k oceanbase --junitxml=.powercontext/recall-effort-ci/full-server-maintenance.xml
uv run --locked python - <<'PY'
from pathlib import Path
from xml.etree import ElementTree

reports = (
Path(".powercontext/recall-effort-ci/full-server-recovery.xml"),
Path(".powercontext/recall-effort-ci/full-server-maintenance.xml"),
)
cases = [case for report in reports for case in ElementTree.parse(report).iter("testcase")]
if len(cases) != 10 or any(case.find(tag) is not None for case in cases for tag in ("skipped", "failure", "error")):
raise SystemExit("All ten native full Server recovery and maintenance scenarios must pass without skips.")
PY

- name: Collect the database log
if: always()
run: |
Expand Down Expand Up @@ -202,7 +242,7 @@ jobs:
${{ !cancelled() && (github.event_name != 'workflow_dispatch' || inputs.suite != 'recall-effort') &&
(needs.changes.result != 'success' || fromJSON(needs.changes.outputs.suites || '{}').database) }}
runs-on: ubuntu-latest
timeout-minutes: 70
timeout-minutes: 100
env:
OCEANBASE_IMAGE: ghcr.io/oceanbase/oceanbase-ce:4.3.5.6-106000012026040916
POWERCONTEXT_TEST_MIGRATION_OCEANBASE_URL: >-
Expand Down Expand Up @@ -290,13 +330,14 @@ jobs:
tests/e2e/test_background_metrics.py

- name: Run clean migration evidence, grants and vectors without skips
timeout-minutes: 45
timeout-minutes: 60
run: |
uv run --locked python scripts/run_atomic_memory_clean_migration.py \
oceanbase --output "$MIGRATION_REPORTS/clean-migration"

- name: Test long-query retrieval and admission without skips
timeout-minutes: 10
# Eight isolated cases include full Server setup and retain 180s deadlines.
timeout-minutes: 30
run: |
uv run --locked python scripts/run_atomic_memory_clean_migration.py \
oceanbase --output "$MIGRATION_REPORTS/long-query" --tests \
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/kimi-code-acceptance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ jobs:
reports.mkdir(exist_ok=True)
for evidence in (temporary / "kimi-acceptance").glob("*/evidence.json"):
shutil.copy2(evidence, reports / (evidence.parent.name + ".json"))
for evidence in (temporary / "kimi-acceptance").glob("*/server-startup.json"):
shutil.copy2(evidence, reports / (evidence.parent.name + "-server-startup.json"))
PY

- name: Upload controlled acceptance evidence
Expand Down
113 changes: 111 additions & 2 deletions .github/workflows/master.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,113 @@ jobs:
changes:
uses: ./.github/workflows/ci-changes.yml

upgrade-release-gate:
name: Upgrade release gate
runs-on: ubuntu-24.04
timeout-minutes: 180
env:
PC_UPGRADE_OCEANBASE_URL: mysql+aoceanbase://root%40test:powercontext-e2e@127.0.0.1:2881/pc_upgrade_test?charset=utf8mb4
PC_UPGRADE_OCEANBASE_FRESH_URL: mysql+aoceanbase://root%40test:powercontext-e2e@127.0.0.1:2881/pc_upgrade_fresh?charset=utf8mb4
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
fetch-depth: 0
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Verify upgrade policy and gate regressions
run: |
make upgrade-policy-check
uv run pytest -q tests/test_upgrade_release_gate.py tests/test_upgrade_publication.py
- name: Build the target artifact
run: uv build --out-dir dist
- name: Start the isolated upgrade OceanBase environment
uses: ./.github/actions/setup-upgrade-oceanbase

- name: Run declared installed-release acceptance
run: >-
uv run python scripts/run_upgrade_release_gate.py
--output "$RUNNER_TEMP/upgrade-release-evidence"
- name: Preserve OceanBase diagnostics
if: always()
run: |
mkdir -p "$RUNNER_TEMP/upgrade-release-evidence"
docker logs upgrade-oceanbase > "$RUNNER_TEMP/upgrade-release-evidence/oceanbase.log" 2>&1 || true
docker inspect --format '{{json .State}}' upgrade-oceanbase \
> "$RUNNER_TEMP/upgrade-release-evidence/oceanbase-state.json" 2>&1 || true
- name: Stop the isolated upgrade OceanBase environment
if: always()
run: docker rm --force upgrade-oceanbase
- name: Preserve upgrade acceptance evidence
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
with:
name: upgrade-release-evidence-${{ github.sha }}
path: ${{ runner.temp }}/upgrade-release-evidence/
if-no-files-found: error
retention-days: 30

oceanbase-engine-recovery:
name: OceanBase engine crash recovery
needs: changes
if: ${{ !cancelled() && (needs.changes.result != 'success' || fromJSON(needs.changes.outputs.suites || '{}').tests) }}
runs-on: ubuntu-24.04
timeout-minutes: 20
env:
POWERCONTEXT_TEST_MIGRATION_OCEANBASE_URL: mysql+aoceanbase://root%40test:powercontext-e2e@127.0.0.1:2881/pc_migration_probe_engine_crash?charset=utf8mb4
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Start an isolated OceanBase engine
uses: ./.github/actions/setup-upgrade-oceanbase
- name: Bind the destructive probe to this job's owned container
run: |
docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@test -ppowercontext-e2e \
-e 'CREATE DATABASE pc_migration_probe_engine_crash;'
container_id=$(docker inspect --format '{{.Id}}' upgrade-oceanbase)
[[ "$container_id" =~ ^[0-9a-f]{64}$ ]]
echo "POWERCONTEXT_TEST_MIGRATION_OCEANBASE_ENGINE_CRASH_ID=$container_id" >> "$GITHUB_ENV"
- name: Verify migration recovery after observer SIGKILL
run: |
mkdir -p "$RUNNER_TEMP/oceanbase-engine-recovery"
uv run pytest -q tests/native/test_oceanbase_engine_recovery.py \
--junitxml "$RUNNER_TEMP/oceanbase-engine-recovery/junit.xml" \
--basetemp "$RUNNER_TEMP/oceanbase-engine-recovery/cases"
uv run python - <<'PY'
import os
from pathlib import Path
from xml.etree import ElementTree
path = Path(os.environ["RUNNER_TEMP"]) / "oceanbase-engine-recovery/junit.xml"
suites = list(ElementTree.parse(path).getroot().iter("testsuite"))
assert sum(int(s.get("tests", 0)) for s in suites) == 1
assert all(int(s.get(key, 0)) == 0 for s in suites for key in ("failures", "errors", "skipped"))
PY
- name: Report recovery failures
if: failure()
run: >-
uv run python .github/scripts/report_pytest_failures.py
"$RUNNER_TEMP/oceanbase-engine-recovery/junit.xml"
- name: Preserve diagnostics and stop the owned engine
if: always()
run: |
mkdir -p "$RUNNER_TEMP/oceanbase-engine-recovery"
docker logs upgrade-oceanbase > "$RUNNER_TEMP/oceanbase-engine-recovery/container.log" 2>&1 || true
docker stop --timeout 30 upgrade-oceanbase || true
- name: Save engine recovery evidence
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
with:
name: oceanbase-engine-recovery-${{ github.sha }}
path: ${{ runner.temp }}/oceanbase-engine-recovery/
if-no-files-found: error
retention-days: 7

quality:
timeout-minutes: 20
runs-on: ubuntu-latest
Expand Down Expand Up @@ -277,7 +384,7 @@ jobs:
code-seekdb:
needs: changes
if: ${{ !cancelled() && (needs.changes.result != 'success' || fromJSON(needs.changes.outputs.suites || '{}').database) }}
timeout-minutes: 20
timeout-minutes: 30
runs-on: ubuntu-latest
strategy:
fail-fast: false
Expand All @@ -298,7 +405,9 @@ jobs:
run: make code-seekdb-test

- name: Test unified migrations with embedded seekdb
timeout-minutes: 10
# Full-Server cases run in separate processes and exceed fifteen minutes
# in aggregate; each runner keeps its 180-second deadline below.
timeout-minutes: 25
env:
POWERCONTEXT_TEST_MIGRATION_SEEKDB: "1"
POWERCONTEXT_TEST_MIGRATION_SQL_LOG: "1"
Expand Down
9 changes: 9 additions & 0 deletions .github/workflows/native-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ jobs:
wheel=$(find dist -name '*.whl' -print -quit)
uv venv .native-venv
uv pip install --python .native-venv/bin/python "powercontext[cli,server] @ file://$PWD/$wheel" pytest
uv venv .native-source-venv
uv pip install --python .native-source-venv/bin/python "powercontext[cli,server] @ https://files.pythonhosted.org/packages/30/bd/463f998f8794bc7f8ff588d47157ca0e62dd03a9f3ae466e2eb34fb66045/powercontext-1.3.0-py3-none-any.whl#sha256=8da7983763f3a6ab80b413c770a4973a46c557a54e1a1fa675099e58d47305e5"
echo "POWERCONTEXT_NATIVE_UPGRADE_SOURCE_PYTHON=$PWD/.native-source-venv/bin/python" >> "$GITHUB_ENV"

- name: Exercise the real systemd user lifecycle
run: >-
Expand Down Expand Up @@ -105,6 +108,9 @@ jobs:
# Finish bytecode compilation during installation, before launchd
# runs the cold-start lifecycle under its bounded startup deadline.
uv pip install --compile-bytecode --python .native-venv/bin/python "powercontext[cli,server] @ file://$PWD/$wheel" pytest
uv venv .native-source-venv
uv pip install --compile-bytecode --python .native-source-venv/bin/python "powercontext[cli,server] @ https://files.pythonhosted.org/packages/30/bd/463f998f8794bc7f8ff588d47157ca0e62dd03a9f3ae466e2eb34fb66045/powercontext-1.3.0-py3-none-any.whl#sha256=8da7983763f3a6ab80b413c770a4973a46c557a54e1a1fa675099e58d47305e5"
echo "POWERCONTEXT_NATIVE_UPGRADE_SOURCE_PYTHON=$PWD/.native-source-venv/bin/python" >> "$GITHUB_ENV"

- name: Exercise the real LaunchAgent lifecycle
run: >-
Expand Down Expand Up @@ -157,6 +163,9 @@ jobs:
$wheelUri = "file:///" + $wheel.Replace('\', '/')
uv venv .native-venv
uv pip install --python .native-venv\Scripts\python.exe "powercontext[cli,server] @ $wheelUri" pytest
uv venv .native-source-venv
uv pip install --python .native-source-venv\Scripts\python.exe "powercontext[cli,server] @ https://files.pythonhosted.org/packages/30/bd/463f998f8794bc7f8ff588d47157ca0e62dd03a9f3ae466e2eb34fb66045/powercontext-1.3.0-py3-none-any.whl#sha256=8da7983763f3a6ab80b413c770a4973a46c557a54e1a1fa675099e58d47305e5"
"POWERCONTEXT_NATIVE_UPGRADE_SOURCE_PYTHON=$PWD\.native-source-venv\Scripts\python.exe" >> $env:GITHUB_ENV

- name: Verify binary cursor persistence and restart compatibility
shell: pwsh
Expand Down
Loading
Loading