Changeset 11055
- Timestamp:
- Jan 11, 2007, 4:51:41 PM (19 years ago)
- Location:
- trunk/Ohana/src/opihi
- Files:
-
- 10 edited
-
include/pantasks.h (modified) (6 diffs)
-
include/shell.h (modified) (1 diff)
-
pantasks/CheckJobs.c (modified) (11 diffs)
-
pantasks/CheckTasks.c (modified) (2 diffs)
-
pantasks/ControllerOps.c (modified) (1 diff)
-
pantasks/LocalJob.c (modified) (1 diff)
-
pantasks/TaskOps.c (modified) (7 diffs)
-
pantasks/ipptool2book.c (modified) (2 diffs)
-
pantasks/task.c (modified) (2 diffs)
-
pantasks/task_nmax.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/include/pantasks.h
r10694 r11055 28 28 29 29 enum {RANGE_ABS, RANGE_DAY, RANGE_WEEK}; 30 enum {TIMER_ALLJOBS, TIMER_SUCCESS, TIMER_FAILURE}; 30 31 31 32 enum {TASK_NONE, … … 42 43 TASK_OPTIONS, 43 44 TASK_PERIODS, 45 TASK_NPENDING, 44 46 TASK_EXIT, 45 47 TASK_EXEC … … 86 88 int Njobs; 87 89 90 int Npending; // number of currently pending jobs 91 int NpendingMax; // max number of pending jobs allowed 92 88 93 float poll_period; 89 94 float exec_period; … … 95 100 int Nfailure; 96 101 int Ntimeout; 102 103 double dtimeAve_alljobs, dtimeMin_alljobs, dtimeMax_alljobs; 104 double dtimeAve_success, dtimeMin_success, dtimeMax_success; 105 double dtimeAve_failure, dtimeMin_failure, dtimeMax_failure; 97 106 98 107 int active; … … 140 149 int stdout_fd; /* stdout pipe (local only) */ 141 150 int stderr_fd; /* stderr pipe (local only) */ 151 152 double dtime; 142 153 } Job; 143 154 … … 167 178 int RemoveTask (Task *task); 168 179 Task *SetNewTask (Task *task); 180 void ListTaskStats (); 181 void UpdateTaskTimerStats (Task *task, int mode, double dtime); 169 182 170 183 int NextJobID (); -
trunk/Ohana/src/opihi/include/shell.h
r10846 r11055 102 102 void ListMacros PROTO(()); 103 103 void FreeMacro PROTO((Macro *macro)); 104 CommandF *find_macro_command PROTO((char *name)); 104 105 105 106 int exec_loop PROTO((Macro *loop)); -
trunk/Ohana/src/opihi/pantasks/CheckJobs.c
r9278 r11055 5 5 FILE *f; 6 6 Job *job; 7 Task *task; 7 8 Macro *macro; 8 9 int i, status; … … 13 14 while ((job = NextJob ()) != NULL) { 14 15 16 task = job[0].task; 17 15 18 /* check poll period (ready to ask for status?) */ 16 if (GetTaskTimer(job[0].last) < job[0].task[0].poll_period) continue;19 if (GetTaskTimer(job[0].last) < task[0].poll_period) continue; 17 20 18 21 /* check current status */ … … 20 23 switch (status) { 21 24 case JOB_PENDING: 22 /* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) pending\n", job[0].task[0].name, job[0].JobID); */25 /* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) pending\n", task[0].name, job[0].JobID); */ 23 26 break; 24 27 25 28 case JOB_BUSY: 26 /* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) busy\n", job[0].task[0].name, job[0].JobID); */29 /* if (VerboseMode()) gprint (GP_LOG, "job %s (%d) busy\n", task[0].name, job[0].JobID); */ 27 30 break; 28 31 … … 35 38 36 39 /* save the stdout and stderr if desired */ 37 if ( job[0].stdout_dump != NULL) {40 if ((job[0].stdout_dump != NULL) && strcasecmp(job[0].stdout_dump, "NULL")) { 38 41 f = fopen (job[0].stdout_dump, "a"); 39 42 if (f == NULL) { … … 44 47 } 45 48 } 46 if ( job[0].stderr_dump != NULL) {49 if ((job[0].stderr_dump != NULL) && strcasecmp(job[0].stderr_dump, "NULL")) { 47 50 f = fopen (job[0].stderr_dump, "a"); 48 51 if (f == NULL) { … … 68 71 set_int_variable ("options:n", job[0].optc); 69 72 73 set_variable ("JOB_DTIME", job[0].dtime); 74 70 75 if (status == JOB_CRASH) { 71 76 /* XXX add an Ncrash element? */ 72 job[0].task[0].Nfailure ++; 77 task[0].Nfailure ++; 78 UpdateTaskTimerStats (task, TIMER_FAILURE, job[0].dtime); 73 79 74 80 /* run task[0].crash macro, if it exists */ 75 81 /* perhaps define PushNamedQueueBuffer */ 76 82 77 if (VerboseMode()) gprint (GP_LOG, "job %s (%d) crash\n", job[0].task[0].name, job[0].JobID); 78 if (job[0].task[0].crash != NULL) { 79 exec_loop (job[0].task[0].crash); 83 set_str_variable ("JOB_STATUS", "CRASH"); 84 85 if (VerboseMode()) gprint (GP_LOG, "job %s (%d) crash\n", task[0].name, job[0].JobID); 86 if (task[0].crash != NULL) { 87 exec_loop (task[0].crash); 80 88 } 81 89 } … … 83 91 /* update the exit status counters */ 84 92 if (job[0].exit_status) { 85 job[0].task[0].Nfailure ++; 93 task[0].Nfailure ++; 94 UpdateTaskTimerStats (task, TIMER_FAILURE, job[0].dtime); 86 95 } else { 87 job[0].task[0].Nsuccess ++; 88 } 96 task[0].Nsuccess ++; 97 UpdateTaskTimerStats (task, TIMER_SUCCESS, job[0].dtime); 98 } 99 100 set_int_variable ("JOB_STATUS", job[0].exit_status); 89 101 90 102 /* run corresponding task[0].exit macro, if it exists */ 91 if (VerboseMode()) gprint (GP_LOG, "job %s (%d) exit\n", job[0].task[0].name, job[0].JobID);92 macro = job[0].task[0].defexit;93 for (i = 0; i < job[0].task[0].Nexit; i++) {94 if (job[0].exit_status == atoi( job[0].task[0].exit[i][0].name)) {95 macro = job[0].task[0].exit[i];103 if (VerboseMode()) gprint (GP_LOG, "job %s (%d) exit\n", task[0].name, job[0].JobID); 104 macro = task[0].defexit; 105 for (i = 0; i < task[0].Nexit; i++) { 106 if (job[0].exit_status == atoi(task[0].exit[i][0].name)) { 107 macro = task[0].exit[i]; 96 108 break; 97 109 } … … 106 118 if (queue) InitQueue (queue); 107 119 120 UpdateTaskTimerStats (task, TIMER_ALLJOBS, job[0].dtime); 121 122 task[0].Npending --; 108 123 DeleteJob (job); 109 124 continue; … … 120 135 */ 121 136 if (job[0].mode == JOB_LOCAL) { 122 if (GetTaskTimer(job[0].start) < job[0].task[0].timeout_period) continue;123 if (VerboseMode()) gprint (GP_LOG, "timeout on %s\n", job[0].task[0].name);137 if (GetTaskTimer(job[0].start) < task[0].timeout_period) continue; 138 if (VerboseMode()) gprint (GP_LOG, "timeout on %s\n", task[0].name); 124 139 125 140 // XXX harvest STDERR and STDOUT from timeout job (should be available...) … … 127 142 128 143 /* update the timeout counter */ 129 job[0].task[0].Ntimeout ++;144 task[0].Ntimeout ++; 130 145 131 146 if (!KillLocalJob (job)) { … … 150 165 151 166 /* run task[0].timeout macro, if it exists */ 152 if ( job[0].task[0].timeout != NULL) {153 exec_loop ( job[0].task[0].timeout);167 if (task[0].timeout != NULL) { 168 exec_loop (task[0].timeout); 154 169 } 155 170 DeleteJob (job); -
trunk/Ohana/src/opihi/pantasks/CheckTasks.c
r10694 r11055 18 18 if (!CheckTimeRanges (task[0].ranges, task[0].Nranges)) continue; 19 19 if (task[0].Nmax && (task[0].Njobs >= task[0].Nmax)) continue; 20 if (task[0].NpendingMax && (task[0].Npending >= task[0].NpendingMax)) continue; 20 21 21 22 /* ready to run? : run task.exec macro */ … … 35 36 gettimeofday (&task[0].last, (void *) NULL); 36 37 task[0].Njobs ++; 38 task[0].Npending ++; 37 39 38 40 /* increment Nrun for inclusive ranges with Nmax */ -
trunk/Ohana/src/opihi/pantasks/ControllerOps.c
r10654 r11055 95 95 p = memstr (buffer.buffer, "STDERR", buffer.Nbuffer); 96 96 sscanf (p, "%*s %d", &job[0].stderr_size); 97 p = memstr (buffer.buffer, "DTIME", buffer.Nbuffer); 98 sscanf (p, "%*s %lf", &job[0].dtime); 97 99 FreeIOBuffer (&buffer); 98 100 -
trunk/Ohana/src/opihi/pantasks/LocalJob.c
r10647 r11055 97 97 exit (1); 98 98 } 99 job[0].dtime = GetTaskTimer (job[0].start); 100 break; 99 101 } 100 102 return (FALSE); -
trunk/Ohana/src/opihi/pantasks/TaskOps.c
r10733 r11055 52 52 void ListTasks (int verbose) { 53 53 54 int i, j, valid ;54 int i, j, valid, nameLength, cmdLength; 55 55 char *start, *stop; 56 char format[128]; 56 57 57 58 gprint (GP_LOG, "\n"); … … 61 62 } 62 63 64 /* find string lengths */ 65 nameLength = cmdLength = 0; 66 for (i = 0; i < Ntasks; i++) { 67 nameLength = MAX (nameLength, strlen(tasks[i][0].name)); 68 if (tasks[i][0].argv == NULL) { 69 cmdLength = MAX (nameLength, strlen("(dynamic)")); 70 } else { 71 cmdLength = MAX (nameLength, strlen(tasks[i][0].argv[0])); 72 } 73 } 74 63 75 gprint (GP_LOG, " Task Status\n"); 64 gprint (GP_LOG, " * Name Njobs Command\n"); 76 77 snprintf (format, 128, " AV %%-%ds %5s %%-%ds\n", nameLength, "Njobs", cmdLength); 78 gprint (GP_LOG, format, "Name", "Command"); 79 80 snprintf (format, 128, "%%-%ds %%5d %%-%ds\n", nameLength, cmdLength); 65 81 for (i = 0; i < Ntasks; i++) { 66 82 valid = CheckTimeRanges (tasks[i][0].ranges, tasks[i][0].Nranges); … … 77 93 } 78 94 if (tasks[i][0].argv == NULL) { 79 gprint (GP_LOG, "%-15s %5d %-20s\n", tasks[i][0].name, tasks[i][0].Njobs, "(dynamic)");80 } else { 81 gprint (GP_LOG, "%-15s %5d %-20s\n", tasks[i][0].name, tasks[i][0].Njobs, tasks[i][0].argv[0]);95 gprint (GP_LOG, format, tasks[i][0].name, tasks[i][0].Njobs, "(dynamic)"); 96 } else { 97 gprint (GP_LOG, format, tasks[i][0].name, tasks[i][0].Njobs, tasks[i][0].argv[0]); 82 98 } 83 99 if (verbose) { … … 129 145 } 130 146 147 /* list known tasks */ 148 void ListTaskStats () { 149 150 int i, j, valid, nameLength; 151 char *start, *stop; 152 char format[128]; 153 154 gprint (GP_LOG, "\n"); 155 if (Ntasks == 0) { 156 gprint (GP_LOG, " no defined tasks\n"); 157 return; 158 } 159 160 /* find string lengths */ 161 nameLength = 0; 162 for (i = 0; i < Ntasks; i++) { 163 nameLength = MAX (nameLength, strlen(tasks[i][0].name)); 164 } 165 166 gprint (GP_LOG, " Task Statistics\n"); 167 168 snprintf (format, 128, " %%-%ds | alljobs | success | failure |\n", nameLength); 169 gprint (GP_LOG, format, ""); 170 snprintf (format, 128, " AV %%-%ds | Njobs Tmin Tave Tmax | Njobs Tmin Tave Tmax | Njobs Tmin Tave Tmax |\n", nameLength); 171 gprint (GP_LOG, format, "Name"); 172 173 snprintf (format, 128, "%%-%ds", nameLength); 174 for (i = 0; i < Ntasks; i++) { 175 valid = CheckTimeRanges (tasks[i][0].ranges, tasks[i][0].Nranges); 176 if (tasks[i][0].active) { 177 gprint (GP_LOG, " +"); 178 } else { 179 gprint (GP_LOG, " -"); 180 } 181 if (valid) { 182 gprint (GP_LOG, "+ "); 183 } else { 184 gprint (GP_LOG, "- "); 185 } 186 if (tasks[i][0].argv == NULL) { 187 gprint (GP_LOG, format, tasks[i][0].name); 188 } else { 189 gprint (GP_LOG, format, tasks[i][0].name); 190 } 191 if (tasks[i][0].dtimeMin_alljobs < 0) { 192 gprint (GP_LOG, " | %5d %6s %6.2f %6.2f", tasks[i][0].Njobs, "NONE", tasks[i][0].dtimeAve_alljobs, tasks[i][0].dtimeMax_alljobs); 193 } else { 194 gprint (GP_LOG, " | %5d %6.2f %6.2f %6.2f", tasks[i][0].Njobs, tasks[i][0].dtimeMin_alljobs, tasks[i][0].dtimeAve_alljobs, tasks[i][0].dtimeMax_alljobs); 195 } 196 if (tasks[i][0].dtimeMin_success < 0) { 197 gprint (GP_LOG, " | %5d %6s %6.2f %6.2f", tasks[i][0].Nsuccess, "NONE", tasks[i][0].dtimeAve_success, tasks[i][0].dtimeMax_success); 198 } else { 199 gprint (GP_LOG, " | %5d %6.2f %6.2f %6.2f", tasks[i][0].Nsuccess, tasks[i][0].dtimeMin_success, tasks[i][0].dtimeAve_success, tasks[i][0].dtimeMax_success); 200 } 201 if (tasks[i][0].dtimeMin_failure < 0) { 202 gprint (GP_LOG, " | %5d %6s %6.2f %6.2f |\n", tasks[i][0].Nfailure, "NONE", tasks[i][0].dtimeAve_failure, tasks[i][0].dtimeMax_failure); 203 } else { 204 gprint (GP_LOG, " | %5d %6.2f %6.2f %6.2f |\n", tasks[i][0].Nfailure, tasks[i][0].dtimeMin_failure, tasks[i][0].dtimeAve_failure, tasks[i][0].dtimeMax_failure); 205 } 206 } 207 return; 208 } 209 131 210 /* show details of a task */ 132 211 int ShowTask (char *name) { … … 311 390 NewTask[0].Nmax = 0; /* default value means 'no limit' */ 312 391 392 NewTask[0].NpendingMax = 0; /* default value means 'no limit' */ 393 313 394 NewTask[0].Njobs = 0; 314 395 NewTask[0].Nsuccess = 0; 315 396 NewTask[0].Nfailure = 0; 316 397 NewTask[0].Ntimeout = 0; 398 399 /* jobs timing statistics */ 400 NewTask[0].dtimeAve_alljobs = 0.0; 401 NewTask[0].dtimeMin_alljobs = -1.0; 402 NewTask[0].dtimeMax_alljobs = 0.0; 403 404 NewTask[0].dtimeAve_success = 0.0; 405 NewTask[0].dtimeMin_success = -1.0; 406 NewTask[0].dtimeMax_success = 0.0; 407 408 NewTask[0].dtimeAve_failure = 0.0; 409 NewTask[0].dtimeMin_failure = -1.0; 410 NewTask[0].dtimeMax_failure = 0.0; 317 411 318 412 NewTask[0].active = TRUE; … … 433 527 if (!strcasecmp (command, "OPTIONS")) hash = TASK_OPTIONS; 434 528 if (!strcasecmp (command, "PERIODS")) hash = TASK_PERIODS; 529 if (!strcasecmp (command, "NPENDING")) hash = TASK_NPENDING; 435 530 if (!strcasecmp (command, "TASK.EXIT")) hash = TASK_EXIT; 436 531 if (!strcasecmp (command, "TASK.EXEC")) hash = TASK_EXEC; … … 461 556 462 557 Task *task; 558 double isec, fsec; 463 559 464 560 while ((task = NextTask ()) != NULL) { 465 561 gettimeofday (&task[0].last, (void *) NULL); 562 fsec = modf (task[0].exec_period, &isec); 563 task[0].last.tv_sec -= isec; 564 task[0].last.tv_usec -= 1e6*fsec; 466 565 } 467 566 } 567 568 /* must call this after updating the corresponding counter */ 569 void UpdateTaskTimerStats (Task *task, int mode, double dtime) { 570 571 double total; 572 573 switch (mode) { 574 case TIMER_ALLJOBS: 575 total = task[0].dtimeAve_alljobs * (task[0].Njobs - 1); 576 total += dtime; 577 task[0].dtimeAve_alljobs = total / (float) task[0].Njobs; 578 if (task[0].dtimeMin_alljobs < 0) { 579 task[0].dtimeMin_alljobs = dtime; 580 } else { 581 task[0].dtimeMin_alljobs = MIN (task[0].dtimeMin_alljobs, dtime); 582 } 583 task[0].dtimeMax_alljobs = MAX (task[0].dtimeMax_alljobs, dtime); 584 break; 585 case TIMER_SUCCESS: 586 total = task[0].dtimeAve_success * (task[0].Nsuccess - 1); 587 total += dtime; 588 task[0].dtimeAve_success = total / (float) task[0].Nsuccess; 589 if (task[0].dtimeMin_success < 0) { 590 task[0].dtimeMin_success = dtime; 591 } else { 592 task[0].dtimeMin_success = MIN (task[0].dtimeMin_success, dtime); 593 } 594 task[0].dtimeMax_success = MAX (task[0].dtimeMax_success, dtime); 595 break; 596 case TIMER_FAILURE: 597 total = task[0].dtimeAve_failure * (task[0].Nfailure - 1); 598 total += dtime; 599 task[0].dtimeAve_failure = total / (float) task[0].Nfailure; 600 if (task[0].dtimeMin_failure < 0) { 601 task[0].dtimeMin_failure = dtime; 602 } else { 603 task[0].dtimeMin_failure = MIN (task[0].dtimeMin_failure, dtime); 604 } 605 task[0].dtimeMax_failure = MAX (task[0].dtimeMax_failure, dtime); 606 break; 607 default: 608 abort(); 609 } 610 } -
trunk/Ohana/src/opihi/pantasks/ipptool2book.c
r10997 r11055 22 22 Nkeys = 0; 23 23 keys = NULL; 24 if ((N = get_argument (argc, argv, "- id"))) {24 if ((N = get_argument (argc, argv, "-key"))) { 25 25 remove_argument (N, &argc, argv); 26 26 … … 41 41 42 42 if (argc != 3) { 43 gprint (GP_ERR, "USAGE: ipptool2book (queue) (book) [-uniq] [- idkey[:key..]]\n");43 gprint (GP_ERR, "USAGE: ipptool2book (queue) (book) [-uniq] [-key key[:key..]]\n"); 44 44 FREEKEYS; 45 45 return (FALSE); -
trunk/Ohana/src/opihi/pantasks/task.c
r10694 r11055 18 18 remove_argument (N, &argc, argv); 19 19 ListTasks (TRUE); 20 return (TRUE); 21 } 22 23 if ((N = get_argument (argc, argv, "-stats"))) { 24 remove_argument (N, &argc, argv); 25 ListTaskStats (); 20 26 return (TRUE); 21 27 } … … 96 102 case TASK_OPTIONS: 97 103 case TASK_PERIODS: 104 case TASK_NPENDING: 98 105 case TASK_ACTIVE: 99 106 status = command (input, &outline, TRUE); -
trunk/Ohana/src/opihi/pantasks/task_nmax.c
r7917 r11055 20 20 return (FALSE); 21 21 } 22 23 int task_npending (int argc, char **argv) { 24 25 Task *task; 26 27 if (argc != 2) goto usage; 28 29 task = GetNewTask (); 30 if (task == NULL) { 31 gprint (GP_ERR, "ERROR: not defining or running a task\n"); 32 return (FALSE); 33 } 34 35 task[0].NpendingMax = atoi (argv[1]); 36 return (TRUE); 37 38 usage: 39 gprint (GP_ERR, "USAGE: npending N\n"); 40 return (FALSE); 41 }
Note:
See TracChangeset
for help on using the changeset viewer.
