mirror of
https://github.com/containers/podman.git
synced 2025-10-20 12:43:58 +08:00
registry: lock start attempts
When running parallel, multiple tests could be trying to start the registry at once. Make this parallel-safe. Also, use a safer port range for the registry. Something outside of /proc/sys/net/ipv4/ip_local_port_range Sorry, I'm including a FIXME section that I haven't investigated deeply enough. Signed-off-by: Ed Santiago <santiago@redhat.com>
This commit is contained in:
@ -17,8 +17,26 @@ unset REGISTRY_AUTH_FILE
|
|||||||
# Start a local registry. Only needed on demand (e.g. by 150-login.bats)
|
# Start a local registry. Only needed on demand (e.g. by 150-login.bats)
|
||||||
# and then only once: if we start, leave it running until final teardown.
|
# and then only once: if we start, leave it running until final teardown.
|
||||||
function start_registry() {
|
function start_registry() {
|
||||||
if [[ -d "$PODMAN_LOGIN_WORKDIR/auth" ]]; then
|
AUTHDIR=${PODMAN_LOGIN_WORKDIR}/auth
|
||||||
# Already started
|
|
||||||
|
local startflag=${PODMAN_LOGIN_WORKDIR}/OK
|
||||||
|
|
||||||
|
if ! mkdir $AUTHDIR; then
|
||||||
|
# *Possibly* already started. Or, possibly (when running
|
||||||
|
# parallel tests) another process is trying to start it.
|
||||||
|
# Give it some time.
|
||||||
|
local timeout=30
|
||||||
|
while [[ $timeout -gt 0 ]]; do
|
||||||
|
if [[ -e $startflag ]]; then
|
||||||
|
echo "Registry has already been started by another process"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
timeout=$((timeout - 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
die "Internal error: timed out waiting for another process to start registry"
|
||||||
|
|
||||||
# Fixes very obscure corner case in root system tests:
|
# Fixes very obscure corner case in root system tests:
|
||||||
# 1) we run 150-login tests, starting a registry; then
|
# 1) we run 150-login tests, starting a registry; then
|
||||||
@ -26,11 +44,15 @@ function start_registry() {
|
|||||||
# 3) run 700-play, the "private" test, which needs the
|
# 3) run 700-play, the "private" test, which needs the
|
||||||
# already-started registry, but its port is now DROPped,
|
# already-started registry, but its port is now DROPped,
|
||||||
# so the test times out trying to talk to registry
|
# so the test times out trying to talk to registry
|
||||||
run_podman --storage-driver vfs $(podman_isolation_opts ${PODMAN_LOGIN_WORKDIR}) network reload --all
|
|
||||||
|
###### FIXME FIXME FIXME TEMPORARY!
|
||||||
|
###### Trying to understand flake #23725. What happens if we stop
|
||||||
|
###### doing the network reload?
|
||||||
|
###### FIXME FIXME FIXME, should we do it in stop_registry??
|
||||||
|
###### run_podman --storage-driver vfs $(podman_isolation_opts ${PODMAN_LOGIN_WORKDIR}) network reload --all
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AUTHDIR=${PODMAN_LOGIN_WORKDIR}/auth
|
|
||||||
mkdir -p $AUTHDIR
|
mkdir -p $AUTHDIR
|
||||||
|
|
||||||
# Registry image; copy of docker.io, but on our own registry
|
# Registry image; copy of docker.io, but on our own registry
|
||||||
@ -79,6 +101,9 @@ function start_registry() {
|
|||||||
wait_for_port 127.0.0.1 ${PODMAN_LOGIN_REGISTRY_PORT}
|
wait_for_port 127.0.0.1 ${PODMAN_LOGIN_REGISTRY_PORT}
|
||||||
# ...so we look in container logs for confirmation that registry is running.
|
# ...so we look in container logs for confirmation that registry is running.
|
||||||
_PODMAN_TEST_OPTS="${PODMAN_LOGIN_ARGS}" wait_for_output "listening on .::.:5000" $cid
|
_PODMAN_TEST_OPTS="${PODMAN_LOGIN_ARGS}" wait_for_output "listening on .::.:5000" $cid
|
||||||
|
|
||||||
|
touch $startflag
|
||||||
|
echo "I have started the registry"
|
||||||
}
|
}
|
||||||
|
|
||||||
function stop_registry() {
|
function stop_registry() {
|
||||||
@ -103,10 +128,10 @@ function stop_registry() {
|
|||||||
mount | grep ${PODMAN_LOGIN_WORKDIR} | awk '{print $3}' | xargs --no-run-if-empty umount
|
mount | grep ${PODMAN_LOGIN_WORKDIR} | awk '{print $3}' | xargs --no-run-if-empty umount
|
||||||
|
|
||||||
if [[ $(id -u) -eq 0 ]]; then
|
if [[ $(id -u) -eq 0 ]]; then
|
||||||
rm -rf ${PODMAN_LOGIN_WORKDIR}
|
rm -rf ${PODMAN_LOGIN_WORKDIR}/*
|
||||||
else
|
else
|
||||||
# rootless image data is owned by a subuid
|
# rootless image data is owned by a subuid
|
||||||
run_podman unshare rm -rf ${PODMAN_LOGIN_WORKDIR}
|
run_podman unshare rm -rf ${PODMAN_LOGIN_WORKDIR}/*
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -119,7 +144,7 @@ function stop_registry() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo "lsof -i -P"
|
echo "lsof -i -P"
|
||||||
lsof -i -P
|
lsof -i -P
|
||||||
die "Socket still seems open"
|
die "Socket $PODMAN_LOGIN_REGISTRY_PORT still seems open"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ function setup_suite() {
|
|||||||
|
|
||||||
# FIXME: racy! It could be many minutes between now and when we start it.
|
# FIXME: racy! It could be many minutes between now and when we start it.
|
||||||
# To mitigate, we use a range not used anywhere else in system tests.
|
# To mitigate, we use a range not used anywhere else in system tests.
|
||||||
export PODMAN_LOGIN_REGISTRY_PORT=$(random_free_port 42000-42999)
|
export PODMAN_LOGIN_REGISTRY_PORT=$(random_free_port 27000-27999)
|
||||||
|
|
||||||
# The above does not handle errors. Do a final confirmation.
|
# The above does not handle errors. Do a final confirmation.
|
||||||
assert "$PODMAN_LOGIN_REGISTRY_PORT" != "" \
|
assert "$PODMAN_LOGIN_REGISTRY_PORT" != "" \
|
||||||
|
Reference in New Issue
Block a user