merge 313_5
authorAleš Křenek <ljocha@ics.muni.cz>
Wed, 25 Jun 2008 13:13:16 +0000 (13:13 +0000)
committerAleš Křenek <ljocha@ics.muni.cz>
Wed, 25 Jun 2008 13:13:16 +0000 (13:13 +0000)
14 files changed:
org.glite.lb.server/config/startup
org.glite.lb.server/project/ChangeLog
org.glite.lb.server/project/version.properties
org.glite.lb.server/src/bkindex.c
org.glite.lb.server/src/bkserverd.c
org.glite.lb.server/src/db_store.c
org.glite.lb.server/src/jobstat.c
org.glite.lb.server/src/jobstat.h
org.glite.lb.server/src/jobstat_supp.c
org.glite.lb.server/src/notif_match.c
org.glite.lb.server/src/query.c
org.glite.lb.server/src/write2rgma.c
org.glite.lb.server/src/ws_fault.c
org.glite.lb.state-machine/interface/intjobstat.h

index 9dcbf96..8d748e0 100755 (executable)
@@ -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
index 1d7e3c8..a8e372c 100644 (file)
 - 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
+
index bf1b621..2fa2c98 100644 (file)
@@ -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);
 }
 
index b85470c..8f388aa 100644 (file)
@@ -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");
index ff8ca8f..4438ac7 100644 (file)
@@ -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.");
                        }
index ba48613..527a928 100644 (file)
@@ -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);
index e0036fe..168add7 100644 (file)
@@ -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 *);
 
index 6e4eea5..bb4217b 100644 (file)
@@ -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);
index a820c1a..445683d 100644 (file)
@@ -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);
 
index 5c62ac3..f62b752 100644 (file)
@@ -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 "
index db16181..67ec1a0 100755 (executable)
@@ -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);
index 2d76c96..94a8a73 100644 (file)
@@ -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;
 }
index 45ad4a6..db9a752 100644 (file)
  * (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;