From: Miloš Mulač Date: Tue, 4 Mar 2008 08:54:52 +0000 (+0000) Subject: separate transport and error evaluation logic from edg_wll_PurgeServer() X-Git-Tag: merge_transactions_src~11 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=1a7ce3406c210993b6bb51d59ce49bc4141641c9;p=jra1mw.git separate transport and error evaluation logic from edg_wll_PurgeServer() --- diff --git a/org.glite.lb.server/src/jobstat.c b/org.glite.lb.server/src/jobstat.c index 322f059..8902036 100644 --- a/org.glite.lb.server/src/jobstat.c +++ b/org.glite.lb.server/src/jobstat.c @@ -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; } diff --git a/org.glite.lb.server/src/lb_proto.c b/org.glite.lb.server/src/lb_proto.c index f4d418c..efaaf09 100644 --- a/org.glite.lb.server/src/lb_proto.c +++ b/org.glite.lb.server/src/lb_proto.c @@ -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; diff --git a/org.glite.lb.server/src/purge.h b/org.glite.lb.server/src/purge.h index 37e534e..97f8b82 100644 --- a/org.glite.lb.server/src/purge.h +++ b/org.glite.lb.server/src/purge.h @@ -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 diff --git a/org.glite.lb.server/src/srv_purge.c b/org.glite.lb.server/src/srv_purge.c index 41b395d..d50f77d 100644 --- a/org.glite.lb.server/src/srv_purge.c +++ b/org.glite.lb.server/src/srv_purge.c @@ -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); }