From eb04804d366466e89293873ba1ca4983b1dba436 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Mon, 3 Aug 2026 19:18:01 +0200 Subject: [PATCH] Handle Redis under arm64 CI emulation --- docs/INSTALLATION_AND_DEPLOYMENT_ARCHITECTURE.md | 4 ++++ tests/test_runtime_image_smoke.py | 2 ++ tools/checks/runtime-image-smoke.py | 11 ++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/INSTALLATION_AND_DEPLOYMENT_ARCHITECTURE.md b/docs/INSTALLATION_AND_DEPLOYMENT_ARCHITECTURE.md index 2a87425..f4e1420 100644 --- a/docs/INSTALLATION_AND_DEPLOYMENT_ARCHITECTURE.md +++ b/docs/INSTALLATION_AND_DEPLOYMENT_ARCHITECTURE.md @@ -164,6 +164,10 @@ The CI host registers arm64 execution with an explicitly supplied, digest-pinned `tonistiigi/binfmt` image immediately before the smoke. This privileged helper is confined to the release runner and is never part of a GovOPlaN target deployment or its runtime image set. +Because QEMU user-mode execution triggers Redis's arm64 host-kernel COW guard, +the arm64 smoke suppresses only `ARM64-COW-BUG` while persistence, snapshots, +and append-only files are disabled. Target Redis services never inherit this +test-only option. The smoke also proves a bounded post-migration table contract and aborts as soon as a required container exits, rather than allowing a dead process to consume the full readiness timeout. diff --git a/tests/test_runtime_image_smoke.py b/tests/test_runtime_image_smoke.py index 73a7978..92d6180 100644 --- a/tests/test_runtime_image_smoke.py +++ b/tests/test_runtime_image_smoke.py @@ -78,6 +78,8 @@ class RuntimeImageSmokeTests(unittest.TestCase): self.assertIn('"--network-alias",\n "load-balancer"', source) self.assertIn("'core_system_settings'", source) self.assertIn("'core_runtime_nodes'", source) + self.assertIn('if platform == "linux/arm64"', source) + self.assertIn('"ARM64-COW-BUG"', source) if __name__ == "__main__": diff --git a/tools/checks/runtime-image-smoke.py b/tools/checks/runtime-image-smoke.py index cb0831e..2c04449 100644 --- a/tools/checks/runtime-image-smoke.py +++ b/tools/checks/runtime-image-smoke.py @@ -259,6 +259,11 @@ def run_smoke( "--mount", f"type=volume,source={names['volume']},target=/var/lib/govoplan", ] + redis_command = ["redis-server", "--save", "", "--appendonly", "no"] + if platform == "linux/arm64": + # QEMU user-mode execution triggers Redis's host-kernel COW guard even + # though this isolated smoke disables every persistence mechanism. + redis_command.extend(("--ignore-warnings", "ARM64-COW-BUG")) try: _run(("docker", "network", "create", names["network"]), timeout=timeout) @@ -308,11 +313,7 @@ def run_smoke( "--tmpfs", "/data:rw,noexec,nosuid,size=64m", redis_image, - "redis-server", - "--save", - "", - "--appendonly", - "no", + *redis_command, ), timeout=timeout, )