int add_node_names(

  alps_reservation *ar,
  job              *pjob)

  {
  char *exec_str = strdup(pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str);
  char *host_tok;
  char *str_ptr = exec_str;
  char *slash;
  int   rc = PBSE_NONE;
  char *prev_node = NULL;

  ar->ar_node_names = initialize_resizable_array(INITIAL_NODE_LIST_SIZE);

  while ((host_tok = threadsafe_tokenizer(&str_ptr, "+")) != NULL)
    {
    if ((slash = strchr(host_tok, '/')) != NULL)
      *slash = '\0';

    if ((prev_node == NULL) ||
        (strcmp(prev_node, host_tok)))
      {
      if ((rc = insert_thing(ar->ar_node_names, host_tok)) < 0)
        break;
      else
        rc = PBSE_NONE;
      }

    prev_node = host_tok;
    }

  return(rc);
  } /* END add_node_names() */
int add_node_names(

  alps_reservation *ar,
  job              *pjob)

  {
  if (!pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str)
    {
    if (LOGLEVEL >= 7)
      {
      char log_buf[PBS_MAXSVRJOBID + 512];
      snprintf(log_buf, sizeof(log_buf), "Job %s exec list was null", pjob->ji_qs.ji_jobid);
      log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf);
      }
    return -1;
    }

  char *exec_str = strdup(pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str);
  char *host_tok;
  char *str_ptr = exec_str;
  char *slash;

  while ((host_tok = threadsafe_tokenizer(&str_ptr, "+")) != NULL)
    {
    if ((slash = strchr(host_tok, '/')) != NULL)
      *slash = '\0';

    ar->ar_node_names.push_back(std::string(host_tok));
    }

  return(PBSE_NONE);
  } /* END add_node_names() */
Example #3
0
int is_ms_on_server(
    
  const job *pjob)

  {
  char  mom_fullhostname[PBS_MAXHOSTNAME + 1];
  int   ms_on_server = 0;
  char *exec_hosts = pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str;

  if (exec_hosts)
    {
    char *host_tok = threadsafe_tokenizer(&exec_hosts, "+");
    if (host_tok)
      {
      char *slash;
      if ((slash = strchr(host_tok, '/')) != NULL)
        *slash = '\0';

      snprintf(mom_fullhostname, sizeof(mom_fullhostname), "%s", host_tok);

      if (strstr(server_host, "."))
        if (strstr(host_tok, ".") == NULL)
          get_fullhostname(host_tok, mom_fullhostname, sizeof(mom_fullhostname), NULL);

      ms_on_server = strcmp(server_host, mom_fullhostname) == 0;
      }
    }

  return(ms_on_server);
  } /* is_ms_on_server */
Example #4
0
int num_array_jobs(

  char *req_str) /* I */

  {
  int    num_jobs = 0;
  int    start;
  int    end;

  char  *delim = ",";
  char  *ptr;
  char  *dash;
  char  *tmp_ptr;
  char   tmp_str[MAXPATHLEN];

  if (req_str == NULL)
    return(-1);

  snprintf(tmp_str, sizeof(tmp_str), "%s", req_str);
  tmp_ptr = tmp_str;
  ptr = threadsafe_tokenizer(&tmp_ptr, delim);

  while (ptr != NULL)
    {
    if ((dash = strchr(ptr,'-')) != NULL)
      {
      /* this is a range */
      start = atoi(ptr);
      end   = atoi(dash+1);

      /* check for invalid range */
      if (end < start)
        return(-1);

      num_jobs += end - start + 1;
      }
    else
      {
      /* just one job */
      num_jobs++;
      }

    ptr = threadsafe_tokenizer(&tmp_ptr, delim);
    }

  return(num_jobs);
  } /* END num_array_jobs */
Example #5
0
int create_reserve_params_from_multi_req_list(

  char           *multi_req_list, /* I */
  char           *apbasil_protocol, /* I */
  int             nppcu,          /* I */
  int             mppdepth,       /* I */
  dynamic_string *command)        /* O */

  {
  dynamic_string *node_list = get_dynamic_string(-1, NULL);
  char           *tok;
  char           *str = multi_req_list;
  int             node_count;
  char           *comma;
  unsigned int    width;
  unsigned int    nppn;
  
  while ((tok = threadsafe_tokenizer(&str, "*")) != NULL)
    {
    node_count = 1;

    clear_dynamic_string(node_list);
    append_dynamic_string(node_list, tok);
    
    comma = tok;
    while ((comma = strchr(comma+1, ',')) != NULL)
      node_count++;
    
    tok = threadsafe_tokenizer(&str, "|");
    nppn = atoi(tok);
    
    width = nppn * node_count;

    adjust_for_depth(width, nppn, mppdepth);

    save_current_reserve_param(command, apbasil_protocol, node_list, width, nppn, nppcu, mppdepth);
    }

  if (node_list != NULL)
    free(node_list);

  return(PBSE_NONE);
  } /* END create_reserve_params_from_multi_req_list() */
