Merge pull request #7989 from dokku/7988-prevent-overlap
Add support to prevent overlapping execution of cron tasks
This commit is contained in:
@@ -39,9 +39,34 @@ trigger-scheduler-docker-local-scheduler-run() {
|
||||
[[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" -e TRACE=true "
|
||||
|
||||
local PROCESS_TYPE=run
|
||||
local concurrency_policy="allow"
|
||||
if [[ -n "$DOKKU_CRON_ID" ]]; then
|
||||
PROCESS_TYPE=cron
|
||||
DOCKER_ARGS+=" --label=com.dokku.cron-id=$DOKKU_CRON_ID"
|
||||
|
||||
if [[ -n "$DOKKU_CONCURRENCY_POLICY" ]]; then
|
||||
concurrency_policy="$DOKKU_CONCURRENCY_POLICY"
|
||||
fi
|
||||
DOCKER_ARGS+=" --label=com.dokku.concurrency-policy=$concurrency_policy"
|
||||
|
||||
if [[ "$concurrency_policy" == "forbid" ]]; then
|
||||
# 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
|
||||
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 "Replacing running container for $DOKKU_CRON_ID"
|
||||
"$DOCKER_BIN" container update --restart=no "$RUNNING_CONTAINERS" &>/dev/null || true
|
||||
"$DOCKER_BIN" container stop "$RUNNING_CONTAINERS" >/dev/null && "$DOCKER_BIN" container kill "$RUNNING_CONTAINERS" &>/dev/null
|
||||
plugn trigger scheduler-register-retired "$APP" "$RUNNING_CONTAINERS"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
local DYNO_NUMBER="$RANDOM"
|
||||
@@ -139,6 +164,7 @@ trigger-scheduler-docker-local-scheduler-run() {
|
||||
DOKKU_CONTAINER_EXIT_CODE="$("$DOCKER_BIN" container wait "$CONTAINER_ID" 2>/dev/null || echo "$EXIT_CODE")"
|
||||
[[ -z "$DOKKU_CONTAINER_EXIT_CODE" ]] && DOKKU_CONTAINER_EXIT_CODE=0
|
||||
fi
|
||||
|
||||
plugn trigger scheduler-post-run "$DOKKU_SCHEDULER" "$APP" "$CONTAINER_ID" "$DOKKU_CONTAINER_EXIT_CODE"
|
||||
return "$DOKKU_CONTAINER_EXIT_CODE"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user