separate transport and error evaluation logic from edg_wll_PurgeServer()
authorMiloš Mulač <mulac@civ.zcu.cz>
Tue, 4 Mar 2008 08:54:52 +0000 (08:54 +0000)
committerMiloš Mulač <mulac@civ.zcu.cz>
Tue, 4 Mar 2008 08:54:52 +0000 (08:54 +0000)
org.glite.lb.server/src/jobstat.c
org.glite.lb.server/src/lb_proto.c
org.glite.lb.server/src/purge.h
org.glite.lb.server/src/srv_purge.c

index 322f059..8902036 100644 (file)
@@ -132,9 +132,12 @@ int edg_wll_JobStatusServer(
                        free(ijsp);
                } else {
                        if (edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store)) {
-                               edg_wll_UpdateError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, "Could not compute job status from events");
-                               syslog(LOG_ERR, "Could not compute status of job %s events (corrupted DB?)\n",string_jobid);
-                               fprintf(stderr, "[%d] Could not compute status of job %s events (corrupted DB?)\n", getpid(), string_jobid);
+                               char *err;
+
+                               /* job has no record in states table ?? */
+                               asprintf(&err, "Could not compute status of job %s (corrupted DB?)\n",string_jobid);
+                               edg_wll_UpdateError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, err);
+                               free(err);
 
                                goto rollback;
                        }
index f4d418c..efaaf09 100644 (file)
@@ -635,11 +635,41 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx,
                }
                else if (!strncmp(requestPTR,KEY_PURGE_REQUEST,sizeof(KEY_PURGE_REQUEST)-1)) {
                        edg_wll_PurgeRequest    request;
+                       edg_wll_PurgeResult     result;
+                       int                     fatal = 0;
 
                        ctx->p_tmp_timeout.tv_sec = 86400;  
 
-                       if ( !parsePurgeRequest(ctx,messageBody,(int (*)()) edg_wll_StringToStat,&request) )
-                               edg_wll_PurgeServer(ctx, (const edg_wll_PurgeRequest *)&request);
+                       if ( !parsePurgeRequest(ctx,messageBody,(int (*)()) edg_wll_StringToStat,&request) ) {
+                               switch ( edg_wll_PurgeServer(ctx, (const edg_wll_PurgeRequest *)&request, &result)) {
+                                       case 0: if (html) ret =  HTTP_NOTIMPL;
+                                               else ret = HTTP_OK;
+
+                                               break;
+                                       case ENOENT: ret = HTTP_NOTFOUND; break;
+                                       case EPERM: ret = HTTP_UNAUTH; break;
+                                       case EINVAL: ret = HTTP_INVALID; break;
+                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
+                                       default: ret = HTTP_INTERNAL; break;
+                               }
+                               if (!html && !fatal) {
+                                       if (edg_wll_PurgeResultToXML(ctx, &result, &message))
+                                               ret = HTTP_INTERNAL;
+                                       else
+                                               printf("%s", message);
+                               }                               
+
+                               /* result is now packed in message, free it */  
+                               if ( result.server_file )
+                                       free(result.server_file);
+                               if ( result.jobs )
+                               {
+                                       for ( i = 0; result.jobs[i]; i++ )
+                                               free(result.jobs[i]);
+                                       free(result.jobs);
+                               }
+
+                       }
 
                        if ( request.jobs )
                        {
@@ -649,13 +679,6 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx,
                                free(request.jobs);
                        }
 
-                       /*
-                        * response allready sent from edg_wll_PurgeServer() - return NULL results
-                        */
-                       *response = NULL;
-                       *headersOut = NULL;
-                       *bodyOut = NULL;
-                       return edg_wll_Error(ctx,NULL,NULL);
                }
                else if (!strncmp(requestPTR,KEY_DUMP_REQUEST,sizeof(KEY_DUMP_REQUEST)-1)) {
                        edg_wll_DumpRequest     request;
index 37e534e..97f8b82 100644 (file)
@@ -11,7 +11,8 @@
  */
 int edg_wll_PurgeServer(
        edg_wll_Context ctx,
-       const edg_wll_PurgeRequest *request
+       const edg_wll_PurgeRequest *request,
+       edg_wll_PurgeResult *result
 );
 
 /** LB Proxy purge implementation
index 41b395d..d50f77d 100644 (file)
@@ -197,15 +197,12 @@ int edg_wll_PurgeServerProxy(edg_wll_Context ctx, glite_jobid_const_t job)
        }
 }
 
-int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request)
+int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request, edg_wll_PurgeResult *result)
 {
        int     i,parse = 0,dumpfile = -1;
        edg_wlc_JobId   job;
-       char    *message = NULL, *response = NULL;
        char    *tmpfname = NULL;
-       int     naffected_jobs = 0;
-       edg_wll_PurgeResult result;
-       int             ret = HTTP_OK;
+       int     naffected_jobs = 0, ret;
 
 
        if (!ctx->noAuth) {
@@ -214,7 +211,7 @@ int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request)
        }
 
        edg_wll_ResetError(ctx);
-       memset(&result, 0, sizeof(edg_wll_PurgeResult));
+       memset(result, 0, sizeof(*result));
 
 
        if ( (request->flags & EDG_WLL_PURGE_SERVER_DUMP) && 
@@ -254,9 +251,9 @@ int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request)
                        else {
                                switch (purge_one(ctx,job,dumpfile,request->flags&EDG_WLL_PURGE_REALLY_PURGE,0)) {
                                        case 0: if (request->flags & EDG_WLL_PURGE_LIST_JOBS) {
-                                                       result.jobs = realloc(result.jobs,(naffected_jobs+2) * sizeof(*result.jobs));
-                                                       result.jobs[naffected_jobs] = strdup(request->jobs[i]);
-                                                       result.jobs[naffected_jobs+1] = NULL;
+                                                       result->jobs = realloc(result->jobs,(naffected_jobs+2) * sizeof(*(result->jobs)));
+                                                       result->jobs[naffected_jobs] = strdup(request->jobs[i]);
+                                                       result->jobs[naffected_jobs+1] = NULL;
                                                }
                                                naffected_jobs++;
                                                break;
@@ -331,9 +328,9 @@ int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request)
 
                                /* XXX: change with the streaming interface */
                                        if (request->flags & EDG_WLL_PURGE_LIST_JOBS) {
-                                               result.jobs = realloc(result.jobs,(naffected_jobs+2) * sizeof(*result.jobs));
-                                               result.jobs[naffected_jobs] = job_s;
-                                               result.jobs[naffected_jobs+1] = NULL;
+                                               result->jobs = realloc(result->jobs,(naffected_jobs+2) * sizeof(*(result->jobs)));
+                                               result->jobs[naffected_jobs] = job_s;
+                                               result->jobs[naffected_jobs+1] = NULL;
                                                job_s = NULL;
                                        }
                                        naffected_jobs++;
@@ -364,57 +361,15 @@ abort:
                }
        }
 
