podman/libpod
Paul Holzinger 3cc9db8626
libpod: fix deadlock while parallel container create
When containers are created with a named volume it can deadlock because
the create logic tried to lock all volumes in a loop, this is fine if it
only ever creates a single container at any given time. However because
we multiple containers can be created at the same time they can cause a
deadlock between the volumes. This is because the order of the loop is
not stable, in fact it is based on the order of how the volumes were
specified on the cli.

So if you create two containers at the same time with
`-v vol1:/dir2 -v vol2:/dir2` and the other one with
`-v vol2:/dir2 -v vol1:/dir1` then there is chance for a deadlock.

Now one solution could be to order the volumes to prevent the issue but
the reason for holding the lock is dubious. The goal was to prevent the
volume from being removed in the meantime. However that could still
have happend before we acquired the lock so it didn't protect against
that.

Both boltdb and sqlite already prevent us from adding a container with
volumes that do not exists due their internal consistency checks.
Sqlite even uses FOREIGN KEY relationships so the schema will prevent us
from doing anything wrong.

The create code currently first checks if the volume exists and if not
creates it. I have checked that the db will guarantee that this will not
work:
Boltdb: `no volume with name test2 found in database when adding container xxx: no such volume`
Sqlite: `adding container volume test2 to database: FOREIGN KEY constraint failed`

Keep in mind that this error is normally not seen, only if the volume is
removed between the volume exists check and adding the container in the
db this messages will be seen wich is an acceptable race and a
pre-existing condition anyway.

[NO NEW TESTS NEEDED] Race condition, hard to test in CI.

