fix: correctly check for running containers when concurrency policy is forbid

We cannot grab a lock as cron:run with --detach will release the lock. Instead, just check if any containers for the specified cron_id are running and exit.
This commit is contained in:
Jose Diaz-Gonzalez
2025-11-13 01:54:47 -05:00
parent 3f8c868ab8
commit bacbc6d90d

View File

@@ -5,25 +5,6 @@ source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/config/functions"
source "$PLUGIN_AVAILABLE_PATH/scheduler-docker-local/internal-functions"
fn-scheduler-docker-local-scheduler-run-acquire-lock() {
declare desc="acquire advisory lock for use in docker-local cron jobs"
local APP="$1" CRON_ID="$2"
local LOCK_TYPE="exclusive"
local APP_DEPLOY_LOCK_FILE="$DOKKU_LIB_ROOT/data/scheduler-docker-local/$APP/cron-$CRON_ID.lock"
local LOCK_WAITING_MSG="$APP currently has a cron lock in place for $CRON_ID. Waiting..."
local LOCK_FAILED_MSG="$APP currently has a cron lock in place for $CRON_ID. Exiting..."
acquire_advisory_lock "$APP_DEPLOY_LOCK_FILE" "$LOCK_TYPE" "$LOCK_WAITING_MSG" "$LOCK_FAILED_MSG"
}
fn-scheduler-docker-local-scheduler-run-release-lock() {
declare desc="release advisory lock used in docker-local cron jobs"
local APP="$1" CRON_ID="$2"
local APP_DEPLOY_LOCK_FILE="$DOKKU_LIB_ROOT/data/scheduler-docker-local/$APP/cron-$CRON_ID.lock"
release_advisory_lock "$APP_DEPLOY_LOCK_FILE"
}
trigger-scheduler-docker-local-scheduler-run() {
declare desc="runs command in container based on app image"
declare trigger="scheduler-run"
@@ -69,7 +50,12 @@ trigger-scheduler-docker-local-scheduler-run() {
DOCKER_ARGS+=" --label=com.dokku.concurrency-policy=$concurrency_policy"
if [[ "$concurrency_policy" == "forbid" ]]; then
fn-scheduler-docker-local-scheduler-run-acquire-lock "$APP" "$DOKKU_CRON_ID"
# check if there is a running docker container with the same com.dokku.cron-id label
local RUNNING_CONTAINERS="$("$DOCKER_BIN" container ls --filter "label=com.dokku.cron-id=$DOKKU_CRON_ID" --filter "status=running" --quiet || true)"
if [[ -n "$RUNNING_CONTAINERS" ]]; then
dokku_log_warn "$APP currently has a cron lock in place for $DOKKU_CRON_ID. Exiting..."
return 1
fi
fi
if [[ "$concurrency_policy" == "replace" ]]; then
@@ -172,10 +158,6 @@ trigger-scheduler-docker-local-scheduler-run() {
[[ -z "$DOKKU_CONTAINER_EXIT_CODE" ]] && DOKKU_CONTAINER_EXIT_CODE=0
fi
if [[ -n "$DOKKU_CRON_ID" ]] && [[ "$concurrency_policy" == "forbid" ]]; then
fn-scheduler-docker-local-scheduler-run-release-lock "$APP" "$DOKKU_CRON_ID"
fi
plugn trigger scheduler-post-run "$DOKKU_SCHEDULER" "$APP" "$CONTAINER_ID" "$DOKKU_CONTAINER_EXIT_CODE"
return "$DOKKU_CONTAINER_EXIT_CODE"
}