Add flock-based locking to prevent concurrent service operations
All checks were successful
Build-Test-Publish / build (linux/amd64) (push) Successful in 27s
Build-Test-Publish / build (linux/arm64) (push) Successful in 1m1s

This commit is contained in:
j
2026-03-29 16:22:00 +13:00
parent dafc0529f0
commit 10c043878f
3 changed files with 19 additions and 0 deletions

View File

@@ -180,5 +180,17 @@ _root_remove_tree() {
docker run --rm -v "$abs_parent":/data alpine rm -rf "/data/$child" docker run --rm -v "$abs_parent":/data alpine rm -rf "/data/$child"
} }
# Acquires an exclusive lock on a service directory to prevent concurrent operations.
# Uses flock() which is automatically released when the process exits (even on crash/SIGKILL).
_lock_service() {
local service_dir="$1"
local lockfile="${service_dir}/.deploy.lock"
mkdir -p "${service_dir}"
exec 200>"${lockfile}"
if ! flock -n 200; then
_die "Another operation is already running on this service. Aborting."
fi
}
# Load autocommands # Load autocommands
source "${AGENT_PATH}/datacommands_v2.sh" source "${AGENT_PATH}/datacommands_v2.sh"

View File

@@ -45,6 +45,10 @@ export TEMP_DIR="${2:-}"
export DOCKER_CLI_HINTS=false export DOCKER_CLI_HINTS=false
SERVICE_DIR="${DROPSHELL_DIR}/services/${SERVICE}" SERVICE_DIR="${DROPSHELL_DIR}/services/${SERVICE}"
# -- Acquire exclusive lock (released automatically on exit) --
_lock_service "${SERVICE_DIR}"
LIVE_CONFIG="${SERVICE_DIR}/config" LIVE_CONFIG="${SERVICE_DIR}/config"
LIVE_TEMPLATE="${SERVICE_DIR}/template" LIVE_TEMPLATE="${SERVICE_DIR}/template"
STAGING_DIR="${SERVICE_DIR}/_staging" STAGING_DIR="${SERVICE_DIR}/_staging"

View File

@@ -77,6 +77,9 @@ export TEMPLATE_PATH="${DROPSHELL_DIR}/services/${SERVICE}/template"
[[ -f "${DROPSHELL_DIR}/server_info.env" ]] || _die "Missing ${DROPSHELL_DIR}/server_info.env" [[ -f "${DROPSHELL_DIR}/server_info.env" ]] || _die "Missing ${DROPSHELL_DIR}/server_info.env"
[[ -d "${CONFIG_PATH}" ]] || _die "Service '${SERVICE}' does not exist on server (missing ${CONFIG_PATH})" [[ -d "${CONFIG_PATH}" ]] || _die "Service '${SERVICE}' does not exist on server (missing ${CONFIG_PATH})"
# -- Acquire exclusive lock (released automatically on exit) --
_lock_service "${DROPSHELL_DIR}/services/${SERVICE}"
# -- Load template info (template defaults, loaded first) -- # -- Load template info (template defaults, loaded first) --
export TEMPLATE_INFO_ENV="${TEMPLATE_PATH}/template_info.env" export TEMPLATE_INFO_ENV="${TEMPLATE_PATH}/template_info.env"
if [[ ! -f "${TEMPLATE_INFO_ENV}" ]]; then if [[ ! -f "${TEMPLATE_INFO_ENV}" ]]; then