Skip to content

Commit

Permalink
Qstat -f fails for more than 48 job ids (#1047)
Browse files Browse the repository at this point in the history
Qstat -f fails for more than 48 job ids
  • Loading branch information
Bhagat-Rajput authored and subhasisb committed Mar 28, 2019
1 parent 97b17b6 commit aae6c52
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 72 deletions.
29 changes: 17 additions & 12 deletions src/cmds/pbs_rstat.c
Expand Up @@ -56,6 +56,7 @@
/* prototypes */
char *convert_resv_state(char *pcode, int long_str);
void handle_resv(char *resv_id, char *server, int how);
static int check_width;

/**
* @brief
Expand Down Expand Up @@ -235,8 +236,6 @@ main(int argc, char *argv[])
char *resv_id; /* reservation ID from the command line */
char resv_id_out[PBS_MAXCLTJOBID];
char server_out[MAXSERVERNAME];
int check_seqid_len; /* for dynamic pbs_rstat width*/

/*test for real deal or just version and exit*/

PRINT_VERSION_AND_EXIT(argc, argv);
Expand Down Expand Up @@ -278,15 +277,6 @@ main(int argc, char *argv[])
exit(1);
}

/* check the server attribute max_job_sequence_id value */
check_seqid_len = check_max_job_sequence_id("pbs_rstat");
if (check_seqid_len == 1) {
how |= DISP_INCR_WIDTH; /* increase column width*/
} else if (check_seqid_len == -1) {
fprintf(stderr, "pbs_rstat: Unable to fetch the width format\n");
exit(1);
}

if (optind == argc)
handle_resv(NULL, NULL, how);
else {
Expand Down Expand Up @@ -337,6 +327,8 @@ handle_resv(char *resv_id, char *server, int how)
int pbs_sd;
struct batch_status *bstat;
char *errmsg;
/* for dynamic pbs_rstat width */
struct batch_status *server_attrs;

pbs_sd = cnt2server(server);

Expand All @@ -346,7 +338,20 @@ handle_resv(char *resv_id, char *server, int how)
CS_close_app();
exit(pbs_errno);
}

/* check the server attribute max_job_sequence_id value */
if (check_width == 0) {
server_attrs = pbs_statserver(pbs_sd, NULL, NULL);
if (server_attrs != NULL) {
int check_seqid_len;
check_seqid_len = check_max_job_sequence_id(server_attrs);
if (check_seqid_len == 1) {
how |= DISP_INCR_WIDTH; /* increased column width*/
}
pbs_statfree(server_attrs);
server_attrs = NULL;
check_width = 1;
}
}

bstat = pbs_statresv(pbs_sd, resv_id, NULL, NULL);

Expand Down
18 changes: 9 additions & 9 deletions src/cmds/qstat.c
Expand Up @@ -2190,7 +2190,6 @@ main(int argc, char **argv, char **envp) /* qstat */
int wide=0;
int format = 0;
time_t timenow;
int check_seqid_len; /* for dynamic qstat width */

#if TCL_QSTAT
char option[3];
Expand Down Expand Up @@ -2785,6 +2784,15 @@ qstat -B [-f] [-F format] [-D delim] [ server_name... ]\n";
p_server = NULL;
}

/* check the server attribute max_job_sequence_id value */
if (p_server != NULL) {
int check_seqid_len; /* for dynamic qstat width */
check_seqid_len = check_max_job_sequence_id(p_server);
if (check_seqid_len == 1) {
how_opt |= ALT_DISPLAY_INCR_WIDTH; /* increase column width */
}
}