int create_reserve_params_from_multi_req_list(

  char           *multi_req_list, /* I */
  char           *apbasil_protocol, /* I */
  int             nppcu,          /* I */
  int             mppdepth,       /* I */
  std::string&    command,        /* O */
  std::string&    cray_frequency) /* I */

  {
  std::string     node_list = "";
  char           *tok;
  char           *str = multi_req_list;
  int             node_count;
  char           *comma;
  unsigned int    width;
  unsigned int    nppn;
  
  while ((tok = threadsafe_tokenizer(&str, "*")) != NULL)
    {
    node_count = 1;

    node_list.clear();
    node_list += tok;
    
    comma = tok;
    while ((comma = strchr(comma+1, ',')) != NULL)
      node_count++;
    
    tok = threadsafe_tokenizer(&str, "|");
    nppn = atoi(tok);
    
    width = nppn * node_count;

    adjust_for_depth(width, nppn, mppdepth);

    save_current_reserve_param(command, apbasil_protocol, node_list, width, nppn, nppcu, mppdepth, cray_frequency);
    }

  return(PBSE_NONE);
  } /* END create_reserve_params_from_multi_req_list() */
int handle_level(

    char           *level_iter,
    int             path_index,
    int            &level_index)

{
    const char     *delims = ",";
    char           *host_tok;

    level_index++;

    /* find each hostname */
    host_tok = threadsafe_tokenizer(&level_iter, delims);

    while (host_tok != NULL)
    {
        struct addrinfo *addr_info = NULL;
        char            *colon;
        unsigned short   rm_port;

        host_tok = trim(host_tok);

        if ((colon = strchr(host_tok, ':')) != NULL)
        {
            *colon = '\0';
            rm_port = strtol(colon+1, NULL, 10);
        }
        else
            rm_port = PBS_MANAGER_SERVICE_PORT;

        if (pbs_getaddrinfo(host_tok, NULL, &addr_info) == 0)
            add_network_entry(mh, host_tok, addr_info, rm_port, path_index, level_index);

        host_tok = threadsafe_tokenizer(&level_iter, delims);
    }

    return(PBSE_NONE);
} /* END handle_level() */
Example #8
0
void change_restart_comment_if_needed(

  struct job *pjob)

  {

  if ((pjob->ji_wattr[JOB_ATR_start_count].at_val.at_long > 1) &&
      (pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_flags & ATR_VFLAG_SET))
    {
    char *token1 = NULL;
    char *token2 = NULL;
    char *comment_ptr;
    char  commentMsg[25];
    char *ptr;

    snprintf(commentMsg, sizeof(commentMsg), "%s", pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_val.at_str);
   
    comment_ptr = commentMsg;
    token1 = threadsafe_tokenizer(&comment_ptr, " ");
    if (token1 != NULL)
      token2 = threadsafe_tokenizer(&comment_ptr, " ");
    
    if ((token2 != NULL) && 
        ((memcmp(token2,"failure",7) == 0) || 
         (memcmp(token2,"restarted",9) == 0)))
      {
      ptr = pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_val.at_str;
      if (isupper(*ptr))
        {
        *ptr = tolower(*ptr);
        pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_flags |= ATR_VFLAG_SET;
        pjob->ji_modified = 1;
        }
      }
    }
  
  return;
  } /* change_restart_comment_if_needed() */
Example #9
0
long count_proc(

  char *param_spec)

  {
  long  num_nodes = 0;
  long  num_procs = 0;
  long  total_procs = 0;
  char *substr;
  char *ppnloc;
  char *spec;
  char *spec_ptr;

  // if we get a null param spec, just return 0 procs
  if (param_spec == NULL)
    return(0);

  if ((spec = strdup(param_spec)) == NULL)
    return(-1);

  spec_ptr = spec;

  /* split on + */
  while ((substr = threadsafe_tokenizer(&spec_ptr, "+")) != NULL)
    {
    num_nodes = atoi(substr);
    if (num_nodes == 0)
      /* no number */
      num_nodes = 1;

    ppnloc = strstr(substr, ":ppn=");
    if (ppnloc == NULL)
      num_procs = 1;
    else
      num_procs = atoi(ppnloc + 5);
      
    total_procs += num_procs * num_nodes;
    }

  free(spec);

  return(total_procs);
  }  /* END count_proc */
