IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 4762


Ignore:
Timestamp:
Aug 13, 2005, 10:30:13 AM (21 years ago)
Author:
eugene
Message:

working on speed issues

Location:
trunk/Ohana/src/opihi
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/include/pcontrol.h

    r4706 r4762  
    124124void DelHost (Host *host);
    125125int CheckSystem ();
    126 int CheckBusyJobs ();
    127 int CheckDoneJobs ();
    128 int CheckDoneHosts ();
    129 int CheckLiveHosts ();
    130 int CheckDownHosts ();
    131 int CheckIdleHosts ();
     126int CheckBusyJobs (float delay);
     127int CheckDoneJobs (float delay);
     128int CheckDoneHosts (float delay);
     129int CheckLiveHosts (float delay);
     130int CheckDownHosts (float delay);
     131int CheckIdleHosts (float delay);
    132132int CheckIdleHost (Host *host);
    133133void InitIDs ();
  • trunk/Ohana/src/opihi/include/psched.h

    r4714 r4762  
    174174int KillControllerJob (Job *job);
    175175int CheckControllerStatus ();
     176int TestElapsedCheck ();
     177
  • trunk/Ohana/src/opihi/pantasks/CheckController.c

    r4714 r4762  
    33int CheckController () {
    44
     5  float dtime;
     6  struct timeval start, stop;
    57  char *p, *q;
    68  int i, Njobs, status, JobID;
    79  Job *job;
    810  IOBuffer buffer;
     11
     12  gettimeofday (&start, (void *) NULL);
    913
    1014  /* get the list of completed jobs (exit / crash), update the job status */
     
    3236  }
    3337
     38  gettimeofday (&stop, (void *) NULL);
     39  dtime = DTIME (stop, start);
     40  if (VerboseMode()) fprintf (stderr, "check stack %f\n", dtime);
     41  gettimeofday (&start, (void *) NULL);
     42
    3443  p = buffer.buffer;
    35   for (i = 0; i < Njobs; i++) {
     44  for (i = 0; (i < Njobs) && !TestElapsedCheck(); i++) {
    3645    q = strchr (p, '\n');
    3746    if (q == NULL) {
     
    5059    CheckControllerJob (job);
    5160  }
    52  
     61  gettimeofday (&stop, (void *) NULL);
     62  dtime = DTIME (stop, start);
     63  if (VerboseMode()) fprintf (stderr, "check %d jobs %f\n", i, dtime);
     64
     65  if (TestElapsedCheck()) return (TRUE);
     66
    5367  /*** check CRASH jobs ***/
    5468  FlushIOBuffer (&buffer);
     
    7286
    7387  p = buffer.buffer;
    74   for (i = 0; i < Njobs; i++) {
     88  for (i = 0; (i < Njobs) && !TestElapsedCheck(); i++) {
    7589    q = strchr (p, '\n');
    7690    if (q == NULL) {
  • trunk/Ohana/src/opihi/pantasks/CheckJobs.c

    r4705 r4762  
    8383    /* reset polling clock */
    8484    SetTaskTimer (&job[0].last);
     85    if (TestElapsedCheck()) return (TRUE);
    8586  }
    8687  return (TRUE);
  • trunk/Ohana/src/opihi/pantasks/CheckSystem.c

    r4714 r4762  
    11# include "psched.h"
     2
     3# define MAX_DELAY 0.1
     4struct timeval start;
     5static int Ncheck = 0;
    26
    37int CheckSystem () {
    48
    5   /* need to make a timeout: if this process lasts too long,
    6      we should return so the user can get input in.  this cannot
    7      just be a return, because we need to hit each of the elements
    8      eventually
    9   */
    10   struct timeval start, stop;
    11   double dtime;
    12  
    139  gettimeofday (&start, (void *) NULL);
    14   CheckTasks ();
     10
     11  if (Ncheck < 5) {
     12    CheckTasks ();
     13    CheckJobs ();
     14    Ncheck ++;
     15  } else {
     16    CheckController ();
     17    CheckControllerOutput ();
     18    Ncheck = 0;
     19  }
     20  return (TRUE);
     21}
     22
     23int TestElapsedCheck () {
     24
     25  struct timeval stop;
     26  float dtime;
     27
    1528  gettimeofday (&stop, (void *) NULL);
    1629  dtime = DTIME (stop, start);
    17   if (VerboseMode()) fprintf (stderr, "check 1: %f seconds\n", dtime);
     30  if (dtime > MAX_DELAY) return (TRUE);
     31  return (FALSE);
     32}
    1833
    19   gettimeofday (&start, (void *) NULL);
    20   CheckJobs ();
    21   gettimeofday (&stop, (void *) NULL);
    22   dtime = DTIME (stop, start);
    23   if (VerboseMode()) fprintf (stderr, "check 2: %f seconds\n", dtime);
    24 
    25   gettimeofday (&start, (void *) NULL);
    26   CheckController ();
    27   gettimeofday (&stop, (void *) NULL);
    28   dtime = DTIME (stop, start);
    29   if (VerboseMode()) fprintf (stderr, "check 3: %f seconds\n", dtime);
    30 
    31   gettimeofday (&start, (void *) NULL);
    32   CheckControllerOutput ();
    33   gettimeofday (&stop, (void *) NULL);
    34   dtime = DTIME (stop, start);
    35   if (VerboseMode()) fprintf (stderr, "check 4: %f seconds\n", dtime);
    36 
    37   return (TRUE);
    38 }
     34  /* do we really need to check the controller on every call?
     35     or perhaps alternate?
     36  */
  • trunk/Ohana/src/opihi/pantasks/CheckTasks.c

    r4697 r4762  
    3333    gettimeofday (&task[0].last, (void *) NULL);
    3434    task[0].Njobs ++;
     35
     36    if (TestElapsedCheck()) return (TRUE);
    3537  }
    3638  return (TRUE);
  • trunk/Ohana/src/opihi/pantasks/ControllerOps.c

    r4714 r4762  
    11# include "psched.h"
    22/* adding a new host can delay controller up to a second or so */
    3 # define CONTROLLER_TIMEOUT 200
     3# define CONTROLLER_TIMEOUT 500
    44# define CONNECT_TIMEOUT 300
    55
     
    1818/* check job / get output if done */
    1919int CheckControllerJob (Job *job) {
    20 
     20  struct timeval start, stop;
     21  float dtime;
     22
     23  gettimeofday (&start, (void *) NULL);
    2124  CheckControllerJobStatus (job);
     25  gettimeofday (&stop, (void *) NULL);
     26  dtime = DTIME (stop, start);
     27  if (VerboseMode()) fprintf (stderr, "check job status %f\n", dtime);
    2228
    2329  if ((job[0].state == JOB_EXIT) || (job[0].state == JOB_CRASH)) {
     30    gettimeofday (&start, (void *) NULL);
    2431    GetJobOutput ("stdout", job[0].pid, &job[0].stdout, job[0].stdout_size);
     32    gettimeofday (&stop, (void *) NULL);
     33    dtime = DTIME (stop, start);
     34    if (VerboseMode()) fprintf (stderr, "get stdout %f\n", dtime);
     35
    2536    GetJobOutput ("stderr", job[0].pid, &job[0].stderr, job[0].stderr_size);
    2637    DeleteControllerJob (job);
     
    97108  int i, status, Nstart;
    98109  char *line;
     110  struct timespec request, remain;
     111
     112  /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */
     113  request.tv_sec = 0;
     114  request.tv_nsec = 100000;
    99115
    100116  /* flush any earlier messages */
     
    117133      line = memstr (buffer[0].buffer, CONTROLLER_PROMPT, buffer[0].Nbuffer);
    118134    }
    119     if (status == -1) usleep (10000);
     135    if (status == -1) nanosleep (&request, &remain);
    120136  }
    121137  if (status ==  0) return (CONTROLLER_DOWN);
     
    256272
    257273  /* try to get evidence connection is alive - wait upto a few seconds */
     274  /* connection is likely slow; don't bother with nanosleep here */
    258275  p = NULL;
    259276  status = -1;
     
    300317int ControllerCommand (char *cmd, char *response, IOBuffer *buffer) {
    301318
    302   int i;
    303   int status;
     319  int i, status;
    304320  char *line;
     321  struct timespec request, remain;
     322
     323  /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */
     324  request.tv_sec = 0;
     325  request.tv_nsec = 100000;
    305326
    306327  ReadtoIOBuffer (buffer, stdout_cntl);
     
    323344    status = ReadtoIOBuffer (buffer, stdout_cntl);
    324345    line = memstr (buffer[0].buffer, response, buffer[0].Nbuffer);
    325     if (status == -1) usleep (10000);
     346    if (status == -1) nanosleep (&request, &remain);
    326347  }
    327348  if (status ==  0) {
     
    341362    bzero (buffer[0].buffer + buffer[0].Nbuffer, buffer[0].Nalloc - buffer[0].Nbuffer);
    342363  }
    343   if (VerboseMode()) fprintf (stderr, "message received\n");
     364  if (VerboseMode()) fprintf (stderr, "message received, %d cycles\n", i);
    344365  return (TRUE);
    345366}
  • trunk/Ohana/src/opihi/pantasks/controller_output.c

    r4693 r4762  
    88  }
    99
     10  CheckControllerOutput ();
    1011  PrintControllerOutput ();
    1112  return (TRUE);
  • trunk/Ohana/src/opihi/pclient/ChildOps.c

    r4689 r4762  
    2929  struct timeval now;
    3030
    31   /* this is really lame : check if we are calling too quickly */
     31  /* this is really lame : check if we are calling too quickly
     32     this is unneeded: pclient.c rl_keyboard_input_timeout limits
     33     the rate
    3234  gettimeofday (&now, NULL);
    3335  dtime = DTIME (now, last);
     
    3638  if (dtime > 0.01) Nbad = 0;
    3739  if (Nbad > 10) exit (2);
     40  */
    3841
    3942  /* this is a bit lame : we must exit if calling process exits */
  • trunk/Ohana/src/opihi/pclient/init.c

    r4748 r4762  
    1616  {"stdout",    stdout_pclient,   "get stdout buffer"},
    1717  {"stderr",    stderr_pclient,   "get stderr buffer"},
    18   {"version",     version,      "show version information"},
     18  {"version",   version,      "show version information"},
    1919};
    2020
  • trunk/Ohana/src/opihi/pclient/job.c

    r4691 r4762  
    88  if (argc < 2) {
    99    fprintf (stderr, "USAGE: job (arg0) (arg1) ... (argN)\n");
    10     fprintf (stdout, "STATUS %d\n", -2);
     10    fprintf (GetOutfile(), "STATUS %d\n", -2);
    1111    return (FALSE);
    1212  }
     
    1414  if (ChildStatus != PCLIENT_NONE) {
    1515    fprintf (stderr, "need to clear existing child\n");
    16     fprintf (stdout, "STATUS %d\n", -3);
     16    fprintf (GetOutfile(), "STATUS %d\n", -3);
    1717    return (FALSE);
    1818  }
     
    3131  pid = fork ();
    3232  if (!pid) { /* must be child process */
    33     fprintf (stderr, "starting child process %s...\n", targv[0]);
     33    /* fprintf (stderr, "starting child process %s...\n", targv[0]); */
    3434
    3535    /* close the other ends of the pipes */
     
    7373  ChildPID = pid;
    7474
    75   fprintf (stdout, "STATUS %d\n", ChildPID);
     75  fprintf (GetOutfile(), "STATUS %d\n", ChildPID);
    7676  return (TRUE);
    7777
     
    8585  if (child_stderr_fd[1] != 0) close (child_stderr_fd[1]);
    8686
    87   fprintf (stdout, "STATUS %d\n", -1);
     87  fprintf (GetOutfile(), "STATUS %d\n", -1);
    8888  return (FALSE);
    8989}
  • trunk/Ohana/src/opihi/pclient/pclient.c

    r4714 r4762  
    2020  rl_attempted_completion_function = command_completer;
    2121  rl_event_hook = CheckChild;
     22  rl_set_keyboard_input_timeout (1000);
    2223
    2324  set_str_variable ("HISTORY", opihi_history);
  • trunk/Ohana/src/opihi/pclient/reset.c

    r4689 r4762  
    44
    55  int i, result, waitstatus;
     6  struct timespec request, remain;
    67
    78  if (argc != 1) {
    89    fprintf (stderr, "USAGE: reset\n");
    9     fprintf (stdout, "STATUS -1\n");
     10    fprintf (GetOutfile(), "STATUS -1\n");
    1011    return (FALSE);
    1112  }
     
    1314  if (ChildStatus == PCLIENT_NONE) {
    1415    fprintf (stderr, "no child process, cannot reset\n");
    15     fprintf (stdout, "STATUS 2\n");
     16    fprintf (GetOutfile(), "STATUS 2\n");
    1617    return (TRUE);
    1718  }
    1819
     20  /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */
     21  request.tv_sec = 0;
     22  request.tv_nsec = 100000;
     23
    1924  if (ChildStatus == PCLIENT_BUSY) {
    20     /* send SIGTERM signal to job */
     25    /* job is still running, send SIGTERM signal to job */
    2126    kill (ChildPID, SIGTERM);
    22     result = 0;
    23     for (i = 0; (i < 10) && (result == 0); i++) {
    24       usleep (10000);  /* 10 ms is min */
     27    result = waitpid (ChildPID, &waitstatus, WNOHANG);
     28    for (i = 0; (i < 500) && (result == 0); i++) {
     29      nanosleep (&request, &remain);
    2530      result = waitpid (ChildPID, &waitstatus, WNOHANG);
    2631    }
    2732    if (result) goto reset_job;
    2833
    29     /* send SIGTERM signal to job */
     34    /* job did not exit, send SIGKILL signal to job */
    3035    kill (ChildPID, SIGKILL);
    31     result = 0;
    32     for (i = 0; (i < 10) && (result == 0); i++) {
    33       usleep (10000);  /* 10 ms is min */
     36    result = waitpid (ChildPID, &waitstatus, WNOHANG);
     37    for (i = 0; (i < 500) && (result == 0); i++) {
     38      nanosleep (&request, &remain);
    3439      result = waitpid (ChildPID, &waitstatus, WNOHANG);
    3540    }
     
    3843    /* total failure, don't reset */
    3944    fprintf (stderr, "child process %d is hung, cannot reset\n", ChildPID);
    40     fprintf (stdout, "STATUS 0\n");
     45    fprintf (GetOutfile(), "STATUS 0\n");
    4146    return (FALSE);
    4247  }
     
    5762  ChildExitStatus = 0;
    5863
    59   fprintf (stdout, "STATUS 1\n");
     64  fprintf (GetOutfile(), "STATUS 1\n");
    6065  return (TRUE);
    6166}
     
    6873*/
    6974
     75/* the linux kernel timer sticks in a 10ms lag between kill and the harvest */
  • trunk/Ohana/src/opihi/pclient/status.c

    r3187 r4762  
    1515  if (ChildStatus == PCLIENT_CRASH) strcpy (status_string, "CRASH");
    1616
    17   fprintf (stdout, "STATUS %s\n", status_string);
    18   fprintf (stdout, "EXITST %d\n", ChildExitStatus);
    19   fprintf (stdout, "STDOUT %d\n", child_stdout.Nbuffer);
    20   fprintf (stdout, "STDERR %d\n", child_stderr.Nbuffer);
     17  fprintf (GetOutfile(), "STATUS %s\n", status_string);
     18  fprintf (GetOutfile(), "EXITST %d\n", ChildExitStatus);
     19  fprintf (GetOutfile(), "STDOUT %d\n", child_stdout.Nbuffer);
     20  fprintf (GetOutfile(), "STDERR %d\n", child_stderr.Nbuffer);
     21
     22  set_str_variable ("JOBSTATUS", status_string);
    2123  return (TRUE);
    2224}
  • trunk/Ohana/src/opihi/pcontrol/CheckHost.c

    r4689 r4762  
    4040
    4141    default:
    42       if (VerboseMode()) fprintf (stderr, "host %s is alive\n", host[0].hostname);
    4342      PutHost (host, host[0].stack, STACK_BOTTOM);
    4443      FreeIOBuffer (&buffer);
  • trunk/Ohana/src/opihi/pcontrol/CheckIdleHost.c

    r4705 r4762  
    88
    99  stack = GetJobStack (PCONTROL_JOB_PENDING);
    10 
     10 
    1111  /* look for first NEEDHOST matching this host */
    1212  for (i = 0; i < stack[0].Nobject; i++) {
     
    2626  for (i = 0; i < stack[0].Nobject; i++) {
    2727    job = (Job *) stack[0].object[i];
     28    /*** this currently never runs WANTHOST jobs on any other machines ***/
    2829    if (job[0].mode != PCONTROL_JOB_WANTHOST) continue;
    2930    if (job[0].hostname == NULL) {
     
    5051}
    5152
    52 /** note : host and job popped off stacks **/
    53 
    54 /** elsewhere, we will check for timeout on the job and
    55     migrate to ANYHOST from WANTHOST or move to
    56     a failure condition for NEEDHOST
    57 **/
     53/** note : host and job popped off IDLE and PENDING stacks,
     54    unless no job is available **/
  • trunk/Ohana/src/opihi/pcontrol/CheckSystem.c

    r4705 r4762  
    11# include "pcontrol.h"
    22
     3static Npass = 0;
     4
    35int CheckSystem () {
    46
    5   CheckBusyJobs();
    6   CheckDoneJobs();
    7   CheckDoneHosts();
    8   CheckIdleHosts();
    9   CheckDownHosts();
    10 
    11   /** add in different timescales for heartbeat? **/
    12   CheckLiveHosts();
    13 
    14   return (TRUE);
    15 }
    16 
    17 int CheckBusyJobs () {
    18 
     7  /* we want to give each block a maximum allowed time */
     8  CheckIdleHosts(0.020); /* submit a new job */
     9
     10  CheckBusyJobs(0.020);  /* get job status */
     11  CheckDoneJobs(0.020);  /* harvest job stdout/stderr */
     12
     13  CheckDoneHosts(0.020); /* reset the host */
     14  CheckDownHosts(0.100); /* launch the host */
     15
     16  /* most tests require about 2ms per host. 
     17     CheckDoneJobs must depend on the size of the output buffer */
     18
     19  /* this is a waste of cycles: no need to do this every loop */
     20  if (Npass > 20) {
     21    CheckLiveHosts(0.040);
     22    Npass = 0;
     23  } else {
     24    Npass ++;
     25  }
     26
     27  if (0) {
     28    Stack *stack;
     29    int Nidle, Ndown, Nbusy;
     30    stack = GetHostStack (PCONTROL_HOST_IDLE);
     31    Nidle = stack[0].Nobject;
     32    stack = GetHostStack (PCONTROL_HOST_DOWN);
     33    Ndown = stack[0].Nobject;
     34    stack = GetHostStack (PCONTROL_HOST_BUSY);
     35    Nbusy = stack[0].Nobject;
     36    fprintf (stderr, "busy, idle, down: %2d %2d %2d\n", Nbusy, Nidle, Ndown);
     37  }
     38
     39  return (TRUE);
     40}
     41
     42int CheckBusyJobs (float MaxDelay) {
     43
     44  struct timeval start, stop;
    1945  int i, Nobject;
    2046  Stack *stack;
    2147  Job   *job;
     48  float dtime;
    2249
    2350  stack = GetJobStack (PCONTROL_JOB_BUSY);
    2451  Nobject = stack[0].Nobject;
    2552
    26   for (i = 0; i < Nobject; i++) {
     53  /* always allow at least one test */
     54  gettimeofday (&start, (void *) NULL);
     55  dtime = 0.0;
     56  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    2757    job = GetStack (stack, STACK_TOP);
    2858    CheckBusyJob (job);
    29   }
    30   return (TRUE);
    31 }
    32 
    33 int CheckDoneJobs () {
    34 
     59    gettimeofday (&stop, (void *) NULL);
     60    dtime = DTIME (stop, start);
     61  }
     62  if (0 && (Nobject > 0)) fprintf (stderr, "checked %d of %d jobs\n", i, Nobject);
     63  return (TRUE);
     64}
     65
     66int CheckDoneJobs (float MaxDelay) {
     67
     68  struct timeval start, stop;
    3569  int i, Nobject;
    3670  Stack *stack;
    3771  Job   *job;
     72  float dtime;
    3873
    3974  stack = GetJobStack (PCONTROL_JOB_DONE);
    4075  Nobject = stack[0].Nobject;
    4176
    42   for (i = 0; i < Nobject; i++) {
     77  /* always allow at least one test */
     78  gettimeofday (&start, (void *) NULL);
     79  dtime = 0.0;
     80  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    4381    job = GetStack (stack, STACK_TOP);
    4482    CheckDoneJob (job);
    45   }
    46   return (TRUE);
    47 }
    48 
    49 int CheckDoneHosts () {
    50 
    51   int i, Nobject;
    52   Stack *stack;
    53   Host  *host;
     83    gettimeofday (&stop, (void *) NULL);
     84    dtime = DTIME (stop, start);
     85  }
     86  if (0 && (Nobject > 0)) fprintf (stderr, "checked %d of %d jobs\n", i, Nobject);
     87  return (TRUE);
     88}
     89
     90int CheckDoneHosts (float MaxDelay) {
     91
     92  struct timeval start, stop;
     93  int i, Nobject;
     94  Stack *stack;
     95  Host  *host;
     96  float dtime;
    5497
    5598  stack = GetHostStack (PCONTROL_HOST_DONE);
    5699  Nobject = stack[0].Nobject;
    57100
    58   for (i = 0; i < Nobject; i++) {
     101  /* always allow at least one test */
     102  gettimeofday (&start, (void *) NULL);
     103  dtime = 0.0;
     104  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    59105    host = GetStack (stack, STACK_TOP);
    60106    CheckDoneHost (host);
    61   }
    62   return (TRUE);
    63 }
    64 
    65 /* this is just a heartbeat check */
    66 int CheckLiveHosts () {
    67 
    68   int i, Nobject;
    69   Stack *stack;
    70   Host  *host;
    71 
    72   stack = GetHostStack (PCONTROL_HOST_IDLE);
    73   Nobject = stack[0].Nobject;
    74 
    75   for (i = 0; i < Nobject; i++) {
    76     host = GetStack (stack, STACK_TOP);
    77     CheckHost (host);
    78   }
    79 
    80   stack = GetHostStack (PCONTROL_HOST_BUSY);
    81   Nobject = stack[0].Nobject;
    82 
    83   for (i = 0; i < Nobject; i++) {
    84     host = GetStack (stack, STACK_TOP);
    85     CheckHost (host);
    86   }
    87   return (TRUE);
    88 }
    89 
    90 int CheckDownHosts () {
    91 
    92   int i, Nobject;
    93   Stack *stack;
    94   Host  *host;
    95   struct timeval now;
    96   float delta;
    97 
    98   gettimeofday (&now, (void *) NULL);
     107    gettimeofday (&stop, (void *) NULL);
     108    dtime = DTIME (stop, start);
     109  }
     110  if (0) fprintf (stderr, "checked %d hosts\n", i);
     111  return (TRUE);
     112}
     113
     114int CheckDownHosts (float MaxDelay) {
     115
     116  int i, Nobject;
     117  Stack *stack;
     118  Host  *host;
     119  struct timeval start, stop;
     120  float dtime;
    99121
    100122  stack = GetHostStack (PCONTROL_HOST_DOWN);
    101123  Nobject = stack[0].Nobject;
    102124
    103   for (i = 0; i < Nobject; i++) {
    104     host = GetStack (stack, STACK_TOP);
    105     delta = DTIME (host[0].nexttry, now);
    106     if (delta > 0) {
     125  /* always allow at least one test */
     126  gettimeofday (&start, (void *) NULL);
     127  dtime = 0.0;
     128  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
     129    host = GetStack (stack, STACK_TOP);
     130    dtime = DTIME (host[0].nexttry, start);
     131    if (dtime > 0) {
    107132      PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
    108133    } else {
    109134      StartHost (host);
    110135    }
    111   }
    112   return (TRUE);
    113 }
    114 
    115 int CheckIdleHosts () {
    116 
    117   int i, Nobject;
    118   Stack *stack;
    119   Host  *host;
     136    gettimeofday (&stop, (void *) NULL);
     137    dtime = DTIME (stop, start);
     138  }
     139  if (0) fprintf (stderr, "checked %d hosts\n", i);
     140  return (TRUE);
     141}
     142
     143int CheckIdleHosts (float MaxDelay) {
     144
     145  struct timeval start, stop;
     146  int i, Nobject;
     147  Stack *stack;
     148  Host  *host;
     149  float dtime;
    120150
    121151  /* check if there are any pending jobs, otherwise skip step */
     
    126156  Nobject = stack[0].Nobject;
    127157
    128   for (i = 0; i < Nobject; i++) {
     158  /* always allow at least one test */
     159  gettimeofday (&start, (void *) NULL);
     160  dtime = 0.0;
     161  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    129162    host = GetStack (stack, STACK_TOP);
    130163    CheckIdleHost (host);
    131   }
    132   return (TRUE);
    133 }
     164    gettimeofday (&stop, (void *) NULL);
     165    dtime = DTIME (stop, start);
     166  }
     167  if (0) fprintf (stderr, "checked %d hosts\n", i);
     168  return (TRUE);
     169}
     170
     171/* this is just a heartbeat check */
     172int CheckLiveHosts (float MaxDelay) {
     173
     174  struct timeval start, stop;
     175  int i, Nobject;
     176  Stack *stack;
     177  Host  *host;
     178  float dtime;
     179
     180  stack = GetHostStack (PCONTROL_HOST_IDLE);
     181  Nobject = stack[0].Nobject;
     182
     183  gettimeofday (&start, (void *) NULL);
     184
     185  dtime = 0.0;
     186  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
     187    host = GetStack (stack, STACK_TOP);
     188    CheckHost (host);
     189    gettimeofday (&stop, (void *) NULL);
     190    dtime = DTIME (stop, start);
     191  }
     192  if (0) fprintf (stderr, "checked %d idle hosts\n", i);
     193
     194  stack = GetHostStack (PCONTROL_HOST_BUSY);
     195  Nobject = stack[0].Nobject;
     196
     197  dtime = 0.0;
     198  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
     199    host = GetStack (stack, STACK_TOP);
     200    CheckHost (host);
     201    gettimeofday (&stop, (void *) NULL);
     202    dtime = DTIME (stop, start);
     203  }
     204  if (0) fprintf (stderr, "checked %d busy hosts\n", i);
     205  return (TRUE);
     206}
     207
     208/*
     209
     210  gettimeofday (&stop, (void *) NULL);
     211  dtime = DTIME (stop, start);
     212  if (VerboseMode()) fprintf (stderr, "check 4: %f seconds\n", dtime);
     213
     214  gettimeofday (&start, (void *) NULL);
     215*/
     216
     217/** All of the CheckFooBar entries cycle though their respective queues, popping from the top and
     218    pushing to the bottom.  if we stop before the loop is done there is no tendancy for bias because
     219    we continue where we left off next round **/
  • trunk/Ohana/src/opihi/pcontrol/GetJobOutput.c

    r4705 r4762  
    11# include "pcontrol.h"
    2 # define PCLIENT_TIMEOUT 20
     2# define PCLIENT_TIMEOUT 500
    33
    44/* we read Nbytes from the host, then watch for the prompt */
     
    77  int i, status, Nstart;
    88  char *line;
     9  struct timespec request, remain;
    910
    1011  /* flush any earlier messages */
     
    1213  FlushIOBuffer (buffer);
    1314  Nstart = buffer[0].Nbuffer;
     15
     16  /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */
     17  request.tv_sec = 0;
     18  request.tv_nsec = 100000;
    1419
    1520  /* send cmd (stdout / stderr) */
     
    2732      line = memstr (buffer[0].buffer, PCLIENT_PROMPT, buffer[0].Nbuffer);
    2833    }
    29     if (status == -1) usleep (10000);
     34    if (status == -1) nanosleep (&request, &remain);
    3035  }
    3136  if (status ==  0) return (PCLIENT_DOWN);
  • trunk/Ohana/src/opihi/pcontrol/StopHosts.c

    r4689 r4762  
    5353      exit (1);
    5454  }
    55   usleep (10000);
    5655
    5756  /* check current child status */
     57  /* I probably should loop a few time with max timeout larger than 10ms... */
     58  usleep (10000);
    5859  result = waitpid (host[0].pid, &waitstatus, WNOHANG);
    5960  switch (result) {
  • trunk/Ohana/src/opihi/pcontrol/pclient.c

    r4705 r4762  
    11# include "pcontrol.h"
    2 # define PCLIENT_TIMEOUT 20
     2# define PCLIENT_TIMEOUT 500
    33
    44int PclientCommand (Host *host, char *command, char *response, IOBuffer *buffer) {
     
    77  int status;
    88  char *line;
     9  struct timespec request, remain;
     10
     11  /* avoid blocking on read, test every 100 usec, up to 50 msec */
     12  request.tv_sec = 0;
     13  request.tv_nsec = 100000;
    914
    1015  ReadtoIOBuffer (buffer, host[0].stdout);
     
    2328    status = ReadtoIOBuffer (buffer, host[0].stdout);
    2429    line = memstr (buffer[0].buffer, response, buffer[0].Nbuffer);
    25     if (status == -1) usleep (10000);
     30    if (status == -1) nanosleep (&request, &remain);
    2631  }
    2732  if (status ==  0) return (PCLIENT_DOWN);
  • trunk/Ohana/src/opihi/pcontrol/pcontrol.c

    r4714 r4762  
    1919  rl_attempted_completion_function = command_completer;
    2020  rl_event_hook = CheckSystem;
    21   rl_set_keyboard_input_timeout (1000000);
     21  rl_set_keyboard_input_timeout (100000);
    2222
    2323  set_str_variable ("HISTORY", opihi_history);
  • trunk/Ohana/src/opihi/pcontrol/rconnect.c

    r4705 r4762  
    11# include "pcontrol.h"
    22
    3 # define CONNECT_TIMEOUT 300
     3/* connection can take a while, allow up to 2 sec */
     4# define CONNECT_TIMEOUT 200
    45
    56/* connect to host, start the shell: ssh hostname pclient -> command hostname shell
     
    1516  char **argv;
    1617  IOBuffer buffer;
     18  struct timespec request, remain;
    1719
    1820  bzero (stdin_fd,  2*sizeof(int));
     
    7981    status = ReadtoIOBuffer (&buffer, stdout_fd[0]);
    8082    p = memstr (buffer.buffer, "CONNECTED", buffer.Nbuffer);
    81     usleep (20000);
     83    usleep (10000);
    8284  }
    8385  if (status == 0) goto connect_error;
     
    101103  if (VerboseMode()) fprintf (stderr, "error while connecting\n");
    102104
     105  /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */
     106  request.tv_sec = 0;
     107  request.tv_nsec = 100000;
     108
    103109  /* harvest the child process: kill & wait (< 100 ms) for exit */
    104110  kill (pid, SIGKILL);
    105111  result = waitpid (pid, &waitstatus, WNOHANG);
    106   for (i = 0; (i < 10) && (result == 0); i++) {
    107     usleep (10000);  /* 10 ms is min */
     112  for (i = 0; (i < 50) && (result == 0); i++) {
     113    nanosleep (&request, &remain);
    108114    result = waitpid (pid, &waitstatus, WNOHANG);
    109115  }
Note: See TracChangeset for help on using the changeset viewer.