spiegel_podman/libpod
Radostin Stoyanov 1c8acc1893 Freeze cgroup during live checkpoint
When checkpointing a container with --leave-running, libpod dumps the
container's memory via the OCI runtime (CRIU) first and only captures
the rootfs diff and named volumes afterwards. CRIU thaws the container
as soon as the memory dump finishes, so the processes inside the
container continue to run between the memory snapshot and the
file-system capture. As a result, the checkpoint can be inconsistent:
have CRIU images and a file system that reflect different points in time.

To fix this, we freeze the container's cgroup before invoking the OCI
runtime and thaw it again only after the checkpoint image/archive has
been written. The OCI runtime calls CRIU with the freezer cgroup and
restores it to its previous state once the dump completes, so a
container that was already frozen stays frozen across the dump and
the file system is captured at the same instant as the CRIU images.
This mirrors the approach other engines (e.g. CRI-O and containerd).

The default (stopping) checkpoint functionality is not affected by this
issue because CRIU leaves the tasks dead after the dump.

This patch also adds a regression test for the consistency of live
(--leave-running) checkpoints. The container runs a workload that
keeps an in-memory counter in sync with a value written to a file
on its root file system, maintaining the invariant that the on-disk
value never gets ahead of the in-memory counter.

Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
(cherry picked from commit 2c7aeab70b)
2026-06-23 15:05:44 +00:00
..
define info: report configured and discovered CDI devices 2026-06-01 21:45:41 +02:00
driver RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
events Merge pull request #28879 from jiwahn/fix-event-attributes-labels 2026-06-11 10:27:38 +02:00
layers Switch common, storage and image to monorepo. 2025-09-01 12:33:04 +02:00
linkmode chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
lock Replace os.Is* error checks with errors.Is 2026-05-21 13:09:42 -07:00
logs RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
namesgenerator libpod: include names-generator.go 2026-03-09 16:08:43 +01:00
plugin Replace os.Is* error checks with errors.Is 2026-05-21 13:09:42 -07:00
shutdown enable gofumpt formatter 2025-11-11 12:32:46 +01:00
boltdb_state.go Re-add a minimal version of BoltDB for migrations 2026-05-05 15:42:04 -04:00
boltdb_state_internal.go Re-add a minimal version of BoltDB for migrations 2026-05-05 15:42:04 -04:00
common_test.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container.go Merge pull request #28753 from kolyshkin/os-is 2026-05-22 05:18:45 -04:00
container_api.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_commit.go cmd, commit: register shutdown handler to unpause container 2026-06-03 07:28:22 +02:00
container_config.go Merge pull request #28567 from Honny1/small-fix 2026-04-23 06:03:47 +02:00
container_copy_common.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_copy_freebsd.go Mount volumes before copying into a container 2024-11-27 08:09:50 -05:00
container_copy_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_exec.go Replace os.Is* error checks with errors.Is 2026-05-21 13:09:42 -07:00
container_freebsd.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
container_graph.go Add migration code for BoltDB to SQLite 2026-05-08 14:07:17 -04:00
container_graph_test.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_healthcheck_test.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:36 +01:00
container_inspect.go Some improvements for libpod. 2026-06-02 19:02:38 +08:00
container_inspect_freebsd.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_inspect_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_internal.go bump selinux to v1.15.1, use SetProcessKind 2026-06-02 11:18:34 -07:00
container_internal_common.go Freeze cgroup during live checkpoint 2026-06-23 15:05:44 +00:00
container_internal_freebsd.go Replace os.Is* error checks with errors.Is 2026-05-21 13:09:42 -07:00
container_internal_linux.go Use MNT_DETACH for SHM unmount instead of retry loop 2026-06-09 14:57:27 +02:00
container_internal_linux_test.go libpod: limit splitting of cgroup fields 2026-04-30 09:52:08 -07:00
container_internal_test.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:53 +01:00
container_linux.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
container_log.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_log_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_log_unsupported.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_path_resolution.go chore: fix some function names in comment 2026-06-07 11:29:49 +08:00
container_path_resolution_test.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:36 +01:00
container_secrets_test.go run modernize -fix ./... 2026-03-12 17:22:01 +01:00
container_stat_common.go Replace os.Is* error checks with errors.Is 2026-05-21 13:09:42 -07:00
container_stat_freebsd.go RUN-4538: Fix buildah vendoring 2026-04-21 14:27:58 -05:00
container_stat_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_top_freebsd.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_top_linux.c libpod/container_top_linux.c: fix missing header 2024-06-27 10:50:17 +02:00
container_top_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
container_top_unsupported.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:53 +01:00
container_validate.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
diff.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
doc.go document that using libpod package directly is not supported 2022-03-23 19:05:29 +01:00
events.go Merge pull request #28879 from jiwahn/fix-event-attributes-labels 2026-06-11 10:27:38 +02:00
healthcheck.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
healthcheck_config.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
healthcheck_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
healthcheck_nosystemd_linux.go lint: reenable revive unused-parameter check 2025-10-01 10:42:08 -04:00
healthcheck_unsupported.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:53 +01:00
info.go info: report configured and discovered CDI devices 2026-06-01 21:45:41 +02:00
info_freebsd.go libpod: some modernize fixes for freebsd and darwin 2026-05-22 14:15:49 -07:00
info_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
info_test.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
kube.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
mounts_linux.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
networking_common.go Add pasta-based port forwarding for rootless bridge networks 2026-05-20 14:24:47 +02:00
networking_freebsd.go Add pasta-based port forwarding for rootless bridge networks 2026-05-20 14:24:47 +02:00
networking_linux.go Add pasta-based port forwarding for rootless bridge networks 2026-05-20 14:24:47 +02:00
networking_linux_test.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
networking_machine.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:36 +01:00
networking_pasta_linux.go Switch common, storage and image to monorepo. 2025-09-01 12:33:04 +02:00
networking_pesto_linux.go Add pasta-based port forwarding for rootless bridge networks 2026-05-20 14:24:47 +02:00
networking_rootlessport.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
oci.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
oci_conmon.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:36 +01:00
oci_conmon_attach_common.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
oci_conmon_attach_freebsd.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
oci_conmon_attach_linux.go add missing O_CLOEXEC to open calls 2026-04-02 15:06:37 +02:00
oci_conmon_common.go Improvements for newConmonOCIRuntime() in libpod/oci_conmon_common.go 2026-05-28 10:28:05 +08:00
oci_conmon_exec_common.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
oci_conmon_exec_freebsd.go lint: reenable revive unused-parameter check 2025-10-01 10:42:08 -04:00
oci_conmon_exec_linux.go Switch common, storage and image to monorepo. 2025-09-01 12:33:04 +02:00
oci_conmon_freebsd.go lint: reenable revive unused-parameter check 2025-10-01 10:42:08 -04:00
oci_conmon_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
oci_missing.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
oci_util.go libpod: replace listen with socket+bind for dual-stack port reservation 2026-05-11 13:21:12 +05:30
options.go Add migration code for BoltDB to SQLite 2026-05-08 14:07:17 -04:00
pod.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
pod_api.go Some improvements for libpod. 2026-06-02 19:02:38 +08:00
pod_internal.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
pod_internal_freebsd.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
pod_internal_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
pod_status.go Some improvements for libpod. 2026-06-02 19:02:38 +08:00
pod_status_test.go Some improvements for libpod. 2026-06-02 19:02:38 +08:00
pod_top_freebsd.go libpod: some modernize fixes for freebsd and darwin 2026-05-22 14:15:49 -07:00
pod_top_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
reset.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
rlimit_int64.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
rlimit_uint64.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
runtime.go events: support artifact events with refactored event forwarding 2026-05-18 00:05:10 +00:00
runtime_cstorage.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_ctr.go Some improvements for libpod. 2026-06-02 19:02:38 +08:00
runtime_ctr_freebsd.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
runtime_ctr_linux.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
runtime_freebsd.go lint: reenable revive unused-parameter check 2025-10-01 10:42:08 -04:00
runtime_img.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_migrate.go Add migration code for BoltDB to SQLite 2026-05-08 14:07:17 -04:00
runtime_migrate_freebsd.go libpod: fix a confusing error message from 'podman system reset' on FreeBSD 2025-02-11 15:13:29 +00:00
runtime_migrate_linux.go Replace os.Is* error checks with errors.Is 2026-05-21 13:09:42 -07:00
runtime_pod.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_pod_common.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_pod_freebsd.go lint: reenable revive unused-parameter check 2025-10-01 10:42:08 -04:00
runtime_pod_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_pre_go1.20.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
runtime_renumber.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_test.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:36 +01:00
runtime_volume.go volume prune: add dry-run support 2026-05-16 19:03:34 +09:00
runtime_volume_common.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
runtime_worker.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:36 +01:00
service.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
sqlite_state.go Add migration code for BoltDB to SQLite 2026-05-08 14:07:17 -04:00
sqlite_state_internal.go Add migration code for BoltDB to SQLite 2026-05-08 14:07:17 -04:00
state.go Move to deterministic network setup order 2026-04-17 10:00:32 -04:00
state_test.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
stats_common.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
stats_freebsd.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
stats_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
storage.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
util.go Replace os.Is* error checks with errors.Is 2026-05-21 13:09:42 -07:00
util_freebsd.go lint: reenable revive unused-parameter check 2025-10-01 10:42:08 -04:00
util_linux.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
util_linux_test.go lint: reenable revive unused-parameter check 2025-10-01 10:42:08 -04:00
util_test.go Make most of libpod, and everything that relies on it, non-darwin 2026-02-27 22:18:36 +01:00
volume.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
volume_inspect.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
volume_internal.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
volume_internal_common.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00
volume_internal_freebsd.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
volume_internal_linux.go chore: delete obsolete // +build lines 2024-01-04 11:53:38 +02:00
volume_test.go RUN-4539: Change podman module paths 2026-04-22 14:02:25 -05:00