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
- 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
+
# $Header$
-module.version=1.8.2
+module.version=1.9.1
module.age=1
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;
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;
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);
}
}
}
} 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:;
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);
}
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;
}
#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;
}
+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");
{
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");
//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.");
}
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 ?? */
glite_jobid_const_t job,
int flags,
intJobStat *intstat,
- int update_db)
+ int update_db,
+ int add_fqans)
{
/* Local variables */
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;
/* 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,
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
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 */
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);
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 */
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);
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? */
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);
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 **);
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 *);
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);
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);
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;
}
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);
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);
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);
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 "
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;
"DESTINATION=%|Ss "
"EXITCODE=%d "
"DONECODE=%d "
+ "UIHOST=%s "
+ "VOMS=%s "
"STATUSREASON=%|Ss"
"\n",
string_jobid,
(stat->destination) ? (stat->destination) : "",
stat->exit_code,
stat->done_code,
+ (stat->ui_host) ? (stat->ui_host) : "",
+ string_fqans ? string_fqans : "",
(stat->reason) ? (stat->reason) : ""
);
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);
/* 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);
#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;
}
* (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
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;