From 7e24d01d5672765609ac351102b997d4b82243a0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ale=C5=A1=20K=C5=99enek?= Date: Wed, 25 Jun 2008 13:13:16 +0000 Subject: [PATCH] merge 313_5 --- org.glite.lb.server/config/startup | 2 +- org.glite.lb.server/project/ChangeLog | 19 +++ org.glite.lb.server/project/version.properties | 2 +- org.glite.lb.server/src/bkindex.c | 51 +++--- org.glite.lb.server/src/bkserverd.c | 179 +++++++++------------- org.glite.lb.server/src/db_store.c | 2 +- org.glite.lb.server/src/jobstat.c | 29 ++-- org.glite.lb.server/src/jobstat.h | 8 +- org.glite.lb.server/src/jobstat_supp.c | 8 + org.glite.lb.server/src/notif_match.c | 8 +- org.glite.lb.server/src/query.c | 11 +- org.glite.lb.server/src/write2rgma.c | 37 ++++- org.glite.lb.server/src/ws_fault.c | 2 +- org.glite.lb.state-machine/interface/intjobstat.h | 7 +- 14 files changed, 204 insertions(+), 161 deletions(-) diff --git a/org.glite.lb.server/config/startup b/org.glite.lb.server/config/startup index 9dcbf96..8d748e0 100755 --- a/org.glite.lb.server/config/startup +++ b/org.glite.lb.server/config/startup @@ -88,7 +88,7 @@ start() stop() { - echo -n Stopping glite-lb-interlogd ... + echo -n Stopping glite-lb-notif-interlogd ... killall glite-lb-notif-interlogd echo done if [ -f $pidfile ]; then diff --git a/org.glite.lb.server/project/ChangeLog b/org.glite.lb.server/project/ChangeLog index 1d7e3c8..a8e372c 100644 --- a/org.glite.lb.server/project/ChangeLog +++ b/org.glite.lb.server/project/ChangeLog @@ -18,3 +18,22 @@ - rewrite internal event number increment code to avoid race & inifinit loop with read-consistent transactional database (should fix bug #27555) - revert enforced "strict locking" with transcactions (not needed anymore) + +1.8.3-1 (lb-1.7.4-1) +- JP plugin: implementation of finalDoneStatus and history status attributes +- fix double-free in state machine + +1.9.0-1 (lb-1.8.0-1) +- store dumps in GLITE_LOCATION_VAR rather than /tmp +- don't waste memory while reindexing +- handle subjob embryos in reindexing +- unify error handling for store and query +- don't clobber store errors with job unlocking +- don't send CollectionState from lb proxy to server +- export UI host and VOMS FQAN to RGMA +- don't coredump on requesting notifications that are denied +- don't return empty results for some non-indexed queries + +1.9.1-1 +- clarified soap error messages + diff --git a/org.glite.lb.server/project/version.properties b/org.glite.lb.server/project/version.properties index f9ec6c9..1990ad9 100644 --- a/org.glite.lb.server/project/version.properties +++ b/org.glite.lb.server/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=1.8.2 +module.version=1.9.1 module.age=1 diff --git a/org.glite.lb.server/src/bkindex.c b/org.glite.lb.server/src/bkindex.c index bf1b621..2fa2c98 100644 --- a/org.glite.lb.server/src/bkindex.c +++ b/org.glite.lb.server/src/bkindex.c @@ -351,10 +351,12 @@ static void usage(const char *me) static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context ctx, void *job_index_cols) { glite_lbu_Statement sh; + glite_lbu_Statement sh0; int njobs, ret = -1; intJobStat *stat; edg_wlc_JobId jobid; char *res[5]; + char *res0[1]; char *rest; char *icvalues, *stmt; int i; @@ -362,15 +364,27 @@ static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context ctx, void *job_ edg_wll_ResetError(ctx); if (!job_index_cols) return 0; - if ((njobs = edg_wll_ExecSQL(ctx, "select s.jobid,s.int_status,s.seq,s.version,j.dg_jobid" - " from states s, jobs j where s.jobid=j.jobid",&sh)) < 0) { - glite_lbu_FreeStmt(&sh); + if ((njobs = edg_wll_ExecSQL(ctx, "select jobid from states", &sh0)) < 0) { + glite_lbu_FreeStmt(&sh0); return edg_wll_Error(ctx, NULL, NULL); } - while ((ret=edg_wll_FetchRow(ctx,sh,sizeof(res)/sizeof(res[0]),NULL,res)) >0) { + while ((ret=edg_wll_FetchRow(ctx,sh0,sizeof(res0)/sizeof(res0[0]),NULL,res0)) >0) { do { if (edg_wll_Transaction(ctx)) goto rollback; - if (edg_wll_LockJobRowInShareMode(ctx, res[4])) goto rollback;; + trio_asprintf(&stmt, "select s.jobid,s.int_status,s.seq,s.version,j.dg_jobid" + " from states s, jobs j where s.jobid='%|Ss' and s.jobid=j.jobid" + " for update", + res0[0]); + if ((edg_wll_ExecSQL(ctx, stmt ,&sh)) < 1) { + glite_lbu_FreeStmt(&sh); + free(stmt); stmt = NULL; + goto rollback; + } + free(stmt); stmt = NULL; + if ((ret=edg_wll_FetchRow(ctx,sh,sizeof(res)/sizeof(res[0]),NULL,res)) <= 0) { + glite_lbu_FreeStmt(&sh); + goto rollback; + } if (strcmp(res[3], INTSTAT_VERSION)) { stat = NULL; @@ -381,9 +395,10 @@ static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context ctx, void *job_ free(stat); stat = NULL; } else { - if (edg_wll_intJobStatus(ctx, jobid, 0, stat, 1)) { + if (edg_wll_intJobStatus(ctx, jobid, 0, stat, 1, 0)) { free(stat); stat = NULL; + if (edg_wll_Error(ctx,NULL,NULL) != ENOENT) do_exit(ctx, EX_SOFTWARE); } } } @@ -392,21 +407,21 @@ static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context ctx, void *job_ } else { stat = dec_intJobStat(res[1], &rest); if (rest == NULL) stat = NULL; + if (stat == NULL) fprintf(stderr,"glite-lb-bkindex: warning: " + "cannot decode int_status for %s\n",res[4]); } - if (stat == NULL) { - glite_lbu_FreeStmt(&sh); - edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, - "cannot decode int_status from states DB table"); - goto rollback; + if (stat != NULL) { + edg_wll_IColumnsSQLPart(ctx, job_index_cols, &stat->pub, 0, NULL, &icvalues); + trio_asprintf(&stmt, "update states set seq=%s%s where jobid='%|Ss'", res[2], icvalues, res[0]); + ret = edg_wll_ExecSQL(ctx, stmt, NULL); + free(icvalues); + free(stmt); + destroy_intJobStat(stat); free(stat); } - edg_wll_IColumnsSQLPart(ctx, job_index_cols, &stat->pub, 0, NULL, &icvalues); - trio_asprintf(&stmt, "update states set seq=%s%s where jobid='%|Ss'", res[2], icvalues, res[0]); - ret = edg_wll_ExecSQL(ctx, stmt, NULL); - for (i = 0; i < 5; i++) free(res[i]); - destroy_intJobStat(stat); free(stat); - free(stmt); free(icvalues); + free(res0[0]); + glite_lbu_FreeStmt(&sh); if (ret < 0) goto rollback; rollback:; @@ -414,7 +429,7 @@ rollback:; if (edg_wll_Error(ctx, NULL, NULL)) goto err; } err: - glite_lbu_FreeStmt(&sh); + glite_lbu_FreeStmt(&sh0); return edg_wll_Error(ctx, NULL, NULL); } diff --git a/org.glite.lb.server/src/bkserverd.c b/org.glite.lb.server/src/bkserverd.c index b85470c..8f388aa 100644 --- a/org.glite.lb.server/src/bkserverd.c +++ b/org.glite.lb.server/src/bkserverd.c @@ -929,7 +929,7 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) struct timeval dns_to = {DNS_TIMEOUT, 0}, conn_start, now; struct sockaddr_in a; - int alen; + socklen_t alen; char *server_name = NULL, *name = NULL; int h_errno, ret; @@ -1207,7 +1207,6 @@ err: } #endif /* GLITE_LB_SERVER_WITH_WS */ - int bk_handle_connection_proxy(int conn, struct timeval *timeout, void *data) { struct clnt_data_t *cdata = (struct clnt_data_t *)data; @@ -1279,78 +1278,83 @@ int bk_handle_connection_proxy(int conn, struct timeval *timeout, void *data) } +static int handle_server_error(edg_wll_Context ctx) +{ + char *errt = NULL, *errd = NULL; + int err,ret = 0; + + + errt = errd = NULL; + switch ( (err = edg_wll_Error(ctx, &errt, &errd)) ) + { + case ETIMEDOUT: + case EDG_WLL_ERROR_GSS: + case EPIPE: + case EIO: + case EDG_WLL_IL_PROTO: + dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); + if (!debug) syslog(LOG_ERR,"%s (%s)", errt, errd); + /* fallthrough + */ + case ENOTCONN: + case ECONNREFUSED: + /* + * "recoverable" error - return (>0) + */ + ret = err; + break; + + case ENOENT: + case EPERM: + case EEXIST: + case EDG_WLL_ERROR_NOINDEX: + case E2BIG: + dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); + break; + case EINVAL: + case EDG_WLL_ERROR_PARSE_BROKEN_ULM: + case EDG_WLL_ERROR_PARSE_EVENT_UNDEF: + case EDG_WLL_ERROR_PARSE_MSG_INCOMPLETE: + case EDG_WLL_ERROR_PARSE_KEY_DUPLICITY: + case EDG_WLL_ERROR_PARSE_KEY_MISUSE: + case EDG_WLL_ERROR_PARSE_OK_WITH_EXTRA_FIELDS: + case EDG_WLL_ERROR_JOBID_FORMAT: + case EDG_WLL_ERROR_MD5_CLASH: + dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); + if ( !debug ) syslog(LOG_ERR,"%s (%s)", errt, errd); + /* + * no action for non-fatal errors + */ + break; + + case EDG_WLL_ERROR_DB_INIT: + case EDG_WLL_ERROR_DB_CALL: + case EDG_WLL_ERROR_SERVER_RESPONSE: + default: + dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); + if (!debug) syslog(LOG_CRIT,"%s (%s)",errt,errd); + /* + * unknown error - do rather return (<0) (slave will be killed) + */ + ret = -EIO; + } + free(errt); free(errd); + return ret; +} + int bk_accept_store(int conn, struct timeval *timeout, void *cdata) { edg_wll_Context ctx = ((struct clnt_data_t *) cdata)->ctx; struct timeval before, after; + int err; /* * serve the request */ memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout)); gettimeofday(&before, NULL); - if ( edg_wll_StoreProto(ctx) ) - { - char *errt, *errd; - int err; + if ( edg_wll_StoreProto(ctx) && (err = handle_server_error(ctx))) return err; - - errt = errd = NULL; - switch ( (err = edg_wll_Error(ctx, &errt, &errd)) ) - { - case ETIMEDOUT: - case EDG_WLL_ERROR_GSS: - case EPIPE: - case EIO: - case EDG_WLL_IL_PROTO: - dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); - if (!debug) syslog(LOG_ERR,"%s (%s)", errt, errd); - /* fallthrough - */ - case ENOTCONN: - free(errt); free(errd); - /* - * "recoverable" error - return (>0) - */ - return err; - break; - - case ENOENT: - case EPERM: - case EEXIST: - case EDG_WLL_ERROR_NOINDEX: - case E2BIG: - dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); - break; - case EINVAL: - case EDG_WLL_ERROR_PARSE_BROKEN_ULM: - case EDG_WLL_ERROR_PARSE_EVENT_UNDEF: - case EDG_WLL_ERROR_PARSE_MSG_INCOMPLETE: - case EDG_WLL_ERROR_PARSE_KEY_DUPLICITY: - case EDG_WLL_ERROR_PARSE_KEY_MISUSE: - case EDG_WLL_ERROR_PARSE_OK_WITH_EXTRA_FIELDS: - case EDG_WLL_ERROR_JOBID_FORMAT: - case EDG_WLL_ERROR_MD5_CLASH: - dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); - if ( !debug ) syslog(LOG_ERR,"%s (%s)", errt, errd); - /* - * no action for non-fatal errors - */ - break; - - case EDG_WLL_ERROR_DB_INIT: - case EDG_WLL_ERROR_DB_CALL: - case EDG_WLL_ERROR_SERVER_RESPONSE: - default: - dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); - if (!debug) syslog(LOG_CRIT,"%s (%s)",errt,errd); - /* - * unknown error - do rather return (<0) (slave will be killed) - */ - return -EIO; - } - free(errt); free(errd); - } gettimeofday(&after, NULL); if ( decrement_timeout(timeout, before, after) ) { if (debug) fprintf(stderr, "Serving store connection timed out"); @@ -1366,60 +1370,15 @@ int bk_accept_serve(int conn, struct timeval *timeout, void *cdata) { edg_wll_Context ctx = ((struct clnt_data_t *) cdata)->ctx; struct timeval before, after; + int err; /* * serve the request */ memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout)); gettimeofday(&before, NULL); - if ( edg_wll_ServerHTTP(ctx) ) - { - char *errt, *errd; - int err; + if ( edg_wll_ServerHTTP(ctx) && (err = handle_server_error(ctx))) return err; - - errt = errd = NULL; - switch ( (err = edg_wll_Error(ctx, &errt, &errd)) ) - { - case ETIMEDOUT: - case EDG_WLL_ERROR_GSS: - case EPIPE: - dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); - if (!debug) syslog(LOG_ERR,"%s (%s)", errt, errd); - /* fallthrough - */ - case ENOTCONN: - case ECONNREFUSED: - free(errt); free(errd); - /* - * "recoverable" error - return (>0) - */ - return err; - break; - - case ENOENT: - case EINVAL: - case EPERM: - case EEXIST: - case EDG_WLL_ERROR_NOINDEX: - case E2BIG: - dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); - if ( !debug ) syslog(LOG_ERR,"%s (%s)", errt, errd); - /* - * no action for non-fatal errors - */ - break; - - default: - dprintf(("[%d] %s (%s)\n", getpid(), errt, errd)); - if (!debug) syslog(LOG_CRIT,"%s (%s)",errt,errd); - /* - * unknown error - do rather return (<0) (slave will be killed) - */ - return -EIO; - } - free(errt); free(errd); - } gettimeofday(&after, NULL); if ( decrement_timeout(timeout, before, after) ) { if (debug) fprintf(stderr, "Serving store connection timed out"); diff --git a/org.glite.lb.server/src/db_store.c b/org.glite.lb.server/src/db_store.c index ff8ca8f..4438ac7 100644 --- a/org.glite.lb.server/src/db_store.c +++ b/org.glite.lb.server/src/db_store.c @@ -244,7 +244,7 @@ static int forward_event_to_server(edg_wll_Context ctx, char *event, edg_wll_Eve //return edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "db_actual_store() ERROR: the event is not PROXY"); } - if (!(ev->any.priority & EDG_WLL_LOGFLAG_DIRECT) && !local_job) { + if (!(ev->any.priority & (EDG_WLL_LOGFLAG_DIRECT | EDG_WLL_LOGFLAG_INTERNAL)) && !local_job) { if (edg_wll_EventSendProxy(ctx, ev->any.jobId, event) ) { return edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "edg_wll_EventSendProxy() error."); } diff --git a/org.glite.lb.server/src/jobstat.c b/org.glite.lb.server/src/jobstat.c index ba48613..527a928 100644 --- a/org.glite.lb.server/src/jobstat.c +++ b/org.glite.lb.server/src/jobstat.c @@ -117,7 +117,7 @@ int edg_wll_JobStatusServer( destroy_intJobStat_extension(ijsp); free(ijsp); } else { - if (edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store)) { + if (edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store, 0)) { char *err; /* job has no record in states table ?? */ @@ -342,7 +342,8 @@ int edg_wll_intJobStatus( glite_jobid_const_t job, int flags, intJobStat *intstat, - int update_db) + int update_db, + int add_fqans) { /* Local variables */ @@ -432,6 +433,14 @@ int edg_wll_intJobStatus( if (!intErr) { if (update_db) { int tsq = num_events - 1; + if (add_fqans && tsq == 0 && ctx->fqans != NULL) { + for (i=0; ctx->fqans[i]; i++); + intstat->user_fqans = malloc(sizeof(*ctx->fqans)*(i+1)); + for (i=0; ctx->fqans[i]; i++) { + intstat->user_fqans[i] = strdup(ctx->fqans[i]); + } + intstat->user_fqans[i] = NULL; + } edg_wll_StoreIntState(ctx, intstat, tsq); /* recheck * intJobStat *reread; @@ -658,7 +667,7 @@ edg_wll_ErrorCode edg_wll_StoreIntStateEmbryonic(edg_wll_Context ctx, /* TODO edg_wll_UpdateStatistics(ctx, NULL, e, &jobstat.pub); - if (ctx->rgma_export) write2rgma_status(&jobstat.pub); + if (ctx->rgma_export) write2rgma_status(&jobstat); */ trio_asprintf(&stmt, @@ -795,6 +804,8 @@ static int log_collectionState_event(edg_wll_Context ctx, edg_wll_JobStatCode st edg_wll_Event *event = edg_wll_InitEvent(EDG_WLL_EVENT_COLLECTIONSTATE); + event->any.priority = EDG_WLL_LOGFLAG_INTERNAL; + if (ctx->serverIdentity) event->any.user = strdup(ctx->serverIdentity); else @@ -955,7 +966,7 @@ edg_wll_ErrorCode edg_wll_StepIntStateParent(edg_wll_Context ctx, edg_wll_CpyStatus(&ijsp->pub,&oldstat); - if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(&ijsp->pub); + if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(ijsp); res = processEvent(ijsp, e, seq, be_strict, &errstring); if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */ @@ -967,7 +978,7 @@ edg_wll_ErrorCode edg_wll_StepIntStateParent(edg_wll_Context ctx, edg_wll_UpdateStatistics(ctx,&oldstat,e,&ijsp->pub); - if (ctx->rgma_export) write2rgma_chgstatus(&ijsp->pub, oldstat_rgmaline); + if (ctx->rgma_export) write2rgma_chgstatus(ijsp, oldstat_rgmaline); if (stat_out) { edg_wll_CpyStatus(&ijsp->pub, stat_out); @@ -1007,7 +1018,7 @@ edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, if (!edg_wll_LoadIntState(ctx, job, DONT_LOCK, seq - 1, &ijsp)) { edg_wll_CpyStatus(&ijsp->pub,&oldstat); - if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(&ijsp->pub); + if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(ijsp); res = processEvent(ijsp, e, seq, be_strict, &errstring); if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */ @@ -1024,7 +1035,7 @@ edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, return edg_wll_SetError(ctx, EINVAL, "update_parent_status()"); } - if (ctx->rgma_export) write2rgma_chgstatus(&ijsp->pub, oldstat_rgmaline); + if (ctx->rgma_export) write2rgma_chgstatus(ijsp, oldstat_rgmaline); if (stat_out) { memcpy(stat_out,&ijsp->pub,sizeof *stat_out); @@ -1034,7 +1045,7 @@ edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, free(ijsp); edg_wll_FreeStatus(&oldstat); } - else if (!edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store)) + else if (!edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store, 1)) { /* FIXME: we miss state change in the case of seq != 0 * Does anybody care? */ @@ -1046,7 +1057,7 @@ edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, edg_wll_UpdateStatistics(ctx,NULL,e,&jobstat.pub); - if (ctx->rgma_export) write2rgma_status(&jobstat.pub); + if (ctx->rgma_export) write2rgma_status(&jobstat); if (stat_out) { memcpy(stat_out,&jobstat.pub,sizeof *stat_out); diff --git a/org.glite.lb.server/src/jobstat.h b/org.glite.lb.server/src/jobstat.h index e0036fe..168add7 100644 --- a/org.glite.lb.server/src/jobstat.h +++ b/org.glite.lb.server/src/jobstat.h @@ -10,7 +10,7 @@ int edg_wll_JobStatusServer(edg_wll_Context, glite_jobid_const_t, int, edg_wll_JobStat *); -int edg_wll_intJobStatus( edg_wll_Context, glite_jobid_const_t, int, intJobStat *, int); +int edg_wll_intJobStatus( edg_wll_Context, glite_jobid_const_t, int, intJobStat *, int, int); edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context, intJobStat *, int); edg_wll_ErrorCode edg_wll_StoreIntStateEmbryonic(edg_wll_Context, edg_wlc_JobId, char *icnames, char *values, glite_lbu_bufInsert *bi); edg_wll_ErrorCode edg_wll_LoadIntState(edg_wll_Context , edg_wlc_JobId , int, int, intJobStat **); @@ -23,9 +23,9 @@ edg_wll_ErrorCode edg_wll_StepIntStateParent(edg_wll_Context,edg_wlc_JobId,edg_w intJobStat* dec_intJobStat(char *, char **); char *enc_intJobStat(char *, intJobStat* ); -void write2rgma_status(edg_wll_JobStat *); -void write2rgma_chgstatus(edg_wll_JobStat *, char *); -char* write2rgma_statline(edg_wll_JobStat *); +void write2rgma_status(intJobStat *); +void write2rgma_chgstatus(intJobStat *, char *); +char* write2rgma_statline(intJobStat *); int add_stringlist(char ***, const char *); diff --git a/org.glite.lb.server/src/jobstat_supp.c b/org.glite.lb.server/src/jobstat_supp.c index 6e4eea5..bb4217b 100644 --- a/org.glite.lb.server/src/jobstat_supp.c +++ b/org.glite.lb.server/src/jobstat_supp.c @@ -503,6 +503,8 @@ static char *enc_JobStat(char *old, edg_wll_JobStat* stat) if (ret) ret = enc_strlist(ret, stat->possible_ce_nodes); if (ret) ret = enc_int(ret, stat->suspended); if (ret) ret = enc_string(ret, stat->suspend_reason); + if (ret) ret = enc_string(ret, stat->failure_reasons); + if (ret) ret = enc_string(ret, stat->ui_host); if (ret) ret = enc_int_array(ret, stat->children_hist, EDG_WLL_NUMBER_OF_STATCODES); if (ret) ret = enc_string(ret, stat->failure_reasons); if (ret) ret = enc_int(ret, stat->remove_from_proxy); @@ -579,6 +581,8 @@ static edg_wll_JobStat* dec_JobStat(char *in, char **rest) if (tmp_in != NULL) stat->possible_ce_nodes = dec_strlist(tmp_in, &tmp_in); if (tmp_in != NULL) stat->suspended = dec_int(tmp_in, &tmp_in); if (tmp_in != NULL) stat->suspend_reason = dec_string(tmp_in, &tmp_in); + if (tmp_in != NULL) stat->failure_reasons = dec_string(tmp_in, &tmp_in); + if (tmp_in != NULL) stat->ui_host = dec_string(tmp_in, &tmp_in); if (tmp_in != NULL) { stat->children_hist = (int*)calloc(EDG_WLL_NUMBER_OF_STATCODES+1, sizeof(int)); dec_int_array(tmp_in, &tmp_in, stat->children_hist); @@ -628,6 +632,7 @@ char *enc_intJobStat(char *old, intJobStat* stat) if (ret) ret = enc_branch_states(ret, stat->branch_states); if (ret) ret = enc_timeval(ret, stat->last_pbs_event_timestamp); if (ret) ret = enc_int(ret, stat->pbs_reruning); + if (ret) ret = enc_strlist(ret, stat->user_fqans); return ret; } @@ -670,6 +675,9 @@ intJobStat* dec_intJobStat(char *in, char **rest) if (tmp_in != NULL) { stat->pbs_reruning = dec_int(tmp_in, &tmp_in); } + if (tmp_in != NULL) { + stat->user_fqans = dec_strlist(tmp_in, &tmp_in); + } } else if (tmp_in != NULL) { edg_wll_FreeStatus(pubstat); free(pubstat); diff --git a/org.glite.lb.server/src/notif_match.c b/org.glite.lb.server/src/notif_match.c index a820c1a..445683d 100644 --- a/org.glite.lb.server/src/notif_match.c +++ b/org.glite.lb.server/src/notif_match.c @@ -199,21 +199,21 @@ static int notif_match_conditions(edg_wll_Context ctx,const edg_wll_JobStat *sta static int notif_check_acl(edg_wll_Context ctx,const edg_wll_JobStat *stat,const char *recip) { edg_wll_Acl acl = calloc(1,sizeof *acl); -/* XXX: NO_GACL GACLacl *gacl; */ - void *gacl; int ret; edg_wll_ResetError(ctx); if (ctx->noAuth || strcmp(stat->owner,recip) == 0) return 1; - ret = edg_wll_DecodeACL(stat->acl,&gacl); + if (stat->acl == NULL) return 0; + + ret = edg_wll_DecodeACL(stat->acl,&acl->value); if (ret) { + edg_wll_FreeAcl(acl); edg_wll_SetError(ctx,EINVAL,"decoding ACL"); return 0; } acl->string = stat->acl; - acl->value = gacl; ret = edg_wll_CheckACL(ctx, acl, EDG_WLL_PERM_READ); diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c index 5c62ac3..f62b752 100644 --- a/org.glite.lb.server/src/query.c +++ b/org.glite.lb.server/src/query.c @@ -95,8 +95,10 @@ int edg_wll_QueryEventsServer( if (!ctx->noIndex) goto cleanup; if ( job_conditions && *job_conditions && (*job_conditions)->attr && - !(job_where = jc_to_head_where(ctx, job_conditions, &where_flags)) ) - if (!ctx->noIndex) goto cleanup; + !(job_where = jc_to_head_where(ctx, job_conditions, &where_flags)) && + edg_wll_Error(ctx,NULL,NULL) != 0 ) + /* XXX: covered with error check above: if (!ctx->noIndex) */ + goto cleanup; if (ctx->peerName) peerid = strdup(strmd5(ctx->peerName,NULL)); can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0); @@ -369,8 +371,9 @@ int edg_wll_QueryJobsServer( if ( (!ctx->noIndex && check_job_query_index(ctx, conditions)) || check_strict_jobid_cond(ctx,conditions)) goto cleanup; - if ( !(job_where = jc_to_head_where(ctx, conditions, &where_flags)) ) - if (!ctx->noIndex) goto cleanup; + if ( !(job_where = jc_to_head_where(ctx, conditions, &where_flags)) && edg_wll_Error(ctx,NULL,NULL) != 0) + /* XXX: covered with error check above: if (!ctx->noIndex) */ + goto cleanup; if ( (where_flags & FL_SEL_STATUS) ) trio_asprintf(&qbase,"SELECT DISTINCT j.dg_jobid,j.userid " diff --git a/org.glite.lb.server/src/write2rgma.c b/org.glite.lb.server/src/write2rgma.c index db16181..67ec1a0 100755 --- a/org.glite.lb.server/src/write2rgma.c +++ b/org.glite.lb.server/src/write2rgma.c @@ -149,16 +149,38 @@ static void write2rgma_line(char *line, int old_style) return; } +static char* format_strlist(char **list, char sep) +{ + char *a, *b; + int i; + + if (list && list[0]) { + a = strdup(list[0]); + for (i = 1; list[i]; i++) { + b = NULL; + trio_asprintf(&b,"%s%c%s",a,sep,list[i]); + free(a); + if (!b) { return strdup(""); } + a = b; + } + return a; + } else { + return strdup(""); + } +} -char* write2rgma_statline(edg_wll_JobStat *stat) +char* write2rgma_statline(intJobStat *intstat) { + edg_wll_JobStat *stat = &intstat->pub; char *stmt = NULL; char *string_jobid, *string_stat, *string_server; char *string_vo = NULL; + char *string_fqans = NULL; string_jobid = edg_wlc_JobIdUnparse(stat->jobId); string_stat = edg_wll_StatToString(stat->state); string_server = edg_wlc_JobIdGetServer(stat->jobId); + string_fqans = format_strlist(intstat->user_fqans, '|'); if (stat->jdl != NULL) { struct cclassad *ad; @@ -184,6 +206,8 @@ char* write2rgma_statline(edg_wll_JobStat *stat) "DESTINATION=%|Ss " "EXITCODE=%d " "DONECODE=%d " + "UIHOST=%s " + "VOMS=%s " "STATUSREASON=%|Ss" "\n", string_jobid, @@ -198,6 +222,8 @@ char* write2rgma_statline(edg_wll_JobStat *stat) (stat->destination) ? (stat->destination) : "", stat->exit_code, stat->done_code, + (stat->ui_host) ? (stat->ui_host) : "", + string_fqans ? string_fqans : "", (stat->reason) ? (stat->reason) : "" ); @@ -205,18 +231,19 @@ char* write2rgma_statline(edg_wll_JobStat *stat) free(string_jobid); free(string_stat); free(string_server); + free(string_fqans); return stmt; } -void write2rgma_status(edg_wll_JobStat *stat) +void write2rgma_status(intJobStat *intstat) { char *line; int lcgmon = 0; if (rgma_fd < -1) return; - line = write2rgma_statline(stat); + line = write2rgma_statline(intstat); if (line) { if (getenv("GLITE_WMS_LCGMON_FILE")) lcgmon = 1; write2rgma_line(line, !lcgmon); @@ -227,14 +254,14 @@ void write2rgma_status(edg_wll_JobStat *stat) /* Export status record only if new status line is different from previous one. free() prev_statline parameter. */ -void write2rgma_chgstatus(edg_wll_JobStat *stat, char *prev_statline) +void write2rgma_chgstatus(intJobStat *intstat, char *prev_statline) { char *line; int lcgmon = 0; if (rgma_fd < -1) return; - line = write2rgma_statline(stat); + line = write2rgma_statline(intstat); if (line && (!prev_statline || strcmp(line, prev_statline))) { if (getenv("GLITE_WMS_LCGMON_FILE")) lcgmon = 1; write2rgma_line(line, !lcgmon); diff --git a/org.glite.lb.server/src/ws_fault.c b/org.glite.lb.server/src/ws_fault.c index 2d76c96..94a8a73 100644 --- a/org.glite.lb.server/src/ws_fault.c +++ b/org.glite.lb.server/src/ws_fault.c @@ -48,7 +48,7 @@ void edg_wll_ErrToFault(const edg_wll_Context ctx,struct soap *soap) #endif detail->__any = NULL; - soap_receiver_fault(soap,"shit",NULL); + soap_receiver_fault(soap,"An error occurred, see detail",NULL); if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail; else soap->fault->detail = detail; } diff --git a/org.glite.lb.state-machine/interface/intjobstat.h b/org.glite.lb.state-machine/interface/intjobstat.h index 45ad4a6..db9a752 100644 --- a/org.glite.lb.state-machine/interface/intjobstat.h +++ b/org.glite.lb.state-machine/interface/intjobstat.h @@ -10,11 +10,11 @@ * (includes edg_wll_JobStat API structure) */ -/* convention: revision X.XX - DESCRIPTION */ -/* where X.XX is version from indent + 1 (version after commit) */ +/* convention: revision Y.XX - DESCRIPTION */ +/* where Z.XX is version from indent + 1 (version after commit), Y = Z+1 */ /* and DESCRIPTION is short hit why version changed */ -#define INTSTAT_VERSION "revision 1.31 - proxy merge" +#define INTSTAT_VERSION "revision 2.2 - proxy merge" // Internal error codes @@ -58,6 +58,7 @@ typedef struct _intJobStat { struct timeval last_pbs_event_timestamp; int pbs_reruning; // true if rerun event arrived + char* *user_fqans; /*!! if adding new field, modify also destroy_intJobStat_extension() */ } intJobStat; -- 1.8.2.3