IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 18, 2006, 1:44:51 PM (20 years ago)
Author:
eugene
Message:

successful implementation of the threaded version of pcontrol

File:
1 edited

Legend:

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

    r8296 r8424  
    11# include "pcontrol.h"
     2# define DEBUG 0
    23
    34static struct timeval lastlive = {0, 0};
     5static int RunSystem = FALSE;
     6
     7int SetRunSystem (int state) {
     8  int oldstate;
     9  oldstate = RunSystem;
     10  RunSystem = state;
     11  return oldstate;
     12}
    413
    514int CheckSystem () {
     
    2938  }
    3039
    31   if (0) {
     40  if (DEBUG) {
    3241    Stack *stack;
    3342    int Nidle, Ndown, Nbusy;
     
    4453}
    4554
     55void *CheckSystem_Threaded (void *data) {
     56
     57  struct timeval now;
     58  float dtime;
     59
     60  gprintInit ();
     61
     62  while (1) {
     63    // stop here if the user-thread requests (no objects in flight)
     64    TestCheckPoint ();
     65
     66    // don't run the system checks if RunSystem is FALSE
     67    if (!RunSystem) {
     68      usleep (50000);
     69      continue;
     70    }
     71
     72    // we want to give each block a maximum allowed time
     73    CheckIdleHosts(0.020); /* submit a new job */
     74
     75    CheckBusyJobs(0.020);  /* get job status */
     76    CheckDoneJobs(0.020);  /* harvest job stdout/stderr */
     77    CheckKillJobs(0.020);  /* harvest job stdout/stderr */
     78
     79    CheckDoneHosts(0.020); /* reset the host */
     80    CheckDownHosts(0.100); /* launch the host */
     81
     82    /* always allow at least one test */
     83    /* most tests require about 2ms per host. 
     84       CheckDoneJobs must depend on the size of the output buffer */
     85
     86    gettimeofday (&now, (void *) NULL);
     87    dtime = DTIME (now, lastlive);
     88    if (dtime > 1.0) {
     89      CheckLiveHosts(0.040);
     90      lastlive = now;
     91    }
     92
     93    if (DEBUG) {
     94      Stack *stack;
     95      int Nidle, Ndown, Nbusy;
     96      stack = GetHostStack (PCONTROL_HOST_IDLE);
     97      Nidle = stack[0].Nobject;
     98      stack = GetHostStack (PCONTROL_HOST_DOWN);
     99      Ndown = stack[0].Nobject;
     100      stack = GetHostStack (PCONTROL_HOST_BUSY);
     101      Nbusy = stack[0].Nobject;
     102      gprint (GP_ERR, "busy, idle, down: %2d %2d %2d\n", Nbusy, Nidle, Ndown);
     103    }
     104  }
     105  return (NULL);
     106}
     107
    46108int CheckBusyJobs (float MaxDelay) {
    47109
    48110  struct timeval start, stop;
    49111  int i, Nobject;
    50   Stack *stack;
     112  Stack *hoststack;
     113  Stack *jobstack;
    51114  Job   *job;
     115  Host  *host;
    52116  float dtime;
    53117
     
    65129  dtime = 0.0;
    66130  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    67     /* pull both job and host from their stacks */
    68     /* XXX is the subject to the Dangerous Embrace? */
     131    // pull both job and host from their stacks
    69132    LockStack (hoststack);
    70133    job = PullStackByLocation (jobstack, STACK_TOP);
     
    73136      break;
    74137    }
    75     host = RemoveStackByID (hoststack, job[0].host[0].HostID);
     138    host = (Host *) job[0].host;
     139    RemoveStackByID (hoststack, host[0].HostID);
    76140    UnlockStack (hoststack);
    77141
    78     CheckBusyJob (job);
    79     gettimeofday (&stop, (void *) NULL);
    80     dtime = DTIME (stop, start);
    81   }
    82   if (0 && (Nobject > 0)) gprint (GP_ERR, "checked %d of %d jobs\n", i, Nobject);
     142    CheckBusyJob (job, host);
     143    gettimeofday (&stop, (void *) NULL);
     144    dtime = DTIME (stop, start);
     145  }
     146  if (DEBUG && (Nobject > 0)) gprint (GP_ERR, "checked %d of %d jobs\n", i, Nobject);
    83147  return (TRUE);
    84148}
     
    88152  struct timeval start, stop;
    89153  int i, Nobject;
    90   Stack *stack;
     154  Stack *hoststack;
     155  Stack *jobstack;
    91156  Job   *job;
    92   float dtime;
    93 
    94   /* Loop through objects on the stack, no more than once. see note above */
    95   stack = GetJobStack (PCONTROL_JOB_DONE);
    96   Nobject = stack[0].Nobject;
    97 
    98   /* always allow at least one test */
    99   gettimeofday (&start, (void *) NULL);
    100   dtime = 0.0;
    101   for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    102     job = PullStackByLocation (stack, STACK_TOP);
    103     if (job == NULL) break;
    104     CheckDoneJob (job);
    105     gettimeofday (&stop, (void *) NULL);
    106     dtime = DTIME (stop, start);
    107   }
    108   if (0 && (Nobject > 0)) gprint (GP_ERR, "checked %d of %d jobs\n", i, Nobject);
     157  Host  *host;
     158  float dtime;
     159
     160  /* Loop through objects on the stack, no more than once. see note above */
     161  hoststack = GetHostStack (PCONTROL_HOST_BUSY);
     162  jobstack  = GetJobStack (PCONTROL_JOB_DONE);
     163  Nobject   = jobstack[0].Nobject;
     164
     165  /* always allow at least one test */
     166  gettimeofday (&start, (void *) NULL);
     167  dtime = 0.0;
     168  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
     169    LockStack (hoststack);
     170    job = PullStackByLocation (jobstack, STACK_TOP);
     171    if (job == NULL) {
     172      UnlockStack (hoststack);
     173      break;
     174    }
     175    host = (Host *) job[0].host;
     176    RemoveStackByID (hoststack, host[0].HostID);
     177    UnlockStack (hoststack);
     178
     179    CheckDoneJob (job, host);
     180    gettimeofday (&stop, (void *) NULL);
     181    dtime = DTIME (stop, start);
     182  }
     183  if (DEBUG && (Nobject > 0)) gprint (GP_ERR, "checked %d of %d jobs\n", i, Nobject);
    109184  return (TRUE);
    110185}
     
    114189  struct timeval start, stop;
    115190  int i, Nobject;
    116   Stack *stack;
     191  Stack *hoststack;
     192  Stack *jobstack;
    117193  Job   *job;
    118   float dtime;
    119 
    120   /* Loop through objects on the stack, no more than once. see note above */
    121   stack = GetJobStack (PCONTROL_JOB_KILL);
    122   Nobject = stack[0].Nobject;
    123 
    124   /* always allow at least one test */
    125   gettimeofday (&start, (void *) NULL);
    126   dtime = 0.0;
    127   for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    128     job = PullStackByLocation (stack, STACK_TOP);
    129     if (job == NULL) break;
    130     KillJob (job);
    131     gettimeofday (&stop, (void *) NULL);
    132     dtime = DTIME (stop, start);
    133   }
    134   if (0 && (Nobject > 0)) gprint (GP_ERR, "checked %d of %d jobs\n", i, Nobject);
     194  Host  *host;
     195  float dtime;
     196
     197  /* Loop through objects on the stack, no more than once. see note above */
     198  hoststack = GetHostStack (PCONTROL_HOST_BUSY);
     199  jobstack = GetJobStack (PCONTROL_JOB_KILL);
     200  Nobject = jobstack[0].Nobject;
     201
     202  /* always allow at least one test */
     203  gettimeofday (&start, (void *) NULL);
     204  dtime = 0.0;
     205  for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
     206    LockStack (hoststack);
     207    job = PullStackByLocation (jobstack, STACK_TOP);
     208    if (job == NULL) {
     209      UnlockStack (hoststack);
     210      break;
     211    }
     212    host = (Host *) job[0].host;
     213    RemoveStackByID (hoststack, host[0].HostID);
     214    UnlockStack (hoststack);
     215
     216    KillJob (job, host);
     217    gettimeofday (&stop, (void *) NULL);
     218    dtime = DTIME (stop, start);
     219  }
     220  if (DEBUG && (Nobject > 0)) gprint (GP_ERR, "checked %d of %d jobs\n", i, Nobject);
    135221  return (TRUE);
    136222}
     
    158244    dtime = DTIME (stop, start);
    159245  }
    160   if (0) gprint (GP_ERR, "checked %d hosts\n", i);
     246  if (DEBUG) gprint (GP_ERR, "checked %d hosts\n", i);
    161247  return (TRUE);
    162248}
     
    180266    host = PullStackByLocation (stack, STACK_TOP);
    181267    if (host == NULL) break;
     268    if (host[0].markoff) {
     269      host[0].markoff = FALSE;
     270      OffHost (host);
     271      return (TRUE);
     272    }
    182273    dtime = DTIME (host[0].nexttry, start);
    183274    if (dtime > 0) {
     
    189280    dtime = DTIME (stop, start);
    190281  }
    191   if (0) gprint (GP_ERR, "checked %d hosts\n", i);
     282  if (DEBUG) gprint (GP_ERR, "checked %d hosts\n", i);
    192283  return (TRUE);
    193284}
     
    219310    dtime = DTIME (stop, start);
    220311  }
    221   if (0) gprint (GP_ERR, "checked %d hosts\n", i);
    222   return (TRUE);
    223 }
    224 
    225 /* this is just a heartbeat check */
     312  if (DEBUG) gprint (GP_ERR, "checked %d hosts\n", i);
     313  return (TRUE);
     314}
     315
     316/* this is just a heartbeat check (only IDLE hosts) */
    226317int CheckLiveHosts (float MaxDelay) {
    227318
     
    246337    dtime = DTIME (stop, start);
    247338  }
    248   if (0) gprint (GP_ERR, "checked %d idle hosts\n", i);
    249 
    250   /* Loop through objects on the stack, no more than once. see note above */
    251   stack = GetHostStack (PCONTROL_HOST_BUSY);
    252   Nobject = stack[0].Nobject;
    253 
    254   dtime = 0.0;
    255   for (i = 0; (i < Nobject) && (dtime < MaxDelay); i++) {
    256     host = PullStackByLocation (stack, STACK_TOP);
    257     if (host == NULL) break;
    258     CheckHost (host);
    259     gettimeofday (&stop, (void *) NULL);
    260     dtime = DTIME (stop, start);
    261   }
    262   if (0) gprint (GP_ERR, "checked %d busy hosts\n", i);
     339  if (DEBUG) gprint (GP_ERR, "checked %d idle hosts\n", i);
    263340  return (TRUE);
    264341}
Note: See TracChangeset for help on using the changeset viewer.