From db5cb68ac3ece7dab5cdf9c02fba3eb7c0fa6a97 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Milo=C5=A1=20Mula=C4=8D?= Date: Mon, 19 Feb 2007 16:45:17 +0000 Subject: [PATCH] more meaningful PBS events sorting --- org.glite.lb.common/interface/context-int.h | 14 +++++--- org.glite.lb.server/src/jobstat_supp.c | 52 +++++++++++++++++++++++++++++ org.glite.lb.server/src/process_event_pbs.c | 6 +--- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/org.glite.lb.common/interface/context-int.h b/org.glite.lb.common/interface/context-int.h index d6f1e9c..e35f467 100644 --- a/org.glite.lb.common/interface/context-int.h +++ b/org.glite.lb.common/interface/context-int.h @@ -13,16 +13,20 @@ extern "C" { #endif +#define EDG_WLL_SEQ_NULL "UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000" +#define EDG_WLL_SEQ_SIZE 103 /* strlen(EDG_WLL_SEQ_NULL)+1 */ +#define EDG_WLL_SEQ_PBS_SIZE 47 /* strlen(EDG_WLL_SEQ_PBS_NULL)+1 */ + typedef struct _edg_wll_SeqCode { unsigned int type; /* seq code type */ unsigned int c[EDG_WLL_SOURCE__LAST]; /* glite seq. code */ - char pbs[18]; /* PBS seq. code */ - /* 0-7 date YYYYMMDD, 8-17 byte in log file */ + char pbs[EDG_WLL_SEQ_PBS_SIZE]; /* PBS seq. code */ + /* 0-25 TIMESTAMP=YYYYMMDDHHMMSS: */ + /* 26-41 POS=%010u: */ + /* 42-46 SRC=%c */ + } edg_wll_SeqCode; -#define EDG_WLL_SEQ_NULL "UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000" -#define EDG_WLL_SEQ_SIZE 103 /* strlen(EDG_WLL_SEQ_NULL)+1 */ - /* non-gsi one-element analogy of connPool for L&B Proxy server */ typedef struct _edg_wll_ConnProxy { edg_wll_PlainConnection conn; diff --git a/org.glite.lb.server/src/jobstat_supp.c b/org.glite.lb.server/src/jobstat_supp.c index 41c8fbd..e585128 100644 --- a/org.glite.lb.server/src/jobstat_supp.c +++ b/org.glite.lb.server/src/jobstat_supp.c @@ -822,6 +822,54 @@ int same_branch(const char *a, const char *b) return(0); } +int edg_wll_compare_pbs_seq(const char *a, const char *b) +{ + char timestamp_a[14], pos_a[10], src_a; + char timestamp_b[14], pos_b[10], src_b; + int res; + + res = sscanf(a,"TIMESTAMP=%14s:POS=%10s:SRC=%c", ×tamp_a, &pos_a, &src_a); + + if (res != 3) { + syslog(LOG_ERR, "unparsable sequence code %s\n", a); + fprintf(stderr, "unparsable sequence code %s\n", a); + return -1; + } + + res = sscanf(b,"TIMESTAMP=%14s:POS=%10s:SRC=%c", ×tamp_b, &pos_b, &src_b); + + if (res != 3) { + syslog(LOG_ERR, "unparsable sequence code %s\n", b); + fprintf(stderr, "unparsable sequence code %s\n", b); + return -1; + } + + + /* sort event w.t.r. to timestamps */ + if ((res = strcmp(timestamp_a,timestamp_b)) != 0) { + return res; + } + else { + /* if timestamps equal, sort if w.t.r. to file position */ + /* if you both events come from the same log file */ + if (src_a == src_b) { + /* zero mean in fact duplicate events in log */ + return strcmp(pos_a,pos_b); + } + /* if the events come from diffrent log files */ + /* it is possible to prioritize some src log file */ + else { + /* prioritize events from pbs_mom */ + if (src_a == 'm') return 1; + if (src_b == 'm') return -1; + + /* other priorities comes here... */ + } + } + + return 0; +} + int edg_wll_compare_seq(const char *a, const char *b) { unsigned int c[EDG_WLL_SOURCE__LAST]; @@ -829,6 +877,10 @@ int edg_wll_compare_seq(const char *a, const char *b) int res, i; char sca[EDG_WLL_SEQ_SIZE], scb[EDG_WLL_SEQ_SIZE]; + + if ( (strstr(a,"TIMESTAMP=") == a) && (strstr(b,"TIMESTAMP=") == b) ) + return edg_wll_compare_pbs_seq(a,b); + if (!strstr(a, "LBS")) snprintf(sca,EDG_WLL_SEQ_SIZE,"%s:LBS=000000",a); else snprintf(sca,EDG_WLL_SEQ_SIZE,"%s",a); if (!strstr(b, "LBS")) snprintf(scb,EDG_WLL_SEQ_SIZE,"%s:LBS=000000",b); diff --git a/org.glite.lb.server/src/process_event_pbs.c b/org.glite.lb.server/src/process_event_pbs.c index 6effac6..dd816c9 100644 --- a/org.glite.lb.server/src/process_event_pbs.c +++ b/org.glite.lb.server/src/process_event_pbs.c @@ -31,10 +31,6 @@ static int compare_timestamps(struct timeval a, struct timeval b) return 0; } -static int compare_pbs_seqcodes(char *a, char *b) -{ - return (strcmp(a,b)); // simple minded, but should work -} // XXX move this defines into some common place to be reusable #define USABLE(res) ((res) == RET_OK) @@ -52,7 +48,7 @@ int processEvent_PBS(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, c //if (compare_timestamps(js->last_pbs_event_timestamp, e->any.timestamp) > 0) if ((js->last_seqcode != NULL) && - (compare_pbs_seqcodes(js->last_seqcode, e->any.seqcode) > 0) ) { + (edg_wll_compare_pbs_seq(js->last_seqcode, e->any.seqcode) > 0) ) { res = RET_LATE; } -- 1.8.2.3