Example #10
0
resizable_array *parse_exec_hosts(

  char *exec_hosts_param)

  {
  char            *slash;
  char            *host_tok;
  char            *exec_hosts = strdup(exec_hosts_param);
  char            *str_ptr = exec_hosts;
  char            *delims = "+";
  char            *prev_host_tok = NULL;
  host_req        *hr;
  resizable_array *host_req_list = initialize_resizable_array(100);

  while ((host_tok = threadsafe_tokenizer(&str_ptr, delims)) != NULL)
    {
    if ((slash = strchr(host_tok, '/')) != NULL)
      *slash = '\0';

    /* skip this host - the login shouldn't be part of the alps reservation */
    if ((strcmp(mom_host, host_tok)) &&
        (strcmp(mom_alias, host_tok)))
      {
      if ((prev_host_tok != NULL) &&
          (!strcmp(prev_host_tok, host_tok)))
        {
        hr = (host_req *)host_req_list->slots[host_req_list->last].item;
        hr->ppn += 1;
        }
      else
        {
        prev_host_tok = host_tok;
        hr = get_host_req(host_tok);
        insert_thing(host_req_list, hr);
        }
      }
    }

  free(exec_hosts);

  return(host_req_list);
  } /* END parse_exec_hosts() */
Example #11
0
host_req_list *parse_exec_hosts(

  char *exec_hosts_param,
  const char *mppnodes)

  {
  char            *slash;
  char            *host_tok;
  char            *exec_hosts = strdup(exec_hosts_param);
  char            *str_ptr = exec_hosts;
  const char     *delims = "+";
  char            *prev_host_tok = NULL;
  host_req        *hr;
  host_req_list   *list = new host_req_list();

  while ((host_tok = threadsafe_tokenizer(&str_ptr, delims)) != NULL)
    {
    if ((slash = strchr(host_tok, '/')) != NULL)
      *slash = '\0';

    /* skip this host - the login shouldn't be part of the alps reservation */
    if ((strcmp(mom_host, host_tok)) &&
        (strcmp(mom_alias, host_tok)))
      {
      if ((prev_host_tok != NULL) &&
          (!strcmp(prev_host_tok, host_tok)))
        {
        hr = list->back();
        hr->ppn += 1;
        }
      else
        {
        prev_host_tok = host_tok;
        hr = get_host_req(host_tok);
        list->push_back(hr);
        }
      }
    }

  free(exec_hosts);
  return(sort_exec_hosts(list,mppnodes));
  } /* END parse_exec_hosts() */
host_req_list *parse_exec_hosts(

  char *exec_hosts_param,
  const char *mppnodes)

  {
  char            *slash;
  char            *host_tok;
  char            *exec_hosts = strdup(exec_hosts_param);
  char            *str_ptr = exec_hosts;
  const char     *delims = "+";
  host_req        *hr;
  host_req_list   *list = new host_req_list();

  while ((host_tok = threadsafe_tokenizer(&str_ptr, delims)) != NULL)
    {
    if ((slash = strchr(host_tok, '/')) != NULL)
      *slash = '\0';

    /* skip this host - the login shouldn't be part of the alps reservation */
    if ((strcmp(mom_host, host_tok)) &&
        (strcmp(mom_alias, host_tok)))
      {
      std::vector<int> indices;

      if (slash != NULL)
        {
        translate_range_string_to_vector(slash + 1, indices);
        hr = get_host_req(host_tok, indices.size());
        }
      else
        hr = get_host_req(host_tok, 1);

      list->push_back(hr);
      }
    }

  free(exec_hosts);
  return(sort_exec_hosts(list,mppnodes));
  } /* END parse_exec_hosts() */