Fixes #20313

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
2023-10-11 11:40:35 +02:00
..
define move IntelRdtClosID to HostConfig 2023-09-27 16:44:13 +00:00
driver bump go module to version 4 2022-01-18 12:47:07 +01:00
events Fix language, typos and markdown layout 2023-07-24 11:18:25 +02:00
layers Initial checkin from CRI-O repo 2017-11-01 11:24:59 -04:00
linkmode go fmt: use go 1.18 conditional-build syntax 2022-03-18 09:11:53 +01:00
lock Merge pull request #18507 from mheon/fix_rm_depends 2023-06-12 13:27:34 -04:00
logs file logger: fix podman logs --tail with partial lines 2023-08-09 14:48:01 +02:00
plugin bump golangci-lint to v1.49.0 2022-10-17 09:19:41 +02:00
shutdown play kube: Add --wait option 2023-02-28 13:45:36 -05:00
boltdb_state.go use sqlite as default database 2023-10-10 17:11:28 +02:00
boltdb_state_internal.go libpod: set cid network alias in setupContainer() 2023-07-11 15:16:11 +02:00
boltdb_state_unsupported.go libpod: Add definition of containerPlatformState for FreeBSD 2022-08-23 15:31:00 +01:00
common_test.go bump go module to version 4 2022-01-18 12:47:07 +01:00
container.go compat API: speed up network list 2023-09-20 13:08:42 +02:00
container_api.go podman: don't restart after kill 2023-09-07 15:18:02 +02:00
container_commit.go Specify format to buildah before commit 2023-04-20 06:24:35 -04:00
container_config.go make /dev & /dev/shm read/only when --read-only --read-only-tmpfs=false 2023-07-30 06:09:30 -04:00
container_copy_common.go libpod: Implement 'podman cp' for FreeBSD 2022-09-20 08:36:23 +01:00
container_copy_freebsd.go libpod: Implement 'podman cp' for FreeBSD 2022-09-20 08:36:23 +01:00
container_copy_linux.go libpod: Move jointMountAndExec to container_copy_linux.go 2022-09-20 08:36:23 +01:00
container_copy_unsupported.go libpod: Implement 'podman cp' for FreeBSD 2022-09-20 08:36:23 +01:00
container_exec.go Filter health_check and exec events for logging in console 2023-10-04 14:50:15 +01:00
container_freebsd.go libpod: move NetNS into state db instead of extra bucket 2022-12-16 18:30:12 +01:00
container_graph.go The removeContainer function now accepts a struct 2023-06-01 16:27:27 -04:00
container_graph_test.go bump go module to version 4 2022-01-18 12:47:07 +01:00
container_inspect.go move IntelRdtClosID to HostConfig 2023-09-27 16:44:13 +00:00
container_inspect_freebsd.go libpod: Factor out platform-specfic code from generateInspectContainerHostConfig 2022-09-15 08:10:34 +01:00
container_inspect_linux.go move IntelRdtClosID to HostConfig 2023-09-27 16:44:13 +00:00
container_internal.go container: always check if mountpoint is mounted 2023-10-09 17:20:22 +02:00
container_internal_common.go vendor: update checkpointctl to v1.1.0 2023-09-12 08:41:02 +01:00
container_internal_freebsd.go libpod: use /var/run instead of /run on FreeBSD 2023-08-17 14:04:53 +01:00
container_internal_linux.go libpod: use /var/run instead of /run on FreeBSD 2023-08-17 14:04:53 +01:00
container_internal_linux_test.go Fix a potential UID/GID collision in unit tests 2023-02-07 09:34:15 -05:00
container_internal_test.go bugfix: do not try to parse empty ranges 2023-07-06 11:16:34 +02:00
container_internal_unsupported.go libpod: Add FreeBSD implementation of container internals 2022-09-05 10:12:12 +01:00
container_linux.go libpod: move NetNS into state db instead of extra bucket 2022-12-16 18:30:12 +01:00
container_log.go file logger: fix podman logs --tail with partial lines 2023-08-09 14:48:01 +02:00
container_log_linux.go podman logs passthrough driver support --cgroups=split 2023-02-20 13:58:16 +01:00
container_log_unsupported.go podman logs passthrough driver support --cgroups=split 2023-02-20 13:58:16 +01:00
container_path_resolution.go Use constants for mount types 2023-07-14 07:17:21 -04:00
container_path_resolution_test.go libpod: fix lookup for subpath in volumes 2022-09-14 17:09:04 +02:00
container_stat_common.go Fix typos. Improve language. 2023-02-09 21:56:27 +01:00
container_stat_freebsd.go libpod: Implement 'podman cp' for FreeBSD 2022-09-20 08:36:23 +01:00
container_stat_linux.go libpod: Move part of (*Container).stat to container_stat_linux.go 2022-09-20 08:36:23 +01:00
container_stat_unsupported.go libpod: Implement 'podman cp' for FreeBSD 2022-09-20 08:36:23 +01:00
container_top_freebsd.go libpod: add 'pod top' support on FreeBSD 2023-07-28 10:52:20 +01:00
container_top_linux.c Run codespell on code 2023-09-14 06:13:23 -04:00
container_top_linux.go fix podman top missing output flake 2023-08-11 13:43:23 +02:00
container_top_unsupported.go top: do not depend on ps(1) in container 2023-07-10 13:32:55 +02:00
container_unsupported.go libpod: Add definition of containerPlatformState for FreeBSD 2022-08-23 15:31:00 +01:00
container_validate.go libpod: remove CNI word were no longer applicable 2022-12-16 14:20:14 +01:00
diff.go libpod: switch to golang native error wrapping 2022-07-05 16:06:32 +02:00
doc.go document that using libpod package directly is not supported 2022-03-23 19:05:29 +01:00
events.go container create: add inspect data to event 2022-11-29 10:40:24 +01:00
healthcheck.go Ensure HC events fire after logs are written 2023-09-11 08:02:46 -04:00
healthcheck_linux.go Filter health_check and exec events for logging in console 2023-10-04 14:50:15 +01:00
healthcheck_nosystemd_linux.go disable healthchecks automatically on non systemd systems 2022-12-05 20:58:30 +01:00
healthcheck_unsupported.go libpod: don't generate errors for createTimer etc. 2023-07-25 15:30:28 +01:00
info.go vendor of containers/common 2023-09-20 08:39:49 -04:00
info_freebsd.go Fix stutters 2022-09-10 07:52:00 -04:00
info_linux.go vendor of containers/common 2023-09-20 08:39:49 -04:00
info_test.go libpod: Make unit test for statToPercent Linux only 2022-11-13 10:56:15 +00:00
info_unsupported.go libpod: Enable 'podman info' for FreeBSD 2022-08-24 10:55:52 +01:00
kube.go kube: add DaemonSet support for generate 2023-09-12 10:30:57 +05:30
mounts_linux.go go fmt: use go 1.18 conditional-build syntax 2022-03-18 09:11:53 +01:00
networking_common.go inspect with network=none show SandboxKey netns path 2023-07-31 17:40:41 +02:00
networking_freebsd.go libpod: sum per-interface network stats for FreeBSD 2023-08-21 16:00:41 +01:00
networking_linux.go Run codespell on code 2023-09-14 06:13:23 -04:00
networking_linux_test.go enable unparam linter 2022-04-25 13:23:20 +02:00
networking_machine.go Replace deprecated ioutil 2022-09-20 15:34:27 -04:00
networking_pasta_linux.go pasta: use code from c/common 2023-06-15 16:14:49 +02:00
networking_slirp4netns.go use libnetwork/slirp4netns from c/common 2023-06-22 11:16:13 +02:00
networking_unsupported.go Fix language, typos and markdown layout 2023-07-24 11:18:25 +02:00
oci.go bump golangci-lint to v1.49.0 2022-10-17 09:19:41 +02:00
oci_conmon.go podman: add new cgroup mode split 2020-06-25 17:16:12 +02:00
oci_conmon_attach_common.go vendor of containers/common 2023-09-20 08:39:49 -04:00
oci_conmon_attach_freebsd.go libpod: Build oci_conmon_common.go and oci_conmon_attach_common on FreeBSD 2022-08-18 08:07:30 +01:00
oci_conmon_attach_linux.go libpod: Move openUnixSocket to oci_conmon_attach_linux.go 2022-08-18 08:05:42 +01:00
oci_conmon_common.go libpod: pass entire environment to conmon 2023-09-26 16:48:52 +02:00
oci_conmon_exec_common.go libpod: pass entire environment to conmon 2023-09-26 16:48:52 +02:00
oci_conmon_exec_freebsd.go libpod: Factor out capabilites code from prepareProcessExec 2022-09-07 07:58:37 +01:00
oci_conmon_exec_linux.go libpod: Factor out capabilites code from prepareProcessExec 2022-09-07 07:58:37 +01:00
oci_conmon_freebsd.go libpod: Make sure writeConmonPipeData is called on FreeBSD 2022-08-29 13:04:04 +01:00
oci_conmon_linux.go libpod: improve conmon error handling 2023-08-17 15:32:59 +02:00
oci_conmon_unsupported.go libpod: Build oci_conmon_common.go and oci_conmon_attach_common on FreeBSD 2022-08-18 08:07:30 +01:00
oci_missing.go implement podman update 2022-09-01 13:02:01 -04:00
oci_util.go libpod: switch to golang native error wrapping 2022-07-05 16:06:32 +02:00
options.go fix handling of static/volume dir 2023-09-25 14:14:30 +02:00
pod.go libpod: allow cgroup path without infra container 2023-09-08 14:58:48 +02:00
pod_api.go libpod: destroy pod cgroup on pod stop 2023-09-08 14:58:48 +02:00
pod_internal.go Add initial SQLite-backed state implementation 2023-02-22 11:00:50 -05:00
pod_internal_freebsd.go libpod: Factor out cgroups handling from (*Pod).refresh 2022-10-07 08:26:10 +01:00
pod_internal_linux.go Fix: cgroup is not set: internal libpod error after os reboot 2023-07-10 22:37:43 +02:00
pod_status.go bump go module to version 4 2022-01-18 12:47:07 +01:00
pod_top_freebsd.go libpod: add 'pod top' support on FreeBSD 2023-07-28 10:52:20 +01:00
pod_top_linux.go libpod/pod_top_linux.go: s/TODO/NOTE/ 2022-05-25 12:30:19 +02:00
pod_top_unsupported.go libpod: add 'pod top' support on FreeBSD 2023-07-28 10:52:20 +01:00
reset.go Pods now return what containers were removed with them 2023-06-01 16:24:59 -04:00
rlimit_int64.go set max ulimits for rootless on each start 2023-05-31 09:20:31 +00:00
rlimit_uint64.go set max ulimits for rootless on each start 2023-05-31 09:20:31 +00:00
runtime.go use sqlite as default database 2023-10-10 17:11:28 +02:00
runtime_cstorage.go Add support for 'image' volume driver 2022-09-22 13:07:40 -04:00
runtime_ctr.go libpod: fix deadlock while parallel container create 2023-10-11 11:40:35 +02:00
runtime_ctr_freebsd.go libpod: Don't mount /dev/shm in containers on FreeBSD 2022-09-05 10:20:50 +01:00
runtime_ctr_linux.go libpod: Don't mount /dev/shm in containers on FreeBSD 2022-09-05 10:20:50 +01:00
runtime_img.go The removeContainer function now accepts a struct 2023-06-01 16:27:27 -04:00
runtime_migrate.go rootless: make sure we only use a single pause process 2023-04-11 10:57:46 +02:00
runtime_migrate_unsupported.go libpod: Add stubs for non-linux builds 2022-08-17 11:45:07 +01:00
runtime_pod.go Pods now return what containers were removed with them 2023-06-01 16:24:59 -04:00
runtime_pod_common.go pod rm: do not log error if anonymous volume is still used 2023-09-22 14:44:14 +02:00
runtime_pod_freebsd.go libpod: refactor platformMakePod signature 2023-09-08 14:58:48 +02:00
runtime_pod_linux.go libpod: refactor platformMakePod signature 2023-09-08 14:58:48 +02:00
runtime_pod_unsupported.go libpod: Add support for 'podman pod' on FreeBSD 2022-10-07 08:27:27 +01:00
runtime_pre_go1.20.go Fix rand.Seed() deprecation in golang 1.20 2023-04-26 14:55:03 -04:00
runtime_renumber.go DB: make loading container states optional 2023-01-26 10:20:38 +01:00
runtime_test.go Fix rand.Seed() deprecation in golang 1.20 2023-04-26 14:55:03 -04:00
runtime_volume.go libpod/runtime: switch to golang native error wrapping 2022-07-04 15:39:00 +02:00
runtime_volume_common.go Volume create - fast exit when ignore is set and volume exists 2023-10-01 16:54:24 +03:00
runtime_volume_unsupported.go libpod: Add volume support for FreeBSD 2022-09-27 16:31:40 +01:00
runtime_worker.go work queue: simplify and use a wait group 2022-05-25 10:17:46 +02:00
service.go kube play: exit-code propagation 2023-05-25 14:46:34 +02:00
sqlite_state.go use sqlite as default database 2023-10-10 17:11:28 +02:00
sqlite_state_internal.go libpod: set cid network alias in setupContainer() 2023-07-11 15:16:11 +02:00
state.go Add initial SQLite-backed state implementation 2023-02-22 11:00:50 -05:00
state_test.go Remove concept of Namespaces from BoltDB 2023-02-22 11:00:50 -05:00
stats_common.go Fix: display online_cpus in compat REST API 2023-05-31 07:41:30 +03:00
stats_freebsd.go libpod: add 'pod top' support on FreeBSD 2023-07-28 10:52:20 +01:00
stats_linux.go Fix: display online_cpus in compat REST API 2023-05-31 07:41:30 +03:00
stats_unsupported.go libpod: Add support for 'podman stats' on FreeBSD 2022-09-14 08:29:26 +01:00
storage.go libpod.storageService.CreateContainerStorage(): retrieve ID maps 2023-04-05 17:58:30 -04:00
util.go API attach: return vnd.docker.multiplexed-stream header 2023-08-24 16:22:28 +02:00
util_freebsd.go Must use mountlabel when creating builtin volumes 2023-03-09 12:36:52 -05:00
util_linux.go libpod: check if cgroup exists before creating it 2023-09-08 14:58:48 +02:00
util_linux_test.go Must use mountlabel when creating builtin volumes 2023-03-09 12:36:52 -05:00
util_test.go bump go module to version 4 2022-01-18 12:47:07 +01:00
util_unsupported.go Must use mountlabel when creating builtin volumes 2023-03-09 12:36:52 -05:00
volume.go libpod/Container.rootFsSize(): use recorded image sizes 2023-05-09 09:33:37 -04:00
volume_inspect.go Include lock number in pod/container/volume inspect 2023-06-05 12:28:50 -04:00
volume_internal.go Add initial SQLite-backed state implementation 2023-02-22 11:00:50 -05:00
volume_internal_common.go Use constants for mount types 2023-07-14 07:17:21 -04:00
volume_internal_freebsd.go libpod: Add volume support for FreeBSD 2022-09-27 16:31:40 +01:00
volume_internal_linux.go libpod: Factor out usage of unix.MNT_DETACH from (*Volume).unmount 2022-09-27 16:31:40 +01:00
volume_internal_unsupported.go libpod: Add volume support for FreeBSD 2022-09-27 16:31:40 +01:00