From 5cff2e344033300f141e694ddfd0ba336c1c0997 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 5 Jan 2016 15:33:58 +0100 Subject: [PATCH 01/11] mxq_job: store host_slots when we set status to ASSIGNED When a job transitions from ASSIGNED to LOADED, the sql trigger procedure needs host_slots to maintain the statistics in mxq_daemon --- mxq_job.c | 11 +++++++---- mxq_job.h | 4 ++-- mxqd.c | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/mxq_job.c b/mxq_job.c index 3ec96db6..eea849e9 100644 --- a/mxq_job.c +++ b/mxq_job.c @@ -291,7 +291,7 @@ int mxq_load_jobs_in_group_with_status(struct mx_mysql *mysql, struct mxq_job ** return res; } -int mxq_assign_job_from_group_to_daemon(struct mx_mysql *mysql, uint64_t group_id, struct mxq_daemon *daemon) +int mxq_assign_job_from_group_to_daemon(struct mx_mysql *mysql, uint64_t group_id, struct mxq_daemon *daemon, unsigned long slots_per_job) { struct mx_mysql_bind param = {0}; int res; @@ -311,6 +311,7 @@ int mxq_assign_job_from_group_to_daemon(struct mx_mysql *mysql, uint64_t group_i " SET" " daemon_id = ?," " host_hostname = ?," + " host_slots = ?, " " server_id = ?," " job_status = " status_str(MXQ_JOB_STATUS_ASSIGNED) " WHERE group_id = ?" @@ -324,13 +325,14 @@ int mxq_assign_job_from_group_to_daemon(struct mx_mysql *mysql, uint64_t group_i " job_id" " LIMIT 1"; - res = mx_mysql_bind_init_param(¶m, 4); + res = mx_mysql_bind_init_param(¶m, 5); assert(res == 0); idx = 0; res = 0; res += mx_mysql_bind_var(¶m, idx++, uint32, &daemon->daemon_id); res += mx_mysql_bind_var(¶m, idx++, string, &daemon->hostname); + res += mx_mysql_bind_var(¶m, idx++, uint64, &slots_per_job); res += mx_mysql_bind_var(¶m, idx++, string, &daemon->daemon_name); res += mx_mysql_bind_var(¶m, idx++, uint64, &group_id); assert(res == 0); @@ -678,7 +680,8 @@ int mxq_load_job_from_group_assigned_to_daemon(struct mx_mysql *mysql, struct mx return res; } -int mxq_load_job_from_group_for_daemon(struct mx_mysql *mysql, struct mxq_job *job, uint64_t group_id, struct mxq_daemon *daemon) +int mxq_load_job_from_group_for_daemon(struct mx_mysql *mysql, struct mxq_job *job, uint64_t group_id, struct mxq_daemon *daemon, + unsigned long slots_per_job) { int res; struct mxq_job *jobs_tmp = NULL; @@ -700,7 +703,7 @@ int mxq_load_job_from_group_for_daemon(struct mx_mysql *mysql, struct mxq_job *j break; } - res = mxq_assign_job_from_group_to_daemon(mysql, group_id, daemon); + res = mxq_assign_job_from_group_to_daemon(mysql, group_id, daemon, slots_per_job); if (res < 0) { mx_log_err(" group_id=%lu :: mxq_assign_job_from_group_to_daemon(): %m", group_id); return 0; diff --git a/mxq_job.h b/mxq_job.h index e50c3b86..cca5b561 100644 --- a/mxq_job.h +++ b/mxq_job.h @@ -101,7 +101,7 @@ void mxq_job_free_content(struct mxq_job *j); int mxq_load_job(struct mx_mysql *mysql, struct mxq_job **mxq_jobs, uint64_t job_id); int mxq_load_jobs_in_group(struct mx_mysql *mysql, struct mxq_job **mxq_jobs, struct mxq_group *grp); int mxq_load_jobs_in_group_with_status(struct mx_mysql *mysql, struct mxq_job **mxq_jobs, struct mxq_group *grp, uint64_t job_status); -int mxq_assign_job_from_group_to_daemon(struct mx_mysql *mysql, uint64_t group_id, struct mxq_daemon *daemon); +int mxq_assign_job_from_group_to_daemon(struct mx_mysql *mysql, uint64_t group_id, struct mxq_daemon *daemon, unsigned long slots_per_job); int mxq_unassign_jobs_of_server(struct mx_mysql *mysql, struct mxq_daemon *daemon); int mxq_set_job_status_loaded_on_server(struct mx_mysql *mysql, struct mxq_job *job); int mxq_set_job_status_running(struct mx_mysql *mysql, struct mxq_job *job); @@ -109,6 +109,6 @@ int mxq_set_job_status_exited(struct mx_mysql *mysql, struct mxq_job *job); int mxq_set_job_status_unknown(struct mx_mysql *mysql, struct mxq_job *job); 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); +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); #endif diff --git a/mxqd.c b/mxqd.c index 66d692de..5da75ae9 100644 --- a/mxqd.c +++ b/mxqd.c @@ -1131,7 +1131,7 @@ unsigned long start_job(struct mxq_group_list *glist) group = &glist->group; job = &_mxqjob; - res = mxq_load_job_from_group_for_daemon(server->mysql, job, group->group_id, daemon); + res = mxq_load_job_from_group_for_daemon(server->mysql, job, group->group_id, daemon, glist->slots_per_job); if (!res) { return 0; } From 1b199bb65a74a1bba7250f0e41d7388f2b931d95 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 8 Jan 2016 10:22:44 +0100 Subject: [PATCH 02/11] mxqd: update daemon statistics after reload --- mxq_daemon.c | 41 +++++++++++++++++++++++++++++++++++++++++ mxq_daemon.h | 1 + mxqd.c | 11 +++++++++++ 3 files changed, 53 insertions(+) diff --git a/mxq_daemon.c b/mxq_daemon.c index cdac4ba3..3fb3824d 100644 --- a/mxq_daemon.c +++ b/mxq_daemon.c @@ -301,6 +301,47 @@ int mxq_daemon_set_status(struct mx_mysql *mysql, struct mxq_daemon *daemon, uin return res; } +int mxq_daemon_update_statistics(struct mx_mysql *mysql, struct mxq_daemon *daemon) +{ + assert(daemon); + assert(daemon->daemon_id); + + struct mx_mysql_bind param = {0}; + char *query; + int idx; + int res; + + query = "UPDATE" + " mxq_daemon" + " SET" + " mtime = NULL," + " daemon_jobs_running = ?," + " daemon_slots_running = ?," + " daemon_threads_running = ?," + " daemon_memory_used = ?" + " WHERE daemon_id = ?"; + + res = mx_mysql_bind_init_param(¶m, 5); + assert(res == 0); + + idx = 0; + res = 0; + res += mx_mysql_bind_var(¶m, idx++, uint32, &(daemon->daemon_jobs_running)); + res += mx_mysql_bind_var(¶m, idx++, uint32, &(daemon->daemon_slots_running)); + res += mx_mysql_bind_var(¶m, idx++, uint32, &(daemon->daemon_threads_running)); + res += mx_mysql_bind_var(¶m, idx++, uint64, &(daemon->daemon_memory_used)); + res += mx_mysql_bind_var(¶m, idx++, uint32, &(daemon->daemon_id)); + assert(res == 0); + + 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; +} + int mxq_load_all_daemons(struct mx_mysql *mysql, struct mxq_daemon **daemons) { struct mxq_daemon *daemons_tmp = NULL; diff --git a/mxq_daemon.h b/mxq_daemon.h index ce901e85..7a15d344 100644 --- a/mxq_daemon.h +++ b/mxq_daemon.h @@ -51,6 +51,7 @@ struct mxq_daemon { void mxq_daemon_free_content(struct mxq_daemon *daemon); int mxq_daemon_register(struct mx_mysql *mysql, struct mxq_daemon *daemon); int mxq_daemon_mark_crashed(struct mx_mysql *mysql, struct mxq_daemon *daemon); +int mxq_daemon_update_statistics(struct mx_mysql *mysql, struct mxq_daemon *daemon); int mxq_daemon_shutdown(struct mx_mysql *mysql, struct mxq_daemon *daemon); int mxq_daemon_set_status(struct mx_mysql *mysql, struct mxq_daemon *daemon, uint8_t status); #endif diff --git a/mxqd.c b/mxqd.c index 5da75ae9..4fa7775b 100644 --- a/mxqd.c +++ b/mxqd.c @@ -2198,6 +2198,17 @@ int recover_from_previous_crash(struct mxq_server *server) if (res>0) mx_log_warning("recover: %d jobs vanished from the system",res); + daemon->daemon_jobs_running=server->jobs_running; + daemon->daemon_slots_running=server->slots_running; + daemon->daemon_threads_running=server->threads_running; + daemon->daemon_memory_used=server->memory_used; + + res=mxq_daemon_update_statistics(server->mysql,daemon); + if (res<0) { + mx_log_err("recover: failed to update daemon instance statistics: %m\n"); + return(res); + } + return 0; } From 9be1bd5f91dc8fa0beb23b8fd217e368482ea9de Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 8 Jan 2016 11:46:04 +0100 Subject: [PATCH 03/11] mxqd: update statistics in daemon table when jobs are started and stopped --- mxqd.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/mxqd.c b/mxqd.c index 4fa7775b..c0727c8b 100644 --- a/mxqd.c +++ b/mxqd.c @@ -260,6 +260,23 @@ int write_pid_to_file(char *fname) return 0; } +int server_update_daemon_statistics(struct mxq_server *server) +{ + struct mxq_daemon *daemon; + + assert(server); + assert(server->mysql); + + daemon=&server->daemon; + + daemon->daemon_jobs_running = server->jobs_running; + daemon->daemon_threads_running = server->threads_running; + daemon->daemon_memory_used = server->memory_used; + daemon->daemon_slots_running = server->slots_running; + + return mxq_daemon_update_statistics(server->mysql,daemon); +} + static int cpuset_init(struct mxq_server *server) { int res; @@ -1191,6 +1208,10 @@ unsigned long start_job(struct mxq_group_list *glist) jlist = group_list_add_job(glist, job); assert(jlist); + res = server_update_daemon_statistics(server); + if (res < 0) + mx_log_err("start_job: failed to update daemon instance statistics: %m"); + mx_log_info(" job=%s(%d):%lu:%lu :: added running job to watch queue.", group->user_name, group->user_uid, group->group_id, job->job_id); @@ -1814,6 +1835,9 @@ static int fspool_process_file(struct mxq_server *server,char *filename, uint64_ job_has_finished(server, group, jlist); unlink(filename); + res = server_update_daemon_statistics(server); + if (res < 0) + mx_log_err("recover: failed to update daemon instance statistics: %m"); return(0); } @@ -1955,6 +1979,9 @@ static int lost_scan(struct mxq_server *server) return res; count+=res; } while (res>0); + res = server_update_daemon_statistics(server); + if (res < 0) + mx_log_err("lost_scan: failed to update daemon instance statistics: %m"); return count; } @@ -2198,18 +2225,11 @@ int recover_from_previous_crash(struct mxq_server *server) if (res>0) mx_log_warning("recover: %d jobs vanished from the system",res); - daemon->daemon_jobs_running=server->jobs_running; - daemon->daemon_slots_running=server->slots_running; - daemon->daemon_threads_running=server->threads_running; - daemon->daemon_memory_used=server->memory_used; - - res=mxq_daemon_update_statistics(server->mysql,daemon); - if (res<0) { - mx_log_err("recover: failed to update daemon instance statistics: %m\n"); - return(res); - } + res = server_update_daemon_statistics(server); + if (res < 0) + mx_log_err("recover: failed to update daemon instance statistics: %m"); - return 0; + return res; } /**********************************************************************/ From 874bb9cd081c65a6c93a81ca7c2b884125ad9ee0 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 8 Jan 2016 11:48:54 +0100 Subject: [PATCH 04/11] web: remove useless columns from server table --- web/pages/mxq/mxq.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/pages/mxq/mxq.in b/web/pages/mxq/mxq.in index 267cc145..e7b790ee 100755 --- a/web/pages/mxq/mxq.in +++ b/web/pages/mxq/mxq.in @@ -561,9 +561,9 @@ sub server() { 'pid', 'slots', 'memory', - 'time', +# 'time', 'slotmem_soft', - 'slotmem_hard', +# 'slotmem_hard', 'jobs', 'slots', 'threads', @@ -596,9 +596,9 @@ sub server() { $q->td($daemon_pid), $q->td({class=>'number'},$daemon_slots), $q->td({class=>'number'},$daemon_memory), - $q->td($daemon_time), +# $q->td($daemon_time), $q->td({class=>'number'},$daemon_memory_limit_slot_soft), - $q->td({class=>'number'},$daemon_memory_limit_slot_hard), +# $q->td({class=>'number'},$daemon_memory_limit_slot_hard), $q->td({class=>'number'},$daemon_jobs_running), $q->td({class=>'number'},$daemon_slots_running), $q->td({class=>'number'},$daemon_threads_running), From 835f76f39dcefcf0da0a4dd949323a92c066b98a Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 8 Jan 2016 11:55:47 +0100 Subject: [PATCH 05/11] web: make meaning of values more clear in daemon table header --- web/pages/mxq/mxq.in | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/web/pages/mxq/mxq.in b/web/pages/mxq/mxq.in index e7b790ee..d9cc127f 100755 --- a/web/pages/mxq/mxq.in +++ b/web/pages/mxq/mxq.in @@ -550,6 +550,7 @@ sub server() { $out.=''; + $out.=$q->Tr($q->th([ 'id', 'name', @@ -559,20 +560,21 @@ sub server() { # 'boot_id', # 'pid_starttime', 'pid', - 'slots', - 'memory', + 'slots
available', + 'memory
available', # 'time', - 'slotmem_soft', + 'slotmem_soft
available', # 'slotmem_hard', - 'jobs', - 'slots', - 'threads', - 'memory', + 'jobs
in use', + 'slots
in use', + 'threads
in use', + 'memory
in use', # 'mtime', # 'start', # 'stop', ])); + while (my $row=$sth->fetchrow_arrayref()) { my ( $daemon_id,$daemon_name,$status,$hostname,$mxq_version,$boot_id,$pid_starttime, From fd6f3a7681b45805db68ee05a2c7cc5ab03b731a Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 8 Jan 2016 12:38:48 +0100 Subject: [PATCH 06/11] web: limit group table display to seven days --- web/pages/mxq/mxq.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/pages/mxq/mxq.in b/web/pages/mxq/mxq.in index d9cc127f..89227a67 100755 --- a/web/pages/mxq/mxq.in +++ b/web/pages/mxq/mxq.in @@ -500,9 +500,9 @@ sub group_table { unknown ); - $out .= '

Finished Groups

'; + $out .= '

Finished Groups (last 7 days)

'; - $sth=$dbh->prepare('SELECT '.join(',',@cols).' FROM mxq_group WHERE '.$sql_clause.' AND (group_jobs_running=0 AND group_jobs_inq=0) ORDER BY group_id DESC'); + $sth=$dbh->prepare('SELECT '.join(',',@cols).' FROM mxq_group WHERE '.$sql_clause.' AND (group_jobs_running=0 AND group_jobs_inq=0) AND group_mtime >= DATE_SUB(NOW(),INTERVAL 7 DAY) ORDER BY group_id DESC'); $sth->execute(@$sql_binds); $out.=group_table_rows($sth,\@head); From 6558613d3ba8ff00b666bf2050b2a21eab17c56d Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 8 Jan 2016 13:00:38 +0100 Subject: [PATCH 07/11] mysql/trigger: remove trigger for data we now maintain by mxqd --- mysql/create_trigger.sql | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/mysql/create_trigger.sql b/mysql/create_trigger.sql index daecda94..86d41fc8 100644 --- a/mysql/create_trigger.sql +++ b/mysql/create_trigger.sql @@ -52,14 +52,6 @@ CREATE TRIGGER mxq_update_job BEFORE UPDATE ON mxq_job SET NEW.date_start = NOW(); - IF NEW.daemon_id != 0 THEN - UPDATE mxq_daemon SET - mtime = NULL, - daemon_slots_running = daemon_slots_running + NEW.host_slots, - daemon_jobs_running = daemon_jobs_running + 1 - WHERE daemon_id = NEW.daemon_id; - END IF; - UPDATE mxq_group SET group_sum_starttime = group_sum_starttime + UNIX_TIMESTAMP(NEW.date_start) * OLD.host_slots, group_jobs_inq = group_jobs_inq - 1, @@ -85,16 +77,6 @@ CREATE TRIGGER mxq_update_job BEFORE UPDATE ON mxq_job -- LOADED(150) | RUNNING(200) | UNKNOWN_RUN(250) | EXTRUNNING(300) | STOPPED(350) | KILLING(399) -> KILLED(400) | FAILED(750) ELSEIF NEW.job_status IN (400, 750) AND OLD.job_status IN (150, 200, 250, 300, 350, 399) THEN - IF NEW.daemon_id != 0 THEN - UPDATE mxq_daemon SET - mtime = NULL, - daemon_slots_running = daemon_slots_running - NEW.host_slots, - daemon_jobs_running = daemon_jobs_running - 1 - WHERE daemon_id = NEW.daemon_id - AND daemon_slots_running >= NEW.host_slots - AND daemon_jobs_running >= 1; - END IF; - UPDATE mxq_group SET group_sum_starttime = group_sum_starttime - LEAST(group_sum_starttime, UNIX_TIMESTAMP(OLD.date_start) * OLD.host_slots), group_slots_running = group_slots_running - OLD.host_slots, @@ -124,16 +106,6 @@ CREATE TRIGGER mxq_update_job BEFORE UPDATE ON mxq_job -- LOADED(150) | RUNNING(200) | UNKNOWN_RUN(250) | KILLING(399) -> UNKNOWN(999) ELSEIF NEW.job_status = 999 AND OLD.job_status IN (150, 200, 250, 399) THEN - IF NEW.daemon_id != 0 THEN - UPDATE mxq_daemon SET - mtime = NULL, - daemon_slots_running = daemon_slots_running - NEW.host_slots, - daemon_jobs_running = daemon_jobs_running - 1 - WHERE daemon_id = NEW.daemon_id - AND daemon_slots_running >= NEW.host_slots - AND daemon_jobs_running >= 1; - END IF; - UPDATE mxq_group SET group_sum_starttime = group_sum_starttime - LEAST(group_sum_starttime, UNIX_TIMESTAMP(OLD.date_start) * OLD.host_slots), group_slots_running = group_slots_running - OLD.host_slots, @@ -152,16 +124,6 @@ CREATE TRIGGER mxq_update_job BEFORE UPDATE ON mxq_job -- LOADED(150) | RUNNING(200) | UNKNOWN_RUN(250) | EXTRUNNING(300) | STOPPED(350) | KILLING(399) -> FINISHED(1000) ELSEIF NEW.job_status = 1000 AND OLD.job_status IN (150, 200, 250, 300, 350, 399) THEN - IF NEW.daemon_id != 0 THEN - UPDATE mxq_daemon SET - mtime = NULL, - daemon_slots_running = daemon_slots_running - NEW.host_slots, - daemon_jobs_running = daemon_jobs_running - 1 - WHERE daemon_id = NEW.daemon_id - AND daemon_slots_running >= NEW.host_slots - AND daemon_jobs_running >= 1; - END IF; - UPDATE mxq_group SET group_sum_starttime = group_sum_starttime - LEAST(group_sum_starttime, UNIX_TIMESTAMP(OLD.date_start) * OLD.host_slots), group_slots_running = group_slots_running - OLD.host_slots, From f2473b7dc093247ba893afabc6838e22a6dc3a9a Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Wed, 13 Jan 2016 22:51:18 +0100 Subject: [PATCH 08/11] mxqd_control: insert new groups at the end of the users group list --- mxqd.c | 2 +- mxqd_control.c | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/mxqd.c b/mxqd.c index c0727c8b..a8d3cb98 100644 --- a/mxqd.c +++ b/mxqd.c @@ -2147,7 +2147,7 @@ int load_running_groups(struct mxq_server *server) grp_cnt = mxq_load_running_groups_for_user(server->mysql, &grps, getuid()); for (i=0, total=0; i < grp_cnt; i++) { - group = &grps[grp_cnt-i-1]; + group = &grps[i]; passwd = getpwnam(group->user_name); if (!passwd) { diff --git a/mxqd_control.c b/mxqd_control.c index 053f8cb4..d134103b 100644 --- a/mxqd_control.c +++ b/mxqd_control.c @@ -316,6 +316,23 @@ struct mxq_job_list *group_list_add_job(struct mxq_group_list *glist, struct mxq return jlist; } +/* + * given a mxq_user_list element, find the tail of its groups list. + * returns the address of the pointer containing NULL + */ +static struct mxq_group_list **group_list_tail_ptr(struct mxq_user_list *ulist) +{ + struct mxq_group_list **tail_ptr=&ulist->groups; + while (*tail_ptr) { + tail_ptr=&(*tail_ptr)->next; + } + return tail_ptr; +} + +/* + * create a new mxq_group_list element from a mxq_group and add it to the users groups + * update user and server counters + */ struct mxq_group_list *_user_list_add_group(struct mxq_user_list *ulist, struct mxq_group *group) { struct mxq_group_list *glist; @@ -332,8 +349,7 @@ struct mxq_group_list *_user_list_add_group(struct mxq_user_list *ulist, struct glist->user = ulist; - glist->next = ulist->groups; - ulist->groups = glist; + *group_list_tail_ptr(ulist)=glist; ulist->group_cnt++; server->group_cnt++; From a083e379e9eb3da44107f1fd434eaf4a6cb2b21f Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 3 May 2016 21:52:15 +0200 Subject: [PATCH 09/11] mxqd: update group_jobs_running on transition from RUNING or LOADED to UNKNOWN --- mxqd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mxqd.c b/mxqd.c index a8d3cb98..be975b56 100644 --- a/mxqd.c +++ b/mxqd.c @@ -1740,6 +1740,7 @@ static int job_is_lost(struct mxq_server *server,struct mxq_group *group, struct mxq_set_job_status_unknown(server->mysql, job); group->group_jobs_unknown++; + group->group_jobs_running--; rename_outfiles(group, job); From ca3cc47590c92f4b969661b1e739b8465b1f40f4 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 3 May 2016 22:31:32 +0200 Subject: [PATCH 10/11] fix inline declarations for C99 (gcc 5) https://gcc.gnu.org/gcc-5/porting_to.html --- mx_mysql.c | 12 ++++++------ mxq_group.c | 6 +++--- mxq_group.h | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mx_mysql.c b/mx_mysql.c index e151bfbb..79922d0d 100644 --- a/mx_mysql.c +++ b/mx_mysql.c @@ -62,7 +62,7 @@ static inline int mx__mysql_errno(struct mx_mysql *mysql) return (int)error; } -inline const char *mx__mysql_error(struct mx_mysql *mysql) +extern inline const char *mx__mysql_error(struct mx_mysql *mysql) { mx_assert_return_NULL(mysql, EINVAL); mx_assert_return_NULL(mysql->mysql, EBADF); @@ -71,7 +71,7 @@ inline const char *mx__mysql_error(struct mx_mysql *mysql) return mysql_error(mysql->mysql); } -inline const char *mx__mysql_sqlstate(struct mx_mysql *mysql) +extern inline const char *mx__mysql_sqlstate(struct mx_mysql *mysql) { mx_assert_return_NULL(mysql, EINVAL); mx_assert_return_NULL(mysql->mysql, EBADF); @@ -688,7 +688,7 @@ static int mx__mysql_library_end(void) { /**********************************************************************/ -static inline int _mx_mysql_bind_integer(struct mx_mysql_bind *b, unsigned int index, void *value, int type, int is_unsigned) +extern inline int _mx_mysql_bind_integer(struct mx_mysql_bind *b, unsigned int index, void *value, int type, int is_unsigned) { mx_assert_return_minus_errno(b, EINVAL); mx_assert_return_minus_errno(value, EINVAL); @@ -1230,7 +1230,7 @@ int mx_mysql_statement_field_count(struct mx_mysql_stmt *stmt) return mx__mysql_stmt_field_count(stmt); } -inline int mx_mysql_stmt_field_count_set(struct mx_mysql_stmt *stmt) +extern inline int mx_mysql_stmt_field_count_set(struct mx_mysql_stmt *stmt) { mx_assert_return_minus_errno(stmt, EINVAL); mx_assert_return_minus_errno(stmt->stmt, EBADF); @@ -1251,7 +1251,7 @@ inline int mx_mysql_stmt_field_count_get(struct mx_mysql_stmt *stmt, unsigned lo return 0; } -inline int mx_mysql_stmt_param_count_set(struct mx_mysql_stmt *stmt) +extern inline int mx_mysql_stmt_param_count_set(struct mx_mysql_stmt *stmt) { mx_assert_return_minus_errno(stmt, EINVAL); mx_assert_return_minus_errno(stmt->stmt, EBADF); @@ -1504,7 +1504,7 @@ int mx_mysql_statement_close_no_bind_cleanup(struct mx_mysql_stmt **stmt) return 0; } -inline int mx_mysql_bind_integer(struct mx_mysql_bind *b, unsigned int index, void *value, int type, int is_unsigned) +extern inline int mx_mysql_bind_integer(struct mx_mysql_bind *b, unsigned int index, void *value, int type, int is_unsigned) { int res; diff --git a/mxq_group.c b/mxq_group.c index 2ed76571..3f2ce487 100644 --- a/mxq_group.c +++ b/mxq_group.c @@ -110,7 +110,7 @@ void mxq_group_free_content(struct mxq_group *g) } -inline uint64_t mxq_group_jobs_done(struct mxq_group *g) +extern inline uint64_t mxq_group_jobs_done(struct mxq_group *g) { uint64_t done = 0; @@ -122,7 +122,7 @@ inline uint64_t mxq_group_jobs_done(struct mxq_group *g) return done; } -inline uint64_t mxq_group_jobs_active(struct mxq_group *g) +extern inline uint64_t mxq_group_jobs_active(struct mxq_group *g) { uint64_t active; @@ -136,7 +136,7 @@ inline uint64_t mxq_group_jobs_active(struct mxq_group *g) return active; } -inline uint64_t mxq_group_jobs_inq(struct mxq_group *g) +extern inline uint64_t mxq_group_jobs_inq(struct mxq_group *g) { uint64_t inq; diff --git a/mxq_group.h b/mxq_group.h index 53370e48..29ccc379 100644 --- a/mxq_group.h +++ b/mxq_group.h @@ -64,9 +64,9 @@ struct mxq_group { void mxq_group_free_content(struct mxq_group *g); -inline uint64_t mxq_group_jobs_done(struct mxq_group *g); -inline uint64_t mxq_group_jobs_active(struct mxq_group *g); -inline uint64_t mxq_group_jobs_inq(struct mxq_group *g); +uint64_t mxq_group_jobs_done(struct mxq_group *g); +uint64_t mxq_group_jobs_active(struct mxq_group *g); +uint64_t mxq_group_jobs_inq(struct mxq_group *g); int mxq_load_group(struct mx_mysql *mysql, struct mxq_group **mxq_groups, uint64_t group_id); int mxq_load_all_groups(struct mx_mysql *mysql, struct mxq_group **mxq_groups); From 4fe98d468092efa6d027f28d56502e8d26da330f Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 24 May 2016 09:43:28 +0200 Subject: [PATCH 11/11] mxqdctl-hostconfig: add 'quit' and usage --- mxqdctl-hostconfig.sh | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/mxqdctl-hostconfig.sh b/mxqdctl-hostconfig.sh index 52f5a2b5..8b8f75f0 100755 --- a/mxqdctl-hostconfig.sh +++ b/mxqdctl-hostconfig.sh @@ -57,6 +57,19 @@ function stop_all_started() done } +function quit_all_started() +{ + for pidfile in ${pidfilebase}* ; do + ouid=$(stat --format "%u" "${pidfile}") + if [ "${UID}" != "${ouid}" ] ; then + continue + fi + pid=$(cat ${pidfile}) + echo "${pidfile}: sending signal SIGQUIT to ${pid}" + kill -QUIT ${pid} + done +} + function reload_all_started() { for pidfile in ${pidfilebase}* ; do @@ -93,11 +106,22 @@ case "${BASH_ARGV[0]}" in kill) kill_all_started ;; + quit) + quit_all_started + ;; reload|restart) reload_all_started ;; stopall) killall -u "${USER}" "${mxqd}" ;; + *) + echo "usage $0 CMD" + echo " start : start mxqd (if configured by hostconfig)" + echo " stop : tell mxqd to stop accepting new jobs, wait for running jobs, exit" + echo " kill : tell mxqd to stop accepting new jobs, kill and wait for running jobs, exit" + echo " quit : tell mxqd to exit (leave jobs running)" + echo " reload|restart : tell mxqd to re-exec itself, leave jobs running" + echo " stopall : as 'stop', but to any mxqd owned by calling user" + ;; esac -