-       switch ( edg_wll_Error(ctx,NULL,NULL) )
-       {
-               case 0:
-                       ret = HTTP_OK;
-                       break;
-               case EINVAL:
-                       ret = HTTP_INVALID;
-                       break;
-               case EPERM:
-                       ret = HTTP_UNAUTH;
-                       break;
-               case ENOENT:
-                       ret = HTTP_NOTFOUND;
-                       break;
-               
-               /* fatal errors */
-               case ENOMEM:
-                       /* fall through */
-               default:
-                       ret = HTTP_INTERNAL;
-                       break;
-       }
-       
-       if (ret != HTTP_INTERNAL) {
+       ret = edg_wll_Error(ctx,NULL,NULL);
+       if (ret == 0 || ret == ENOENT || ret == EPERM || ret == EINVAL) {
                if ( request->flags & EDG_WLL_PURGE_SERVER_DUMP && tmpfname )
                {
-                       edg_wll_CreatePurgeFileFromTmp(ctx, tmpfname, &(result.server_file));
+                       edg_wll_CreatePurgeFileFromTmp(ctx, tmpfname, &(result->server_file));
                        unlink(tmpfname);
                }
-
-               if ( edg_wll_PurgeResultToXML(ctx, &result, &message) )
-                       ret = HTTP_INTERNAL;
-               else 
-                       printf("%s", message);
        }
        
-       if ( result.server_file )
-               free(result.server_file);
-       if ( result.jobs )
-       {
-               for ( i = 0; result.jobs[i]; i++ )
-                       free(result.jobs[i]);
-               free(result.jobs);
-       }
-
-       asprintf(&response, "HTTP/1.1 %d %s", ret, edg_wll_HTTPErrorMessage(ret));
-
-       edg_wll_http_send(ctx, response, resp_headers, message,ctx->connections->serverConnection);
-       if (response) free(response);
-       if (message) free(message);
-
        return edg_wll_Error(ctx,NULL,NULL);
 }