Ejemplo n.º 1
0
int wait_request(

  struct timeval *timeout,   /* I (seconds) */
  long   *SState)     /* I (optional) */

  {
  extern char *PAddrToString(pbs_net_t *);
  void close_conn();

  int i;
  int n;

  time_t now;

  fd_set *SelectSet = NULL;
  int SelectSetSize = 0;

  int MaxNumDescriptors = 0;

  char id[] = "wait_request";
  char tmpLine[1024];

  long OrigState = 0;

  if (SState != NULL)
    OrigState = *SState;

  SelectSetSize = sizeof(char) * get_fdset_size();
  SelectSet = (fd_set *)calloc(1,SelectSetSize);

  memcpy(SelectSet,GlobalSocketReadSet,SelectSetSize);

  /* selset = readset;*/  /* readset is global */
  MaxNumDescriptors = get_max_num_descriptors();

  n = select(MaxNumDescriptors, SelectSet, (fd_set *)0, (fd_set *)0, timeout);

  if (n == -1)
    {
    if (errno == EINTR)
      {
      n = 0; /* interrupted, cycle around */
      }
    else
      {
      int i;

      struct stat fbuf;

      /* check all file descriptors to verify they are valid */

      /* NOTE:  selset may be modified by failed select() */

      for (i = 0;i < MaxNumDescriptors;i++)
        {
        if (FD_ISSET(i, GlobalSocketReadSet) == 0)
          continue;

        if (fstat(i, &fbuf) == 0)
          continue;

        /* clean up SdList and bad sd... */

        FD_CLR(i, GlobalSocketReadSet);
        }    /* END for (i) */

      free(SelectSet);
      return(-1);
      }  /* END else (errno == EINTR) */
    }    /* END if (n == -1) */

  for (i = 0;(i < max_connection) && (n != 0);i++)
    {
    if (FD_ISSET(i, SelectSet))
      {
      /* this socket has data */

      n--;

      svr_conn[i].cn_lasttime = time((time_t *)0);

      if (svr_conn[i].cn_active != Idle)
        {
        netcounter_incr();

        if (svr_conn[i].cn_func != NULL)
          {
          svr_conn[i].cn_func(i);
          }

        /* NOTE:  breakout if state changed (probably received shutdown request) */

        if ((SState != NULL) && (OrigState != *SState))
          break;
        }
      else
        {
        FD_CLR(i, GlobalSocketReadSet);
        close_conn(i);
        sprintf(tmpLine,"closed connection to fd %d - num_connections=%d (select bad socket)",
          i,
          num_connections);

        log_err(-1,id,tmpLine);
        }
      }
    }    /* END for (i) */

  /* NOTE:  break out if shutdown request received */

  if ((SState != NULL) && (OrigState != *SState))
    {
    free(SelectSet);
    return(0);
    }

  /* have any connections timed out ?? */

  now = time((time_t *)0);

  for (i = 0;i < max_connection;i++)
    {
    struct connection *cp;

    cp = &svr_conn[i];

    if (cp->cn_active != FromClientDIS)
      continue;

    if ((now - cp->cn_lasttime) <= PBS_NET_MAXCONNECTIDLE)
      continue;

    if (cp->cn_authen & PBS_NET_CONN_NOTIMEOUT)
      continue; /* do not time-out this connection */

    /* NOTE:  add info about node associated with connection - NYI */

    snprintf(tmpLine, sizeof(tmpLine), "connection %d to host %s has timed out after %d seconds - closing stale connection\n",
             i,
             PAddrToString(&cp->cn_addr),
             PBS_NET_MAXCONNECTIDLE);

    log_err(-1, "wait_request", tmpLine);

    /* locate node associated with interface, mark node as down until node responds */

    /* NYI */

    close_conn(i);
    }  /* END for (i) */

  free(SelectSet);
  return(0);
  }  /* END wait_request() */
Ejemplo n.º 2
0
static int svr_strtjob2(

  job                  *pjob,  /* I */
  struct batch_request *preq)  /* I (modified - report status) */

  {
  extern char *PAddrToString(pbs_net_t *);

  int old_state;
  int old_subst;
  attribute *pattr;

  char tmpLine[1024];

  old_state = pjob->ji_qs.ji_state;
  old_subst = pjob->ji_qs.ji_substate;

  pattr = &pjob->ji_wattr[(int)JOB_ATR_start_time];

  if ((pjob->ji_wattr[(int)JOB_ATR_restart_name].at_flags & ATR_VFLAG_SET) == 0)
    {
    pattr->at_val.at_long = time(NULL);
    pattr->at_flags |= ATR_VFLAG_SET;
    }

  pattr = &pjob->ji_wattr[(int)JOB_ATR_start_count];

  pattr->at_val.at_long++;
  pattr->at_flags |= ATR_VFLAG_SET;

  /* send the job to MOM */

  svr_setjobstate(pjob,JOB_STATE_RUNNING,JOB_SUBSTATE_PRERUN);

  /* if job start timeout attribute is set use its value */
  
  if (((server.sv_attr[(int)SRV_ATR_JobStartTimeout].at_flags & ATR_VFLAG_SET) != 0)
          && (server.sv_attr[(int)SRV_ATR_JobStartTimeout].at_val.at_long > 0))
    {
    DIS_tcp_settimeout(server.sv_attr[(int)SRV_ATR_JobStartTimeout].at_val.at_long);
    }

  if (send_job(
        pjob,
        pjob->ji_qs.ji_un.ji_exect.ji_momaddr,
        pbs_mom_port,
        MOVE_TYPE_Exec,
        post_sendmom,
        (void *)preq) == ROUTE_DEFERRED)
    {
    /* SUCCESS */

    DIS_tcp_settimeout(server.sv_attr[(int)SRV_ATR_tcp_timeout].at_val.at_long);

    return(0);
    }

  DIS_tcp_settimeout(server.sv_attr[(int)SRV_ATR_tcp_timeout].at_val.at_long);

  sprintf(tmpLine, "unable to run job, send to MOM '%s' failed",

          PAddrToString(&pjob->ji_qs.ji_un.ji_exect.ji_momaddr));

  log_event(
    PBSEVENT_JOB,
    PBS_EVENTCLASS_JOB,
    pjob->ji_qs.ji_jobid,
    tmpLine);

  pjob->ji_qs.ji_destin[0] = '\0';

  svr_setjobstate(
    pjob,
    old_state,
    old_subst);

  return(pbs_errno);
  }    /* END svr_strtjob2() */