diff --git a/mxq_job.c b/mxq_job.c index 42a5dc02..ee3b3918 100644 --- a/mxq_job.c +++ b/mxq_job.c @@ -801,3 +801,44 @@ int mxq_load_jobs_running_on_server(struct mx_mysql *mysql, struct mxq_job **job return res; } + +int mxq_unload_job_from_server(struct mx_mysql *mysql, struct mxq_daemon *daemon, uint64_t job_id) { + + /* set a job from LOADED back to INQ. This needs to reset what + * mxq_assign_job_from_group_to_daemon() and mxq_set_job_status_loaded_on_server() + * did to the job: + * + * mxq_assign_job_from_group_to_daemon() : daemon_id, host_hostname, host_slots, server_id, job_status + * mxq_set_job_status_loaded_on_server() : host_id, job_status + * + * Only to be used as an error path, if we fail after loading a job during job setup + * before any users code was executed (with possible user-visible side effects) + */ + + struct mx_mysql_bind param = {0}; + int res; + + char *query = + "UPDATE" + " mxq_job" + " SET" + " daemon_id = 0," + " host_hostname = ''," + " host_slots = 0," + " server_id = ''," + " host_id = ''," + " job_status = " status_str(MXQ_JOB_STATUS_INQ) + " WHERE" + " job_id = ?" + " AND job_status = " status_str(MXQ_JOB_STATUS_LOADED); + + mx_mysql_bind_init_param(¶m, 1); + mx_mysql_bind_var(¶m, 0, uint64, &(job_id)); + + res = mx_mysql_do_statement_noresult_retry_on_fail(mysql, query, ¶m); + if (res < 0) { + mx_log_err("mx_mysql_do_statement(): %m"); + return res; + } + return res; +} diff --git a/mxq_job.h b/mxq_job.h index dd5c9c80..a08aa4ad 100644 --- a/mxq_job.h +++ b/mxq_job.h @@ -96,4 +96,5 @@ int mxq_job_set_tmpfilenames(struct mxq_group *g, struct mxq_job *j); int mxq_load_job_from_group_assigned_to_daemon(struct mx_mysql *mysql, struct mxq_job **jobs_result, uint64_t group_id, struct mxq_daemon *daemon); int mxq_load_job_from_group_for_daemon(struct mx_mysql *mysql, struct mxq_job *mxqjob, uint64_t group_id, struct mxq_daemon *daemon,unsigned long slots_per_job); int mxq_load_jobs_running_on_server(struct mx_mysql *mysql, struct mxq_job **jobs_result, struct mxq_daemon *daemon); +int mxq_unload_job_from_server(struct mx_mysql *mysql, struct mxq_daemon *daemon, uint64_t job_id); #endif