From: Darren Nickerson Date: Fri, 15 Feb 2002 04:20:48 +0000 (+0000) Subject: [Bug 78] RFE: new status flag F=Failed X-Git-Tag: HYLAFAX-4_1_1~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bbc8a0661393ea4e04b74e3855d4e6733c0e0dac;p=thirdparty%2FHylaFAX.git [Bug 78] RFE: new status flag F=Failed Change status of completed jobs to: D - for transmitted jobs F - for failed jobs. Contributed by Patrice Fournier. --- diff --git a/faxd/FaxRequest.c++ b/faxd/FaxRequest.c++ index dd191f9b..7b5d9dbf 100644 --- a/faxd/FaxRequest.c++ +++ b/faxd/FaxRequest.c++ @@ -368,7 +368,7 @@ FaxRequest::readQFile(bool& rejectJob) * ``suitable values'' by higher-level code (i.e. * the scheduler). */ - if (state < state_suspended || state > state_done) { + if (state < state_suspended || state > state_failed) { error("Invalid scheduler state %u in job request", state); rejectJob = true; } diff --git a/faxd/FaxRequest.h b/faxd/FaxRequest.h index 1f8daa21..7c0a5794 100644 --- a/faxd/FaxRequest.h +++ b/faxd/FaxRequest.h @@ -87,7 +87,8 @@ public: state_blocked = 4, // blocked by concurrent activity state_ready = 5, // ready to be go, waiting for resources state_active = 6, // actively being processed - state_done = 7 // processing completed + state_done = 7, // processing completed with success + state_failed = 8 // processing completed with a failure }; struct stringval { // string-valued item const char* name; diff --git a/faxd/faxQueueApp.c++ b/faxd/faxQueueApp.c++ index 326ef528..04a73cd0 100644 --- a/faxd/faxQueueApp.c++ +++ b/faxd/faxQueueApp.c++ @@ -226,7 +226,7 @@ faxQueueApp::processJob(Job& job, FaxRequest* req, updateRequest(*req, job); if (!prepareJobNeeded(job, *req, status)) { if (status != Job::done) { - job.state = FaxRequest::state_done; + job.state = FaxRequest::state_failed; deleteRequest(job, req, status, true); setDead(job); } else @@ -1362,7 +1362,7 @@ faxQueueApp::sendJobDone(Job& job, int status) * notified of the requeue as well as the timeout? */ fxAssert(!job.suspendPending, "Interrupted job timed out"); - job.state = FaxRequest::state_done; + job.state = FaxRequest::state_failed; deleteRequest(job, req, Job::timedout, true); setDead(job); } else if (req->status == send_retry) { @@ -1444,14 +1444,16 @@ faxQueueApp::sendJobDone(Job& job, int status) job.suspendPending = false; delete req; // implicit unlock of q file } else { - job.state = FaxRequest::state_done; - traceQueue(job, "SEND DONE: " | strTime(duration)); - Trigger::post(Trigger::SEND_DONE, job); // NB: always notify client if job failed - if (req->status == send_failed) + if (req->status == send_failed) { + job.state = FaxRequest::state_failed; deleteRequest(job, req, Job::failed, true, fmtTime(duration)); - else + } else { + job.state = FaxRequest::state_done; deleteRequest(job, req, Job::done, false, fmtTime(duration)); + } + traceQueue(job, "SEND DONE: " | strTime(duration)); + Trigger::post(Trigger::SEND_DONE, job); setDead(job); } } @@ -1503,7 +1505,9 @@ faxQueueApp::setSleep(Job& job, time_t tts) void faxQueueApp::setDead(Job& job) { - job.state = FaxRequest::state_done; + if (job.state != FaxRequest::state_done + && job.state != FaxRequest::state_failed) + job.state = FaxRequest::state_failed; job.suspendPending = false; traceJob(job, "DEAD"); Trigger::post(Trigger::JOB_DEAD, job); @@ -1642,6 +1646,7 @@ faxQueueApp::submitJob(Job& job, FaxRequest& req, bool checkState) setSuspend(job); return (true); case FaxRequest::state_done: + case FaxRequest::state_failed: setDead(job); return (true); } @@ -1718,10 +1723,12 @@ faxQueueApp::suspendJob(Job& job, bool abortActive) * Recheck the job state; it may have changed while * we were waiting for the subprocess to terminate. */ - if (job.state != FaxRequest::state_done) + if (job.state != FaxRequest::state_done && + job.state != FaxRequest::state_failed) break; /* fall thru... */ case FaxRequest::state_done: + case FaxRequest::state_failed: return (false); case FaxRequest::state_sleeping: case FaxRequest::state_pending: @@ -1780,7 +1787,7 @@ faxQueueApp::terminateJob(const fxStr& jobid, JobStatus why) { Job* job = Job::getJobByID(jobid); if (job && suspendJob(*job, true)) { - job->state = FaxRequest::state_done; + job->state = FaxRequest::state_failed; Trigger::post(Trigger::JOB_KILL, *job); FaxRequest* req = readRequest(*job); if (req) @@ -1800,7 +1807,7 @@ faxQueueApp::rejectJob(Job& job, FaxRequest& req, const fxStr& reason) req.status = send_failed; req.notice = reason; traceServer("JOB " | job.jobid | ": " | reason); - job.state = FaxRequest::state_done; + job.state = FaxRequest::state_failed; Trigger::post(Trigger::JOB_REJECT, job); setDead(job); // dispose of job } @@ -1858,7 +1865,7 @@ faxQueueApp::timeoutJob(Job& job) Trigger::post(Trigger::JOB_TIMEDOUT, job); if (job.state != FaxRequest::state_active) { job.remove(); // remove from sleep queue - job.state = FaxRequest::state_done; + job.state = FaxRequest::state_failed; FaxRequest* req = readRequest(job); if (req) deleteRequest(job, req, Job::timedout, true); @@ -1880,7 +1887,7 @@ faxQueueApp::timeoutJob(Job& job) void faxQueueApp::timeoutJob(Job& job, FaxRequest& req) { - job.state = FaxRequest::state_done; + job.state = FaxRequest::state_failed; traceQueue(job, "KILL TIME EXPIRED"); Trigger::post(Trigger::JOB_TIMEDOUT, job); deleteRequest(job, req, Job::timedout, true); @@ -1906,7 +1913,8 @@ faxQueueApp::submitJob(const fxStr& jobid, bool checkState) delete req; // NB: unlock qfile } else setDead(*job); // XXX??? - } else if (job->state == FaxRequest::state_done) + } else if (job->state == FaxRequest::state_done || + job->state == FaxRequest::state_failed) jobError(*job, "Cannot resubmit a completed job"); else ok = true; // other, nothing to do @@ -1942,17 +1950,19 @@ faxQueueApp::submitJob(const fxStr& jobid, bool checkState) */ bool reject; if (req.readQFile(reject) && !reject && - req.state != FaxRequest::state_done) { + req.state != FaxRequest::state_done && + req.state != FaxRequest::state_failed) { status = submitJob(req, checkState); } else if (reject) { Job job(req); - job.state = FaxRequest::state_done; + job.state = FaxRequest::state_failed; req.status = send_failed; req.notice = "Invalid or corrupted job description file"; traceServer("JOB " | jobid | ": " | req.notice); // NB: this may not work, but we try... deleteRequest(job, req, Job::rejected, true); - } else if (req.state == FaxRequest::state_done) { + } else if (req.state == FaxRequest::state_done || + req.state == FaxRequest::state_failed) { logError("JOB %s: Cannot resubmit a completed job", (const char*) jobid); } else @@ -2312,7 +2322,10 @@ faxQueueApp::deleteRequest(Job& job, FaxRequest& req, JobStatus why, } req.qfile = dest; // moved to doneq job.file = req.qfile; // ...and track change - req.state = FaxRequest::state_done; // job is definitely done + if (why == Job::done) + req.state = FaxRequest::state_done; // job is definitely done + else + req.state = FaxRequest::state_failed;// job is definitely done req.pri = job.pri; // just in case someone cares req.tts = Sys::now(); // mark job termination time req.writeQFile(); @@ -2974,12 +2987,12 @@ vtraceJob(const Job& job, const char* fmt, va_list ap) { static const char* stateNames[] = { "state#0", "suspended", "pending", "sleeping", "blocked", - "ready", "active", "done" + "ready", "active", "done", "failed" }; time_t now = Sys::now(); vlogInfo( "JOB " | job.jobid - | " (" | stateNames[job.state&7] + | " (" | stateNames[job.state%9] | " dest " | job.dest | fxStr::format(" pri %u", job.pri) | " tts " | strTime(job.tts - now) diff --git a/hfaxd/Jobs.c++ b/hfaxd/Jobs.c++ index d3642f81..f5190a2d 100644 --- a/hfaxd/Jobs.c++ +++ b/hfaxd/Jobs.c++ @@ -1188,6 +1188,7 @@ HylaFAXServer::deleteJob(const char* jobid) Job* job = preJobCmd("delete", jobid, emsg); if (job) { if (job->state != FaxRequest::state_done && + job->state != FaxRequest::state_failed && job->state != FaxRequest::state_suspended) { reply(504, "Job %s not deleted; use JSUSP first.", jobid); return; @@ -1269,7 +1270,8 @@ HylaFAXServer::operateOnJob(const char* jobid, const char* what, const char* op) fxStr emsg; Job* job = preJobCmd(what, jobid, emsg); if (job) { - if (job->state == FaxRequest::state_done) { + if (job->state == FaxRequest::state_done || + job->state == FaxRequest::state_failed) { reply(504, "Job %s not %sed; already done.", jobid, what); return; } @@ -1324,7 +1326,8 @@ HylaFAXServer::submitJob(const char* jobid) fxStr emsg; Job* job = preJobCmd("submit", jobid, emsg); if (job) { - if (job->state == FaxRequest::state_done) { + if (job->state == FaxRequest::state_done || + job->state == FaxRequest::state_failed) { reply(504, "Job %s not submitted; already done.", jobid); return; } @@ -1381,7 +1384,8 @@ HylaFAXServer::waitForJob(const char* jobid) reply(504, "Cannot wait for default job."); return; } - if (job->state == FaxRequest::state_done) { + if (job->state == FaxRequest::state_done || + job->state == FaxRequest::state_failed) { reply(216, "Job %s done (already).", jobid); return; } @@ -1402,7 +1406,8 @@ HylaFAXServer::waitForJob(const char* jobid) * blindly hold a reference to the in-memory structure. */ job = findJob(jobid, emsg); - if (!job || job->state == FaxRequest::state_done) + if (!job || job->state == FaxRequest::state_done || + job->state == FaxRequest::state_failed) break; } reply(216, "Wait for job %s completed.", jobid); @@ -1732,7 +1737,7 @@ HylaFAXServer::Jprintf(FILE* fd, const char* fmt, const Job& job) break; #endif /* OLDPROTO_SUPPORT */ case 'a': - fprintf(fd, fspec, "?TPSBWRD"[job.state]); + fprintf(fd, fspec, "?TPSBWRDF"[job.state]); break; case 'b': fprintf(fd, fspec, job.ntries); diff --git a/hfaxd/SNPPServer.c++ b/hfaxd/SNPPServer.c++ index bcc0a669..2181a8bb 100644 --- a/hfaxd/SNPPServer.c++ +++ b/hfaxd/SNPPServer.c++ @@ -1289,7 +1289,9 @@ SNPPServer::sendCmd(void) Job* job = findJob(msgs[i], emsg); if (!job) msgs.remove(i), n--; - else if (!job->queued && job->state != FaxRequest::state_done) + else if (!job->queued && + job->state != FaxRequest::state_done && + job->state != FaxRequest::state_failed) jobsPending = true; } } while (IS(WAITTRIG) && jobsPending); diff --git a/man/faxstat.1 b/man/faxstat.1 index c84d663f..548c81ed 100644 --- a/man/faxstat.1 +++ b/man/faxstat.1 @@ -352,7 +352,8 @@ format produces: ``W'' for a job waiting for resources such as a free modem, ``R'' for a job that is actively running, and -``D'' for a job that is done. +``D'' for a job that is done and was a success. +``F'' for a job that failed to complete. .IP The .B h