Changeset 4762
- Timestamp:
- Aug 13, 2005, 10:30:13 AM (21 years ago)
- Location:
- trunk/Ohana/src/opihi
- Files:
-
- 22 edited
-
include/pcontrol.h (modified) (1 diff)
-
include/psched.h (modified) (1 diff)
-
pantasks/CheckController.c (modified) (4 diffs)
-
pantasks/CheckJobs.c (modified) (1 diff)
-
pantasks/CheckSystem.c (modified) (1 diff)
-
pantasks/CheckTasks.c (modified) (1 diff)
-
pantasks/ControllerOps.c (modified) (8 diffs)
-
pantasks/controller_output.c (modified) (1 diff)
-
pclient/ChildOps.c (modified) (2 diffs)
-
pclient/init.c (modified) (1 diff)
-
pclient/job.c (modified) (5 diffs)
-
pclient/pclient.c (modified) (1 diff)
-
pclient/reset.c (modified) (5 diffs)
-
pclient/status.c (modified) (1 diff)
-
pcontrol/CheckHost.c (modified) (1 diff)
-
pcontrol/CheckIdleHost.c (modified) (3 diffs)
-
pcontrol/CheckSystem.c (modified) (2 diffs)
-
pcontrol/GetJobOutput.c (modified) (4 diffs)
-
pcontrol/StopHosts.c (modified) (1 diff)
-
pcontrol/pclient.c (modified) (3 diffs)
-
pcontrol/pcontrol.c (modified) (1 diff)
-
pcontrol/rconnect.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/include/pcontrol.h
r4706 r4762 124 124 void DelHost (Host *host); 125 125 int CheckSystem (); 126 int CheckBusyJobs ( );127 int CheckDoneJobs ( );128 int CheckDoneHosts ( );129 int CheckLiveHosts ( );130 int CheckDownHosts ( );131 int CheckIdleHosts ( );126 int CheckBusyJobs (float delay); 127 int CheckDoneJobs (float delay); 128 int CheckDoneHosts (float delay); 129 int CheckLiveHosts (float delay); 130 int CheckDownHosts (float delay); 131 int CheckIdleHosts (float delay); 132 132 int CheckIdleHost (Host *host); 133 133 void InitIDs (); -
trunk/Ohana/src/opihi/include/psched.h
r4714 r4762 174 174 int KillControllerJob (Job *job); 175 175 int CheckControllerStatus (); 176 int TestElapsedCheck (); 177 -
trunk/Ohana/src/opihi/pantasks/CheckController.c
r4714 r4762 3 3 int CheckController () { 4 4 5 float dtime; 6 struct timeval start, stop; 5 7 char *p, *q; 6 8 int i, Njobs, status, JobID; 7 9 Job *job; 8 10 IOBuffer buffer; 11 12 gettimeofday (&start, (void *) NULL); 9 13 10 14 /* get the list of completed jobs (exit / crash), update the job status */ … … 32 36 } 33 37 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 34 43 p = buffer.buffer; 35 for (i = 0; i < Njobs; i++) {44 for (i = 0; (i < Njobs) && !TestElapsedCheck(); i++) { 36 45 q = strchr (p, '\n'); 37 46 if (q == NULL) { … … 50 59 CheckControllerJob (job); 51 60 } 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 53 67 /*** check CRASH jobs ***/ 54 68 FlushIOBuffer (&buffer); … … 72 86 73 87 p = buffer.buffer; 74 for (i = 0; i < Njobs; i++) {88 for (i = 0; (i < Njobs) && !TestElapsedCheck(); i++) { 75 89 q = strchr (p, '\n'); 76 90 if (q == NULL) { -
trunk/Ohana/src/opihi/pantasks/CheckJobs.c
r4705 r4762 83 83 /* reset polling clock */ 84 84 SetTaskTimer (&job[0].last); 85 if (TestElapsedCheck()) return (TRUE); 85 86 } 86 87 return (TRUE); -
trunk/Ohana/src/opihi/pantasks/CheckSystem.c
r4714 r4762 1 1 # include "psched.h" 2 3 # define MAX_DELAY 0.1 4 struct timeval start; 5 static int Ncheck = 0; 2 6 3 7 int CheckSystem () { 4 8 5 /* need to make a timeout: if this process lasts too long,6 we should return so the user can get input in. this cannot7 just be a return, because we need to hit each of the elements8 eventually9 */10 struct timeval start, stop;11 double dtime;12 13 9 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 23 int TestElapsedCheck () { 24 25 struct timeval stop; 26 float dtime; 27 15 28 gettimeofday (&stop, (void *) NULL); 16 29 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 } 18 33 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 33 33 gettimeofday (&task[0].last, (void *) NULL); 34 34 task[0].Njobs ++; 35 36 if (TestElapsedCheck()) return (TRUE); 35 37 } 36 38 return (TRUE); -
trunk/Ohana/src/opihi/pantasks/ControllerOps.c
r4714 r4762 1 1 # include "psched.h" 2 2 /* adding a new host can delay controller up to a second or so */ 3 # define CONTROLLER_TIMEOUT 2003 # define CONTROLLER_TIMEOUT 500 4 4 # define CONNECT_TIMEOUT 300 5 5 … … 18 18 /* check job / get output if done */ 19 19 int CheckControllerJob (Job *job) { 20 20 struct timeval start, stop; 21 float dtime; 22 23 gettimeofday (&start, (void *) NULL); 21 24 CheckControllerJobStatus (job); 25 gettimeofday (&stop, (void *) NULL); 26 dtime = DTIME (stop, start); 27 if (VerboseMode()) fprintf (stderr, "check job status %f\n", dtime); 22 28 23 29 if ((job[0].state == JOB_EXIT) || (job[0].state == JOB_CRASH)) { 30 gettimeofday (&start, (void *) NULL); 24 31 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 25 36 GetJobOutput ("stderr", job[0].pid, &job[0].stderr, job[0].stderr_size); 26 37 DeleteControllerJob (job); … … 97 108 int i, status, Nstart; 98 109 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; 99 115 100 116 /* flush any earlier messages */ … … 117 133 line = memstr (buffer[0].buffer, CONTROLLER_PROMPT, buffer[0].Nbuffer); 118 134 } 119 if (status == -1) usleep (10000);135 if (status == -1) nanosleep (&request, &remain); 120 136 } 121 137 if (status == 0) return (CONTROLLER_DOWN); … … 256 272 257 273 /* try to get evidence connection is alive - wait upto a few seconds */ 274 /* connection is likely slow; don't bother with nanosleep here */ 258 275 p = NULL; 259 276 status = -1; … … 300 317 int ControllerCommand (char *cmd, char *response, IOBuffer *buffer) { 301 318 302 int i; 303 int status; 319 int i, status; 304 320 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; 305 326 306 327 ReadtoIOBuffer (buffer, stdout_cntl); … … 323 344 status = ReadtoIOBuffer (buffer, stdout_cntl); 324 345 line = memstr (buffer[0].buffer, response, buffer[0].Nbuffer); 325 if (status == -1) usleep (10000);346 if (status == -1) nanosleep (&request, &remain); 326 347 } 327 348 if (status == 0) { … … 341 362 bzero (buffer[0].buffer + buffer[0].Nbuffer, buffer[0].Nalloc - buffer[0].Nbuffer); 342 363 } 343 if (VerboseMode()) fprintf (stderr, "message received \n");364 if (VerboseMode()) fprintf (stderr, "message received, %d cycles\n", i); 344 365 return (TRUE); 345 366 } -
trunk/Ohana/src/opihi/pantasks/controller_output.c
r4693 r4762 8 8 } 9 9 10 CheckControllerOutput (); 10 11 PrintControllerOutput (); 11 12 return (TRUE); -
trunk/Ohana/src/opihi/pclient/ChildOps.c
r4689 r4762 29 29 struct timeval now; 30 30 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 32 34 gettimeofday (&now, NULL); 33 35 dtime = DTIME (now, last); … … 36 38 if (dtime > 0.01) Nbad = 0; 37 39 if (Nbad > 10) exit (2); 40 */ 38 41 39 42 /* this is a bit lame : we must exit if calling process exits */ -
trunk/Ohana/src/opihi/pclient/init.c
r4748 r4762 16 16 {"stdout", stdout_pclient, "get stdout buffer"}, 17 17 {"stderr", stderr_pclient, "get stderr buffer"}, 18 {"version", version, "show version information"},18 {"version", version, "show version information"}, 19 19 }; 20 20 -
trunk/Ohana/src/opihi/pclient/job.c
r4691 r4762 8 8 if (argc < 2) { 9 9 fprintf (stderr, "USAGE: job (arg0) (arg1) ... (argN)\n"); 10 fprintf ( stdout, "STATUS %d\n", -2);10 fprintf (GetOutfile(), "STATUS %d\n", -2); 11 11 return (FALSE); 12 12 } … … 14 14 if (ChildStatus != PCLIENT_NONE) { 15 15 fprintf (stderr, "need to clear existing child\n"); 16 fprintf ( stdout, "STATUS %d\n", -3);16 fprintf (GetOutfile(), "STATUS %d\n", -3); 17 17 return (FALSE); 18 18 } … … 31 31 pid = fork (); 32 32 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]); */ 34 34 35 35 /* close the other ends of the pipes */ … … 73 73 ChildPID = pid; 74 74 75 fprintf ( stdout, "STATUS %d\n", ChildPID);75 fprintf (GetOutfile(), "STATUS %d\n", ChildPID); 76 76 return (TRUE); 77 77 … … 85 85 if (child_stderr_fd[1] != 0) close (child_stderr_fd[1]); 86 86 87 fprintf ( stdout, "STATUS %d\n", -1);87 fprintf (GetOutfile(), "STATUS %d\n", -1); 88 88 return (FALSE); 89 89 } -
trunk/Ohana/src/opihi/pclient/pclient.c
r4714 r4762 20 20 rl_attempted_completion_function = command_completer; 21 21 rl_event_hook = CheckChild; 22 rl_set_keyboard_input_timeout (1000); 22 23 23 24 set_str_variable ("HISTORY", opihi_history); -
trunk/Ohana/src/opihi/pclient/reset.c
r4689 r4762 4 4 5 5 int i, result, waitstatus; 6 struct timespec request, remain; 6 7 7 8 if (argc != 1) { 8 9 fprintf (stderr, "USAGE: reset\n"); 9 fprintf ( stdout, "STATUS -1\n");10 fprintf (GetOutfile(), "STATUS -1\n"); 10 11 return (FALSE); 11 12 } … … 13 14 if (ChildStatus == PCLIENT_NONE) { 14 15 fprintf (stderr, "no child process, cannot reset\n"); 15 fprintf ( stdout, "STATUS 2\n");16 fprintf (GetOutfile(), "STATUS 2\n"); 16 17 return (TRUE); 17 18 } 18 19 20 /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */ 21 request.tv_sec = 0; 22 request.tv_nsec = 100000; 23 19 24 if (ChildStatus == PCLIENT_BUSY) { 20 /* send SIGTERM signal to job */25 /* job is still running, send SIGTERM signal to job */ 21 26 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); 25 30 result = waitpid (ChildPID, &waitstatus, WNOHANG); 26 31 } 27 32 if (result) goto reset_job; 28 33 29 /* send SIGTERMsignal to job */34 /* job did not exit, send SIGKILL signal to job */ 30 35 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); 34 39 result = waitpid (ChildPID, &waitstatus, WNOHANG); 35 40 } … … 38 43 /* total failure, don't reset */ 39 44 fprintf (stderr, "child process %d is hung, cannot reset\n", ChildPID); 40 fprintf ( stdout, "STATUS 0\n");45 fprintf (GetOutfile(), "STATUS 0\n"); 41 46 return (FALSE); 42 47 } … … 57 62 ChildExitStatus = 0; 58 63 59 fprintf ( stdout, "STATUS 1\n");64 fprintf (GetOutfile(), "STATUS 1\n"); 60 65 return (TRUE); 61 66 } … … 68 73 */ 69 74 75 /* the linux kernel timer sticks in a 10ms lag between kill and the harvest */ -
trunk/Ohana/src/opihi/pclient/status.c
r3187 r4762 15 15 if (ChildStatus == PCLIENT_CRASH) strcpy (status_string, "CRASH"); 16 16 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); 21 23 return (TRUE); 22 24 } -
trunk/Ohana/src/opihi/pcontrol/CheckHost.c
r4689 r4762 40 40 41 41 default: 42 if (VerboseMode()) fprintf (stderr, "host %s is alive\n", host[0].hostname);43 42 PutHost (host, host[0].stack, STACK_BOTTOM); 44 43 FreeIOBuffer (&buffer); -
trunk/Ohana/src/opihi/pcontrol/CheckIdleHost.c
r4705 r4762 8 8 9 9 stack = GetJobStack (PCONTROL_JOB_PENDING); 10 10 11 11 /* look for first NEEDHOST matching this host */ 12 12 for (i = 0; i < stack[0].Nobject; i++) { … … 26 26 for (i = 0; i < stack[0].Nobject; i++) { 27 27 job = (Job *) stack[0].object[i]; 28 /*** this currently never runs WANTHOST jobs on any other machines ***/ 28 29 if (job[0].mode != PCONTROL_JOB_WANTHOST) continue; 29 30 if (job[0].hostname == NULL) { … … 50 51 } 51 52 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 1 1 # include "pcontrol.h" 2 2 3 static Npass = 0; 4 3 5 int CheckSystem () { 4 6 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 42 int CheckBusyJobs (float MaxDelay) { 43 44 struct timeval start, stop; 19 45 int i, Nobject; 20 46 Stack *stack; 21 47 Job *job; 48 float dtime; 22 49 23 50 stack = GetJobStack (PCONTROL_JOB_BUSY); 24 51 Nobject = stack[0].Nobject; 25 52 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++) { 27 57 job = GetStack (stack, STACK_TOP); 28 58 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 66 int CheckDoneJobs (float MaxDelay) { 67 68 struct timeval start, stop; 35 69 int i, Nobject; 36 70 Stack *stack; 37 71 Job *job; 72 float dtime; 38 73 39 74 stack = GetJobStack (PCONTROL_JOB_DONE); 40 75 Nobject = stack[0].Nobject; 41 76 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++) { 43 81 job = GetStack (stack, STACK_TOP); 44 82 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 90 int CheckDoneHosts (float MaxDelay) { 91 92 struct timeval start, stop; 93 int i, Nobject; 94 Stack *stack; 95 Host *host; 96 float dtime; 54 97 55 98 stack = GetHostStack (PCONTROL_HOST_DONE); 56 99 Nobject = stack[0].Nobject; 57 100 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++) { 59 105 host = GetStack (stack, STACK_TOP); 60 106 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 114 int CheckDownHosts (float MaxDelay) { 115 116 int i, Nobject; 117 Stack *stack; 118 Host *host; 119 struct timeval start, stop; 120 float dtime; 99 121 100 122 stack = GetHostStack (PCONTROL_HOST_DOWN); 101 123 Nobject = stack[0].Nobject; 102 124 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) { 107 132 PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM); 108 133 } else { 109 134 StartHost (host); 110 135 } 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 143 int CheckIdleHosts (float MaxDelay) { 144 145 struct timeval start, stop; 146 int i, Nobject; 147 Stack *stack; 148 Host *host; 149 float dtime; 120 150 121 151 /* check if there are any pending jobs, otherwise skip step */ … … 126 156 Nobject = stack[0].Nobject; 127 157 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++) { 129 162 host = GetStack (stack, STACK_TOP); 130 163 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 */ 172 int 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 1 1 # include "pcontrol.h" 2 # define PCLIENT_TIMEOUT 202 # define PCLIENT_TIMEOUT 500 3 3 4 4 /* we read Nbytes from the host, then watch for the prompt */ … … 7 7 int i, status, Nstart; 8 8 char *line; 9 struct timespec request, remain; 9 10 10 11 /* flush any earlier messages */ … … 12 13 FlushIOBuffer (buffer); 13 14 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; 14 19 15 20 /* send cmd (stdout / stderr) */ … … 27 32 line = memstr (buffer[0].buffer, PCLIENT_PROMPT, buffer[0].Nbuffer); 28 33 } 29 if (status == -1) usleep (10000);34 if (status == -1) nanosleep (&request, &remain); 30 35 } 31 36 if (status == 0) return (PCLIENT_DOWN); -
trunk/Ohana/src/opihi/pcontrol/StopHosts.c
r4689 r4762 53 53 exit (1); 54 54 } 55 usleep (10000);56 55 57 56 /* check current child status */ 57 /* I probably should loop a few time with max timeout larger than 10ms... */ 58 usleep (10000); 58 59 result = waitpid (host[0].pid, &waitstatus, WNOHANG); 59 60 switch (result) { -
trunk/Ohana/src/opihi/pcontrol/pclient.c
r4705 r4762 1 1 # include "pcontrol.h" 2 # define PCLIENT_TIMEOUT 202 # define PCLIENT_TIMEOUT 500 3 3 4 4 int PclientCommand (Host *host, char *command, char *response, IOBuffer *buffer) { … … 7 7 int status; 8 8 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; 9 14 10 15 ReadtoIOBuffer (buffer, host[0].stdout); … … 23 28 status = ReadtoIOBuffer (buffer, host[0].stdout); 24 29 line = memstr (buffer[0].buffer, response, buffer[0].Nbuffer); 25 if (status == -1) usleep (10000);30 if (status == -1) nanosleep (&request, &remain); 26 31 } 27 32 if (status == 0) return (PCLIENT_DOWN); -
trunk/Ohana/src/opihi/pcontrol/pcontrol.c
r4714 r4762 19 19 rl_attempted_completion_function = command_completer; 20 20 rl_event_hook = CheckSystem; 21 rl_set_keyboard_input_timeout (100000 0);21 rl_set_keyboard_input_timeout (100000); 22 22 23 23 set_str_variable ("HISTORY", opihi_history); -
trunk/Ohana/src/opihi/pcontrol/rconnect.c
r4705 r4762 1 1 # include "pcontrol.h" 2 2 3 # define CONNECT_TIMEOUT 300 3 /* connection can take a while, allow up to 2 sec */ 4 # define CONNECT_TIMEOUT 200 4 5 5 6 /* connect to host, start the shell: ssh hostname pclient -> command hostname shell … … 15 16 char **argv; 16 17 IOBuffer buffer; 18 struct timespec request, remain; 17 19 18 20 bzero (stdin_fd, 2*sizeof(int)); … … 79 81 status = ReadtoIOBuffer (&buffer, stdout_fd[0]); 80 82 p = memstr (buffer.buffer, "CONNECTED", buffer.Nbuffer); 81 usleep ( 20000);83 usleep (10000); 82 84 } 83 85 if (status == 0) goto connect_error; … … 101 103 if (VerboseMode()) fprintf (stderr, "error while connecting\n"); 102 104 105 /* avoid blocking on waitpid, test every 100 usec, up to 50 msec */ 106 request.tv_sec = 0; 107 request.tv_nsec = 100000; 108 103 109 /* harvest the child process: kill & wait (< 100 ms) for exit */ 104 110 kill (pid, SIGKILL); 105 111 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); 108 114 result = waitpid (pid, &waitstatus, WNOHANG); 109 115 }
Note:
See TracChangeset
for help on using the changeset viewer.