if ((stat_single_job == 1) || (new_atropl == 0)) {
if (E_opt == 1)
p_status = pbs_statjob(connect, query_job_list, display_attribs, extend);
Expand Down Expand Up @@ -2852,14 +2860,6 @@ qstat -B [-f] [-F format] [-D delim] [ server_name... ]\n";
any_failed = pbs_errno;
}
} else {
/* check the server attribute max_job_sequence_id value */
check_seqid_len = check_max_job_sequence_id("qstat");
if (check_seqid_len == 1) {
how_opt |= ALT_DISPLAY_INCR_WIDTH; /* increase column width*/
} else if(check_seqid_len == -1) {
fprintf(stderr, "qstat: Unable to fetch the width format\n");
exit(1);
}

#ifdef NAS /* localmod 071 */
if (p_server) {
Expand Down
6 changes: 3 additions & 3 deletions src/include/cmds.h
Expand Up @@ -78,6 +78,6 @@ extern int parse_jobid(char *, char **, char **, char **);
extern int parse_stage_name(char *, char *, char *, char *);
extern void prt_error(char *, char *, int);
extern int cnt2mom(char *server);
extern int check_max_job_sequence_id(char *);
extern void set_attr_error_exit(struct attrl **, char *, char *);
extern void set_attr_resc_error_exit(struct attrl **, char *, char *, char *);
extern int check_max_job_sequence_id(struct batch_status *);
extern void set_attr_error_exit(struct attrl **, char *, char *);
extern void set_attr_resc_error_exit(struct attrl **, char *, char *, char *);
65 changes: 17 additions & 48 deletions src/lib/Libcmds/get_attr.c
Expand Up @@ -79,61 +79,30 @@ get_attr(struct attrl *pattrl, char *name, char *resc)

/*
* @brief
* check_max_job_sequence_id - connect to the server and retrieve the
* max_job_sequence_id attribute value
* check_max_job_sequence_id - retrieve the max_job_sequence_id attribute value
*
* @param[in]cmd_name - PBS command name
* @param[in]server_attrs - Batch status
*
* @retval 1 success
* @retval -1 error
* @retval 0 error/attribute is not set
*
*/
int check_max_job_sequence_id(char *cmd_name)
int
check_max_job_sequence_id(struct batch_status *server_attrs)
{

struct batch_status *server_attrs;
int connect;
char server_out[MAXSERVERNAME];
server_out[0] = '\0';

connect = cnt2server(server_out);
if (connect <= 0) {
fprintf(stderr, "%s: cannot connect to server (errno=%d)\n", cmd_name,
pbs_errno);
return -1;
}
server_attrs = pbs_statserver(connect, NULL, NULL);
if (server_attrs == NULL) {
if (pbs_errno) {
char *errmsg;
errmsg = pbs_geterrmsg(connect);
if (errmsg != NULL)
fprintf(stderr, "%s: %s\n", cmd_name, errmsg);
else
fprintf(stderr, "%s: Error (%d) getting status of server ", cmd_name, pbs_errno);
}
return -1;
char * value;
value = get_attr(server_attrs->attribs, ATTR_max_job_sequence_id, NULL);
if (value == NULL) {
/* if server is not configured for max_job_sequence_id
* or attribute is unset */
return 0;
} else {
struct attrl *attr;
char * value;
attr = server_attrs->attribs;
value = get_attr(attr, ATTR_max_job_sequence_id, NULL);
if (value == NULL) {
pbs_statfree(server_attrs);
pbs_disconnect(connect);
/* if server is not configured for max_job_sequence_id
* or attribute is unset */
return 0;
} else {
/* if value is set */
long long seq_id = 0;
seq_id = strtoul(value, NULL, 10);
if (seq_id > PBS_DFLT_MAX_JOB_SEQUENCE_ID) {
pbs_statfree(server_attrs);
pbs_disconnect(connect);
return 1;
}
return 0;
/* if attribute is set set */
long long seq_id = 0;
seq_id = strtoul(value, NULL, 10);
if (seq_id > PBS_DFLT_MAX_JOB_SEQUENCE_ID) {
return 1;
}
return 0;
}
}
23 changes: 23 additions & 0 deletions test/tests/functional/pbs_qstat.py
Expand Up @@ -79,3 +79,26 @@ def test_qstat_pt(self):
sj_escaped + r'\s+\S+\s+\S+\s+(--\s+[RQ]|100\s+X)\s+\S+',
qstat_out)
self.assertIsNotNone(match, 'Job output does not match')

def test_qstat_qselect(self):
"""
Test to check that qstat can handle more than 150 jobs query at a time
without any connection issues.
"""
self.server.restart()
j = Job(TEST_USER)
for i in range(150):
self.server.submit(j)
ret_msg = 'Too many open connections.'
qselect_cmd = ' `' + \
os.path.join(
self.server.client_conf['PBS_EXEC'],
'bin',
'qselect') + '`'
qstat_cmd = os.path.join(
self.server.client_conf['PBS_EXEC'], 'bin', 'qstat')
final_cmd = qstat_cmd + qselect_cmd
ret = self.du.run_cmd(self.server.hostname, final_cmd,
as_script=True)
if ret['rc'] != 0:
self.assertFalse(ret['err'][0], ret_msg)

0 comments on commit aae6c52

Please sign in to comment.