IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 23, 2008, 11:35:39 AM (18 years ago)
Author:
eugene
Message:

split out client command from client response; allow response to return slowly

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/pcontrol/CheckBusyJob.c

    r16456 r17475  
    44int CheckBusyJob (Job *job, Host *host) {
    55
    6   int      status;
    7   int      outstate;
    8   char    *p;
    9   char     string[64];
    10   IOBuffer buffer;
     6  int status;
    117
    128  /* we are checking a job which is currently busy.  it has been pulled from the
     
    1612  ASSERT (job, "job not set");
    1713  ASSERT (host, "host not set");
    18 
    1914  ASSERT (host == (Host *) job[0].host, "invalid host");
    2015  ASSERT (job  == (Job *) host[0].job, "invalid job");
    2116
    22   InitIOBuffer (&buffer, 0x100);
    23 
    24   status = PclientCommand (host, "status", PCLIENT_PROMPT, &buffer);
     17  status = PclientCommand (host, "status", PCLIENT_PROMPT, PCONTROL_RESP_CHECK_BUSY_JOB);
    2518
    2619  /* check on success of pclient command */
    2720  switch (status) {
    2821    case PCLIENT_DOWN:
    29       HarvestHost (host[0].pid);
     22      // free the realhost name
     23      if (job[0].realhost) free (job[0].realhost);
     24      job[0].realhost = NULL;
     25
    3026      // unlink host & job
     27      if (VerboseMode()) gprint (GP_ERR, "host %s is down\n", host[0].hostname);
    3128      job[0].host = NULL;
    3229      host[0].job = NULL;
    33       if (job[0].realhost) free (job[0].realhost);
    34       job[0].realhost = NULL;
     30      HarvestHost (host[0].pid);
    3531      PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
    3632      PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
    37       FreeIOBuffer (&buffer);
    3833      return (FALSE);
    39 
    40     case PCLIENT_HUNG:
    41       // don't do anything drastic, just keep trying
    42       if (DEBUG || VerboseMode()) gprint (GP_ERR, "client is busy, not responding");
    43       PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
    44       PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
    45       FreeIOBuffer (&buffer);
    46       return (TRUE);
    4734
    4835    case PCLIENT_GOOD:
    4936      if (DEBUG || VerboseMode()) gprint (GP_ERR, "message received (CheckBusyJob)");
    50       break;
     37      PutHost (host, PCONTROL_HOST_RESP, STACK_BOTTOM);
     38      PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
     39      return (TRUE);
    5140
    5241    default:
    5342      ABORT ("unknown status for pclient command"); 
    5443  }
     44}
     45
     46int CheckBusyJobResponse (Host *host) {
     47
     48  int      outstate;
     49  char    *p;
     50  char     string[64];
     51  IOBuffer *buffer;
     52  Job *job;
     53
     54  /* job must have assigned host */
     55  ASSERT (host, "missing host");
     56  ASSERT (host[0].job, "missing job");
     57  buffer = &host[0].comms_buffer;
     58  job = (Job *) host[0].job;
    5559
    5660  /** host is up, need to parse message **/
    57   p = memstr (buffer.buffer, "STATUS", buffer.Nbuffer);
    58   // this condition means the message is garbage.  toss it and try again
    59   if (p == NULL) {
    60     PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
    61     PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
    62     FreeIOBuffer (&buffer);
    63     return (FALSE);
    64   }
     61  p = memstr (buffer[0].buffer, "STATUS", buffer[0].Nbuffer);
     62  ASSERT (p != NULL, "missing STATUS in pclient message");
    6563
    6664  sscanf (p, "%*s %s", string);
     
    7169    PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
    7270    PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
    73     FreeIOBuffer (&buffer);
    7471    return (TRUE);
    7572  }
     
    7976  if (!strcmp(string, "EXIT")) outstate = PCONTROL_JOB_EXIT;
    8077  if (!strcmp(string, "CRASH")) outstate = PCONTROL_JOB_CRASH;
    81   ASSERT (outstate != PCONTROL_JOB_BUSY, "should not reach here (CheckJob)");
     78  ASSERT (outstate != PCONTROL_JOB_BUSY, "invalid status response (CheckBusyJobResponse)");
    8279
    8380  /* parse the exit status and sizes of output buffers */
    84   p = memstr (buffer.buffer, "EXITST", buffer.Nbuffer);
     81  p = memstr (buffer[0].buffer, "EXITST", buffer[0].Nbuffer);
    8582  sscanf (p, "%*s %d", &job[0].exit_status);
    86   p = memstr (buffer.buffer, "STDOUT", buffer.Nbuffer);
     83  p = memstr (buffer[0].buffer, "STDOUT", buffer[0].Nbuffer);
    8784  sscanf (p, "%*s %d", &job[0].stdout_size);
    88   p = memstr (buffer.buffer, "STDERR", buffer.Nbuffer);
     85  p = memstr (buffer[0].buffer, "STDERR", buffer[0].Nbuffer);
    8986  sscanf (p, "%*s %d", &job[0].stderr_size);
    9087
     
    9895  PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
    9996  PutJobSetState (job, PCONTROL_JOB_DONE, STACK_BOTTOM, outstate);
    100   gettimeofday (&job[0].stop, (void *) NULL);
     97  gettimeofday (&job[0].stop, NULL);
    10198  job[0].dtime = DTIME(job[0].stop, job[0].start);
    102   FreeIOBuffer (&buffer);
    10399  return (TRUE);
    104100}
Note: See TracChangeset for help on using the changeset viewer.