Example #13
0
resizable_array *sort_exec_hosts(
  resizable_array *exec_hosts,
  const char      *mppnodes)
  {
  if(mppnodes == NULL)
    {
    return exec_hosts;
    }

  char *tmp = strdup(mppnodes);
  char *tmp_str = tmp;
  resizable_array *tmp_host_list = initialize_resizable_array(100);
  char *tok;
  int iter;
  host_req *pHr;
    
  while((tok = threadsafe_tokenizer(&tmp_str,",")) != NULL)
    {
    iter = -1;
    while((pHr = (host_req *)next_thing_from_back(exec_hosts,&iter)) != NULL)
      {
      if(strcmp(pHr->hostname,tok) == 0)
        {
        insert_thing(tmp_host_list,pHr);
        remove_thing(exec_hosts,pHr);
        break;
        }
      }
    }
  iter = -1;
  while((pHr = (host_req *)next_thing_from_back(exec_hosts,&iter)) != NULL)
    {
    insert_thing(tmp_host_list,pHr);
    }
  free_resizable_array(exec_hosts);
  free(tmp);
  return tmp_host_list;
  }
host_req_list *sort_exec_hosts(
  host_req_list *exec_hosts,
  const char      *mppnodes)
  {
  if(mppnodes == NULL)
    {
    return exec_hosts;
    }

  char *tmp = strdup(mppnodes);
  char *tmp_str = tmp;
  host_req_list *tmp_host_list = new host_req_list();
  char *tok;
  host_req *pHr;
    
  while((tok = threadsafe_tokenizer(&tmp_str,",")) != NULL)
    {
    for(int i = exec_hosts->size() - 1;i >= 0;i--)
      {
      pHr = exec_hosts->at(i);
      if(strcmp(pHr->hostname,tok) == 0)
        {
        tmp_host_list->push_back(pHr);
        exec_hosts->erase(exec_hosts->begin() + i);
        break;
        }
      }
    }
  while(exec_hosts->size() != 0)
    {
    tmp_host_list->push_back(exec_hosts->back());
    exec_hosts->pop_back();
    }
  delete exec_hosts;
  free(tmp);
  return tmp_host_list;
  }
void update_job_data(

  struct pbsnode *np,            /* I */
  const char     *jobstring_in)  /* I (changed attributes sent by mom) */

  {
  char  *jobdata;
  char  *jobdata_ptr;
  char  *jobidstr;
  char  *attr_name;
  char  *attr_value;
  char   log_buf[LOCAL_LOG_BUF_SIZE];

  job   *pjob = NULL;
  int    on_node = FALSE;

  if ((jobstring_in == NULL) || (!isdigit(*jobstring_in)))
    {
    /* NO-OP */

    return;
    }

  /* FORMAT <JOBID>:<atrtributename=value>,<atrtributename=value>... */

  jobdata = strdup(jobstring_in);
  jobdata_ptr = jobdata;

  jobidstr = threadsafe_tokenizer(&jobdata_ptr, ":");

  if ((jobidstr != NULL) && isdigit(*jobidstr))
    {
    if (strstr(jobidstr, server_name) != NULL)
      {
      on_node = is_job_on_node(np, job_mapper.get_id(jobidstr));
      pjob = svr_find_job(jobidstr, TRUE);

      if (pjob != NULL)
        {
        int bad;
        svrattrl tA;
        mutex_mgr job_mutex(pjob->ji_mutex, true);
        
        /* job exists, so get the attributes and update them */
        attr_name = threadsafe_tokenizer(&jobdata_ptr, "=");
        
        while (attr_name != NULL)
          {
          attr_value = threadsafe_tokenizer(&jobdata_ptr, ",");
          
          if (LOGLEVEL >= 9)
            {
            sprintf(log_buf, "Mom sent changed attribute %s value %s for job %s",
              attr_name,
              attr_value,
              pjob->ji_qs.ji_jobid);
              
            log_event(PBSEVENT_JOB,PBS_EVENTCLASS_JOB,pjob->ji_qs.ji_jobid,log_buf);  
            }
          
          memset(&tA, 0, sizeof(tA));

          tA.al_name  = attr_name;
          tA.al_resc  = (char *)"";
          tA.al_value = attr_value;
          tA.al_op    = SET;

          modify_job_attr(
            pjob,
            &tA,                              /* I: ATTR_sched_hint - svrattrl */
            ATR_DFLAG_MGWR | ATR_DFLAG_SvWR,
            &bad);

          attr_name = threadsafe_tokenizer(&jobdata_ptr, "=");
          }
        }
      
      if (on_node == FALSE)
        {
        /* job is reported by mom but server has no record of job */
        sprintf(log_buf, "stray job %s reported on %s", jobidstr, np->nd_name);

        log_err(-1, __func__, log_buf);
        }
      }
    }

  free(jobdata);
  }  /* END update_job_data() */