static int add_stringlist(char ***, const char *) UNUSED_VAR;
static void free_stringlist(char ***);
static int add_taglist(edg_wll_TagValue **, const char *, const char *);
-static void update_branch_state(char *, char *, char *, char *, sr_container **);
-static void free_branch_state(sr_container **);
+static void update_branch_state(char *, char *, char *, char *, branch_state **);
+static void free_branch_state(branch_state **);
static void load_branch_state(intJobStat *);
res = RET_LATE;
fine_res = RET_TOOOLD;
}
-
- if (js->branch_tag_seqcode) { // ReallyRunning ev. arrived
+ else if (js->branch_tag_seqcode) { // ReallyRunning ev. arrived
if (same_branch(e->any.seqcode, js->branch_tag_seqcode)) {
if ((js->last_seqcode != NULL) &&
edg_wll_compare_seq(e->any.seqcode, js->last_branch_seqcode) < 0) {
js->resubmit_type = EDG_WLL_RESUBMISSION_WONTRESUB;
}
else
- if (e->resubmission.result == EDG_WLL_RESUBMISSION_WILLRESUB) {
+ if (e->resubmission.result == EDG_WLL_RESUBMISSION_WILLRESUB &&
+ e->any.source == EDG_WLL_SOURCE_WORKLOAD_MANAGER) {
js->resubmit_type = EDG_WLL_RESUBMISSION_WILLRESUB;
free_stringlist(&js->pub.possible_destinations);
free_stringlist(&js->pub.possible_ce_nodes);
}
break;
case EDG_WLL_EVENT_CANCEL:
- if (js->last_cancel_seqcode != NULL &&
- edg_wll_compare_seq_full(e->any.seqcode, js->last_cancel_seqcode, js->branch_tag_seqcode) < 0) {
- res = RET_LATE;
+ if (fine_res != RET_BADBRANCH) {
+ if (js->last_cancel_seqcode != NULL &&
+ edg_wll_compare_seq(e->any.seqcode, js->last_cancel_seqcode) < 0) {
+ res = RET_LATE;
+ }
}
+ else {
+ res = RET_LATE;
+ }
if (USABLE(res, strict)) {
switch (e->cancel.status_code) {
case EDG_WLL_CANCEL_REQ:
}
}
-static void update_branch_state(char *b, char *d, char *c, char *j, sr_container **bs)
+static void update_branch_state(char *b, char *d, char *c, char *j, branch_state **bs)
{
int i = 0, branch;
}
}
- *bs = (sr_container *) realloc(*bs, (i+2)*sizeof(sr_container));
- memset(&((*bs)[i]), 0, 2*sizeof(sr_container));
+ *bs = (branch_state *) realloc(*bs, (i+2)*sizeof(branch_state));
+ memset(&((*bs)[i]), 0, 2*sizeof(branch_state));
(*bs)[i].branch = branch;
rep((*bs)[i].destination, d);
}
-static void free_branch_state(sr_container **bs)
+static void free_branch_state(branch_state **bs)
{
int i = 0;
static int compare_branch_states(const void *a, const void *b)
{
- sr_container *c = (sr_container *) a;
- sr_container *d = (sr_container *) b;
+ branch_state *c = (branch_state *) a;
+ branch_state *d = (branch_state *) b;
if (c->branch < d->branch) return -1;
if (c->branch == d->branch) return 0;
while (js->branch_states[i].branch) i++;
// sort them
- qsort(js->branch_states, (size_t) i, sizeof(sr_container),
+ qsort(js->branch_states, (size_t) i, sizeof(branch_state),
compare_branch_states);
// find row corresponding to ReallyRunning WM seq.code (aka branch)
return out;
}
-static char *enc_sr_container(char *old, sr_container *item)
+static char *enc_branch_states(char *old, branch_state *item)
{
char *ret;
return ret;
}
-static sr_container *dec_sr_container(char *in, char **rest)
+static branch_state *dec_branch_states(char *in, char **rest)
{
- sr_container *out;
+ branch_state *out;
int len = -1, b = 0;
char *tmp_in, *tmp_ret;
int scret;
len++;
} while (b != 0);
- out = (sr_container *) calloc(len+1, sizeof(sr_container));
+ out = (branch_state *) calloc(len+1, sizeof(branch_state));
if (out) {
len = 0;
}
-
-
static char* enc_taglist(char *old, edg_wll_TagValue *item)
{
char *ret;
tmp_in = in = strchr(in, ' ') + 1 ;
do {
tmp_ret = dec_string(tmp_in, &tmp_in);
- if (tmp_ret) free(tmp_ret);
+ if (tmp_ret) free(tmp_ret);
else end = 1;
if (!tmp_in) { *rest = tmp_in; return NULL; }
- tmp_ret = dec_string(tmp_in, &tmp_in);
+ tmp_ret = dec_string(tmp_in, &tmp_in);
free(tmp_ret);
if (!tmp_in) { *rest = tmp_in; return NULL; }
len++;
- } while (end == 0);
+ } while (!end);
out = (edg_wll_TagValue *) malloc(len*sizeof(edg_wll_TagValue));
if (tmp_in != NULL) stat->payload_running = dec_int(tmp_in, &tmp_in);
if (tmp_in != NULL) stat->possible_destinations = dec_strlist(tmp_in, &tmp_in);
if (tmp_in != NULL) stat->possible_ce_nodes = dec_strlist(tmp_in, &tmp_in);
-
-
*rest = tmp_in;
return stat;
if (ret) ret = enc_string(ret, stat->branch_tag_seqcode);
if (ret) ret = enc_string(ret, stat->last_branch_seqcode);
if (ret) ret = enc_string(ret, stat->deep_resubmit_seqcode);
- if (ret) ret = enc_sr_container(ret, stat->branch_states);
+ if (ret) ret = enc_branch_states(ret, stat->branch_states);
return ret;
}
stat->deep_resubmit_seqcode = dec_string(tmp_in, &tmp_in);
}
if (tmp_in != NULL) {
- stat->branch_states = dec_sr_container(tmp_in, &tmp_in);
+ stat->branch_states = dec_branch_states(tmp_in, &tmp_in);
}
} else if (tmp_in != NULL) {
edg_wll_FreeStatus(pubstat);
return edg_wll_Error(ctx, NULL, NULL);
}
-
-/* compare events taking into account shallow resubmission */
-int edg_wll_compare_seq_full(const char *a, const char *b, const char *wn)
-{
- unsigned int c[EDG_WLL_SOURCE__LAST];
- unsigned int d[EDG_WLL_SOURCE__LAST];
- unsigned int w[EDG_WLL_SOURCE__LAST];
- int res;
-
- assert(EDG_WLL_SOURCE__LAST == 9);
-
- if (wn == NULL) return(edg_wll_compare_seq(a,b));
-
- res = sscanf(a, "UI=%d:NS=%d:WM=%d:BH=%d:JSS=%d:LM=%d:LRMS=%d:APP=%d",
- &c[EDG_WLL_SOURCE_USER_INTERFACE],
- &c[EDG_WLL_SOURCE_NETWORK_SERVER],
- &c[EDG_WLL_SOURCE_WORKLOAD_MANAGER],
- &c[EDG_WLL_SOURCE_BIG_HELPER],
- &c[EDG_WLL_SOURCE_JOB_SUBMISSION],
- &c[EDG_WLL_SOURCE_LOG_MONITOR],
- &c[EDG_WLL_SOURCE_LRMS],
- &c[EDG_WLL_SOURCE_APPLICATION]);
- if (res != EDG_WLL_SOURCE__LAST-1) {
- syslog(LOG_ERR, "unparsable sequence code %s\n", a);
- fprintf(stderr, "unparsable sequence code %s\n", a);
- return -1;
- }
-
- res = sscanf(b, "UI=%d:NS=%d:WM=%d:BH=%d:JSS=%d:LM=%d:LRMS=%d:APP=%d",
- &d[EDG_WLL_SOURCE_USER_INTERFACE],
- &d[EDG_WLL_SOURCE_NETWORK_SERVER],
- &d[EDG_WLL_SOURCE_WORKLOAD_MANAGER],
- &d[EDG_WLL_SOURCE_BIG_HELPER],
- &d[EDG_WLL_SOURCE_JOB_SUBMISSION],
- &d[EDG_WLL_SOURCE_LOG_MONITOR],
- &d[EDG_WLL_SOURCE_LRMS],
- &d[EDG_WLL_SOURCE_APPLICATION]);
- if (res != EDG_WLL_SOURCE__LAST-1) {
- syslog(LOG_ERR, "unparsable sequence code %s\n", b);
- fprintf(stderr, "unparsable sequence code %s\n", b);
- return 1;
- }
-
- res = sscanf(wn, "UI=%d:NS=%d:WM=%d:BH=%d:JSS=%d:LM=%d:LRMS=%d:APP=%d",
- &w[EDG_WLL_SOURCE_USER_INTERFACE],
- &w[EDG_WLL_SOURCE_NETWORK_SERVER],
- &w[EDG_WLL_SOURCE_WORKLOAD_MANAGER],
- &w[EDG_WLL_SOURCE_BIG_HELPER],
- &w[EDG_WLL_SOURCE_JOB_SUBMISSION],
- &w[EDG_WLL_SOURCE_LOG_MONITOR],
- &w[EDG_WLL_SOURCE_LRMS],
- &w[EDG_WLL_SOURCE_APPLICATION]);
- if (res != EDG_WLL_SOURCE__LAST-1) {
- syslog(LOG_ERR, "unparsable sequence code %s\n", wn);
- fprintf(stderr, "unparsable sequence code %s\n", wn);
- return 1;
- }
-
-
- if (c[EDG_WLL_SOURCE_WORKLOAD_MANAGER] == w[EDG_WLL_SOURCE_WORKLOAD_MANAGER]) {
- if (d[EDG_WLL_SOURCE_WORKLOAD_MANAGER] == w[EDG_WLL_SOURCE_WORKLOAD_MANAGER])
- return(edg_wll_compare_seq(a,b));
- else
- return 1;
- }
- else {
- return -1;
- }
-
-/*
- if ( (c[EDG_WLL_SOURCE_WORKLOAD_MANAGER] == w[EDG_WLL_SOURCE_WORKLOAD_MANAGER]) &&
- (d[EDG_WLL_SOURCE_WORKLOAD_MANAGER] != w[EDG_WLL_SOURCE_WORKLOAD_MANAGER]) )
- return 1;
-
-
- if ( (c[EDG_WLL_SOURCE_WORKLOAD_MANAGER] != w[EDG_WLL_SOURCE_WORKLOAD_MANAGER]) &&
- (d[EDG_WLL_SOURCE_WORKLOAD_MANAGER] == w[EDG_WLL_SOURCE_WORKLOAD_MANAGER]) )
- return -1;
-
- return(edg_wll_compare_seq(a,b));
-*/
-}
-
int component_seqcode(const char *a, edg_wll_Source index)
{
unsigned int c[EDG_WLL_SOURCE__LAST];