diff --git a/mxqsub.c b/mxqsub.c index 065fd02d..c1c8997e 100644 --- a/mxqsub.c +++ b/mxqsub.c @@ -76,6 +76,7 @@ static void print_usage(void) " --blacklist=STRING set list of blacklisted servers (default: '')\n" " --whitelist=STRING set list of whitelisted servers (default: '')\n" " --prerequisites=STRING set prerequisites (default: '')\n" + " --tags=STRING set tags (default: '')\n" "\n" " [SIZE] may be suffixed with a combination of T, G and M\n" " to specify tebibytes, gibibytes and mebibytes.\n" @@ -175,6 +176,7 @@ static int load_group_id(struct mx_mysql *mysql, struct mxq_group *g) " AND group_blacklist = ?" " AND group_whitelist = ?" " AND prerequisites = ?" + " AND tags = ?" " AND group_status = 0" " AND group_flags & ? = 0 " " ORDER BY group_id DESC" @@ -199,7 +201,8 @@ static int load_group_id(struct mx_mysql *mysql, struct mxq_group *g) res += mx_mysql_statement_param_bind(stmt, 12, string, &(g->group_blacklist)); res += mx_mysql_statement_param_bind(stmt, 13, string, &(g->group_whitelist)); res += mx_mysql_statement_param_bind(stmt, 14, string, &(g->prerequisites)); - res += mx_mysql_statement_param_bind(stmt, 15, uint64, &(flags)); + res += mx_mysql_statement_param_bind(stmt, 15, string, &(g->tags)); + res += mx_mysql_statement_param_bind(stmt, 16, uint64, &(flags)); assert(res == 0); res = mx_mysql_statement_execute(stmt, &num_rows); @@ -266,6 +269,7 @@ static int load_group_id_by_group_id(struct mx_mysql *mysql, struct mxq_group *g " AND group_blacklist = ?" " AND group_whitelist = ?" " AND prerequisites = ?" + " AND tags = ?" " AND group_status = 0" " AND group_id = ?" " AND group_flags & ? = 0 " @@ -291,8 +295,9 @@ static int load_group_id_by_group_id(struct mx_mysql *mysql, struct mxq_group *g res += mx_mysql_statement_param_bind(stmt, 12, string, &(g->group_blacklist)); res += mx_mysql_statement_param_bind(stmt, 13, string, &(g->group_whitelist)); res += mx_mysql_statement_param_bind(stmt, 14, string, &(g->prerequisites)); - res += mx_mysql_statement_param_bind(stmt, 15, uint64, &(g->group_id)); - res += mx_mysql_statement_param_bind(stmt, 16, uint64, &(flags)); + res += mx_mysql_statement_param_bind(stmt, 15, string, &(g->tags)); + res += mx_mysql_statement_param_bind(stmt, 16, uint64, &(g->group_id)); + res += mx_mysql_statement_param_bind(stmt, 17, uint64, &(flags)); assert(res == 0); res = mx_mysql_statement_execute(stmt, &num_rows); @@ -351,6 +356,7 @@ static int load_group_id_run_or_wait(struct mx_mysql *mysql, struct mxq_group *g " AND group_blacklist = ?" " AND group_whitelist = ?" " AND prerequisites = ?" + " AND tags = ?" " AND group_status = 0" " AND (" "group_jobs_running > 0" @@ -380,7 +386,8 @@ static int load_group_id_run_or_wait(struct mx_mysql *mysql, struct mxq_group *g res += mx_mysql_statement_param_bind(stmt, 12, string, &(g->group_blacklist)); res += mx_mysql_statement_param_bind(stmt, 13, string, &(g->group_whitelist)); res += mx_mysql_statement_param_bind(stmt, 14, string, &(g->prerequisites)); - res += mx_mysql_statement_param_bind(stmt, 15, uint64, &(flags)); + res += mx_mysql_statement_param_bind(stmt, 15, string, &(g->tags)); + res += mx_mysql_statement_param_bind(stmt, 16, uint64, &(flags)); assert(res == 0); res = mx_mysql_statement_execute(stmt, &num_rows); @@ -440,7 +447,8 @@ static int add_group(struct mx_mysql *mysql, struct mxq_group *g) " group_priority = ?," " group_blacklist = ?," " group_whitelist = ?," - " prerequisites = ?"); + " prerequisites = ?," + " tags = ?"); if (!stmt) { mx_log_err("mx_mysql_statement_prepare(): %m"); return -errno; @@ -461,6 +469,7 @@ static int add_group(struct mx_mysql *mysql, struct mxq_group *g) res += mx_mysql_statement_param_bind(stmt,12, string, &(g->group_blacklist)); res += mx_mysql_statement_param_bind(stmt,13, string, &(g->group_whitelist)); res += mx_mysql_statement_param_bind(stmt,14, string, &(g->prerequisites)); + res += mx_mysql_statement_param_bind(stmt,15, string, &(g->tags)); assert(res == 0); res = mx_mysql_statement_execute(stmt, &num_rows); @@ -685,6 +694,7 @@ int main(int argc, char *argv[]) char *arg_blacklist; char *arg_whitelist; char *arg_prerequisites; + char *arg_tags; char *arg_program_name; u_int16_t arg_threads; u_int64_t arg_memory; @@ -707,6 +717,7 @@ int main(int argc, char *argv[]) _mx_cleanup_free_ char *arg_args = NULL; _mx_cleanup_free_ char *blacklist = NULL; _mx_cleanup_free_ char *whitelist = NULL; + _mx_cleanup_free_ char *tags = NULL; int flags = 0; @@ -764,6 +775,7 @@ int main(int argc, char *argv[]) MX_OPTION_REQUIRED_ARG("blacklist", 8), MX_OPTION_REQUIRED_ARG("whitelist", 9), MX_OPTION_REQUIRED_ARG("prerequisites", 10), + MX_OPTION_REQUIRED_ARG("tags", 11), MX_OPTION_END }; @@ -792,6 +804,7 @@ int main(int argc, char *argv[]) arg_blacklist = NULL; arg_whitelist = NULL; arg_prerequisites = ""; + arg_tags = NULL; arg_mysql_default_group = getenv("MXQ_MYSQL_DEFAULT_GROUP"); if (!arg_mysql_default_group) @@ -1008,6 +1021,9 @@ int main(int argc, char *argv[]) arg_prerequisites = optctl.optarg; break; + case 11: + arg_tags = optctl.optarg; + break; } } @@ -1082,6 +1098,14 @@ int main(int argc, char *argv[]) whitelist = mx_strdup_forever(""); } + if (arg_tags != NULL) { + struct keywordset *kws = keywordset_new(arg_tags); + tags = keywordset_get(kws); + keywordset_free(kws); + } else { + tags = mx_strdup_forever(""); + } + /******************************************************************/ memset(&job, 0, sizeof(job)); @@ -1101,6 +1125,7 @@ int main(int argc, char *argv[]) group.group_blacklist = blacklist; group.group_whitelist = whitelist; group.prerequisites = arg_prerequisites; + group.tags = tags; group.job_max_per_node = arg_max_per_node;