static void batch_queue_wq_option_update (struct batch_queue *q, const char *what, const char *value) { if(strcmp(what, "password") == 0) { if(value) work_queue_specify_password(q->data, value); } else if(strcmp(what, "master-mode") == 0) { if(strcmp(value, "catalog") == 0) work_queue_specify_master_mode(q->data, WORK_QUEUE_MASTER_MODE_CATALOG); else if(strcmp(value, "standalone") == 0) work_queue_specify_master_mode(q->data, WORK_QUEUE_MASTER_MODE_STANDALONE); } else if(strcmp(what, "name") == 0) { if(value) work_queue_specify_name(q->data, value); } else if(strcmp(what, "priority") == 0) { if(value) work_queue_specify_priority(q->data, atoi(value)); else work_queue_specify_priority(q->data, 0); } else if(strcmp(what, "fast-abort") == 0) { if(value) work_queue_activate_fast_abort(q->data, atof(value)); } else if(strcmp(what, "estimate-capacity") == 0) { work_queue_specify_estimate_capacity_on(q->data, string_istrue(value)); } else if(strcmp(what, "keepalive-interval") == 0) { if(value) work_queue_specify_keepalive_interval(q->data, atoi(value)); else work_queue_specify_keepalive_interval(q->data, WORK_QUEUE_DEFAULT_KEEPALIVE_INTERVAL); } else if(strcmp(what, "keepalive-timeout") == 0) { if(value) work_queue_specify_keepalive_timeout(q->data, atoi(value)); else work_queue_specify_keepalive_timeout(q->data, WORK_QUEUE_DEFAULT_KEEPALIVE_TIMEOUT); } else if(strcmp(what, "master-preferred-connection") == 0) { if(value) work_queue_master_preferred_connection(q->data, value); else work_queue_master_preferred_connection(q->data, "by_ip"); } else if(strcmp(what, "category-limits") == 0) { struct rmsummary *s = rmsummary_parse_string(value); if(s) { work_queue_specify_category_max_resources(q->data, s->category, s); rmsummary_delete(s); } else { debug(D_NOTICE, "Could no parse '%s' as a summary of resorces encoded in JSON\n", value); } } }
static void batch_queue_wq_option_update (struct batch_queue *q, const char *what, const char *value) { if(strcmp(what, "password") == 0) { if(value) work_queue_specify_password(q->data, value); } else if(strcmp(what, "master-mode") == 0) { if(strcmp(value, "catalog") == 0) work_queue_specify_master_mode(q->data, WORK_QUEUE_MASTER_MODE_CATALOG); else if(strcmp(value, "standalone") == 0) work_queue_specify_master_mode(q->data, WORK_QUEUE_MASTER_MODE_STANDALONE); } else if(strcmp(what, "name") == 0) { if(value) work_queue_specify_name(q->data, value); } else if(strcmp(what, "priority") == 0) { if(value) work_queue_specify_priority(q->data, atoi(value)); else work_queue_specify_priority(q->data, 0); } else if(strcmp(what, "estimate-capacity") == 0) { work_queue_specify_estimate_capacity_on(q->data, string_istrue(value)); } else if(strcmp(what, "keepalive-interval") == 0) { if(value) work_queue_specify_keepalive_interval(q->data, atoi(value)); else work_queue_specify_keepalive_interval(q->data, WORK_QUEUE_DEFAULT_KEEPALIVE_INTERVAL); } else if(strcmp(what, "keepalive-timeout") == 0) { if(value) work_queue_specify_keepalive_timeout(q->data, atoi(value)); else work_queue_specify_keepalive_timeout(q->data, WORK_QUEUE_DEFAULT_KEEPALIVE_TIMEOUT); } else if(strcmp(what, "wait-queue-size") == 0) { if(value) work_queue_activate_worker_waiting(q->data, atoi(value)); else work_queue_activate_worker_waiting(q->data, 0); } else if(strcmp(what, "master-preferred-connection") == 0) { if(value) work_queue_master_preferred_connection(q->data, value); else work_queue_master_preferred_connection(q->data, "by_ip"); } }
int main(int argc, char *argv[]) { struct work_queue *q; int port = WORK_QUEUE_DEFAULT_PORT; if(argc != 4) { printf("Usage: work_queue_workload_simulator <workload_spec> <logfile> <proj_name> \n"); exit(1); } struct list *specs = get_workload_specs(argv[1]); if(!specs) { printf("Failed to load a non-empty workload specification.\n"); exit(1); } created_files = list_create(); if(!created_files) { printf("Failed to allocate memory for a list to store created files.\n"); exit(1); } // open log file logfile = fopen(argv[2], "a"); if(!logfile) { printf("Couldn't open logfile %s: %s\n", argv[2], strerror(errno)); exit(1); } q = work_queue_create(port); if(!q) { printf("couldn't listen on port %d: %s\n", port, strerror(errno)); goto fail; exit(1); } printf("listening on port %d...\n", work_queue_port(q)); // specifying the right modes work_queue_specify_master_mode(q, WORK_QUEUE_MASTER_MODE_CATALOG); work_queue_specify_name(q, argv[3]); work_queue_specify_estimate_capacity_on(q, 1); // report capacity on int time_elapsed = 0; // in seconds int series_id = 0; time_t start_time = time(0); log_work_queue_status(q); while(1) { struct task_series *ts = (struct task_series *)list_peek_tail(specs); if(!ts) { while(!work_queue_empty(q)) { // wait until all tasks to finish wait_for_task(q, 5); } break; } else { time_elapsed = time(0) - start_time; int time_until_next_submit = ts->submit_time - time_elapsed; if(time_until_next_submit <=0) { list_pop_tail(specs); printf("time elapsed: %d seconds\n", time_elapsed); if(!submit_task_series(q, ts, series_id)) { // failed to submit tasks fprintf(stderr, "Failed to submit tasks.\n"); goto fail; } free(ts); series_id++; } else { time_t stoptime = start_time + ts->submit_time; while(!work_queue_empty(q)) { int timeout = stoptime - time(0); if(timeout > 0) { wait_for_task(q, timeout); } else { break; } } time_t current_time = time(0); if(current_time < stoptime) { sleep(stoptime - current_time); } } } } printf("all tasks complete!\n"); work_queue_delete(q); remove_created_files(); fclose(logfile); return 0; fail: remove_created_files(); fclose(logfile); exit(1); }