PageRenderTime 58ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/src/common/slurm_protocol_defs.c

https://github.com/cfenoy/slurm
C | 2724 lines | 2644 code | 21 blank | 59 comment | 10 complexity | b8da408ababff17ef9606e263a61ce0c MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. /*****************************************************************************\
  2. * slurm_protocol_defs.c - functions for initializing and releasing
  3. * storage for RPC data structures. these are the functions used by
  4. * the slurm daemons directly, not for user client use.
  5. *****************************************************************************
  6. * Copyright (C) 2002-2007 The Regents of the University of California.
  7. * Copyright (C) 2008-2010 Lawrence Livermore National Security.
  8. * Portions Copyright (C) 2010 SchedMD <http://www.schedmd.com>.
  9. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
  10. * Written by Kevin Tew <tew1@llnl.gov> et. al.
  11. * CODE-OCEC-09-009. All rights reserved.
  12. *
  13. * This file is part of SLURM, a resource management program.
  14. * For details, see <http://www.schedmd.com/slurmdocs/>.
  15. * Please also read the included file: DISCLAIMER.
  16. *
  17. * SLURM is free software; you can redistribute it and/or modify it under
  18. * the terms of the GNU General Public License as published by the Free
  19. * Software Foundation; either version 2 of the License, or (at your option)
  20. * any later version.
  21. *
  22. * In addition, as a special exception, the copyright holders give permission
  23. * to link the code of portions of this program with the OpenSSL library under
  24. * certain conditions as described in each individual source file, and
  25. * distribute linked combinations including the two. You must obey the GNU
  26. * General Public License in all respects for all of the code used other than
  27. * OpenSSL. If you modify file(s) with this exception, you may extend this
  28. * exception to your version of the file(s), but you are not obligated to do
  29. * so. If you do not wish to do so, delete this exception statement from your
  30. * version. If you delete this exception statement from all source files in
  31. * the program, then also delete it here.
  32. *
  33. * SLURM is distributed in the hope that it will be useful, but WITHOUT ANY
  34. * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  35. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  36. * details.
  37. *
  38. * You should have received a copy of the GNU General Public License along
  39. * with SLURM; if not, write to the Free Software Foundation, Inc.,
  40. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  41. \*****************************************************************************/
  42. #if HAVE_CONFIG_H
  43. # include "config.h"
  44. #endif
  45. #if HAVE_STDLIB_H
  46. # include <stdlib.h>
  47. #endif
  48. #include <stdio.h>
  49. #include "src/common/log.h"
  50. #include "src/common/node_select.h"
  51. #include "src/common/slurm_accounting_storage.h"
  52. #include "src/common/slurm_cred.h"
  53. #include "src/common/slurm_protocol_defs.h"
  54. #include "src/common/switch.h"
  55. #include "src/common/xmalloc.h"
  56. #include "src/common/xstring.h"
  57. #include "src/common/job_options.h"
  58. #include "src/common/forward.h"
  59. #include "src/common/slurm_jobacct_gather.h"
  60. #include "src/common/slurm_acct_gather_energy.h"
  61. #include "src/plugins/select/bluegene/bg_enums.h"
  62. /*
  63. ** Define slurm-specific aliases for use by plugins, see slurm_xlator.h
  64. ** for details.
  65. */
  66. strong_alias(preempt_mode_string, slurm_preempt_mode_string);
  67. strong_alias(preempt_mode_num, slurm_preempt_mode_num);
  68. strong_alias(job_reason_string, slurm_job_reason_string);
  69. strong_alias(job_state_string, slurm_job_state_string);
  70. strong_alias(job_state_string_compact, slurm_job_state_string_compact);
  71. strong_alias(job_state_num, slurm_job_state_num);
  72. strong_alias(node_state_string, slurm_node_state_string);
  73. strong_alias(node_state_string_compact, slurm_node_state_string_compact);
  74. strong_alias(private_data_string, slurm_private_data_string);
  75. strong_alias(accounting_enforce_string, slurm_accounting_enforce_string);
  76. strong_alias(conn_type_string, slurm_conn_type_string);
  77. strong_alias(conn_type_string_full, slurm_conn_type_string_full);
  78. strong_alias(node_use_string, slurm_node_use_string);
  79. strong_alias(bg_block_state_string, slurm_bg_block_state_string);
  80. strong_alias(reservation_flags_string, slurm_reservation_flags_string);
  81. static void _free_all_front_end_info(front_end_info_msg_t *msg);
  82. static void _free_all_job_info (job_info_msg_t *msg);
  83. static void _free_all_node_info (node_info_msg_t *msg);
  84. static void _free_all_partitions (partition_info_msg_t *msg);
  85. static void _free_all_reservations(reserve_info_msg_t *msg);
  86. static void _free_all_step_info (job_step_info_response_msg_t *msg);
  87. /*
  88. * slurm_msg_t_init - initialize a slurm message
  89. * OUT msg - pointer to the slurm_msg_t structure which will be initialized
  90. */
  91. extern void slurm_msg_t_init(slurm_msg_t *msg)
  92. {
  93. memset(msg, 0, sizeof(slurm_msg_t));
  94. msg->conn_fd = -1;
  95. msg->msg_type = (uint16_t)NO_VAL;
  96. msg->protocol_version = (uint16_t)NO_VAL;
  97. forward_init(&msg->forward, NULL);
  98. return;
  99. }
  100. /*
  101. * slurm_msg_t_copy - initialize a slurm_msg_t structure "dest" with
  102. * values from the "src" slurm_msg_t structure.
  103. * IN src - Pointer to the initialized message from which "dest" will
  104. * be initialized.
  105. * OUT dest - Pointer to the slurm_msg_t which will be initialized.
  106. * NOTE: the "dest" structure will contain pointers into the contents of "src".
  107. */
  108. extern void slurm_msg_t_copy(slurm_msg_t *dest, slurm_msg_t *src)
  109. {
  110. slurm_msg_t_init(dest);
  111. dest->forward = src->forward;
  112. dest->ret_list = src->ret_list;
  113. dest->forward_struct = src->forward_struct;
  114. dest->orig_addr.sin_addr.s_addr = 0;
  115. return;
  116. }
  117. extern void slurm_destroy_char(void *object)
  118. {
  119. char *tmp = (char *)object;
  120. xfree(tmp);
  121. }
  122. extern void slurm_destroy_uint32_ptr(void *object)
  123. {
  124. uint32_t *tmp = (uint32_t *)object;
  125. xfree(tmp);
  126. }
  127. /* here to add \\ to all \" in a string this needs to be xfreed later */
  128. extern char *slurm_add_slash_to_quotes(char *str)
  129. {
  130. char *dup, *copy = NULL;
  131. int len = 0;
  132. if(!str || !(len = strlen(str)))
  133. return NULL;
  134. /* make a buffer 2 times the size just to be safe */
  135. copy = dup = xmalloc((2 * len) + 1);
  136. if (copy)
  137. do if (*str == '\\' || *str == '\'' || *str == '"')
  138. *dup++ = '\\';
  139. while ((*dup++ = *str++));
  140. return copy;
  141. }
  142. /* returns number of objects added to list */
  143. extern int slurm_addto_char_list(List char_list, char *names)
  144. {
  145. int i=0, start=0;
  146. char *name = NULL, *tmp_char = NULL;
  147. ListIterator itr = NULL;
  148. char quote_c = '\0';
  149. int quote = 0;
  150. int count = 0;
  151. if (!char_list) {
  152. error("No list was given to fill in");
  153. return 0;
  154. }
  155. itr = list_iterator_create(char_list);
  156. if (names) {
  157. if (names[i] == '\"' || names[i] == '\'') {
  158. quote_c = names[i];
  159. quote = 1;
  160. i++;
  161. }
  162. start = i;
  163. while (names[i]) {
  164. //info("got %d - %d = %d", i, start, i-start);
  165. if (quote && (names[i] == quote_c))
  166. break;
  167. else if ((names[i] == '\"') || (names[i] == '\''))
  168. names[i] = '`';
  169. else if (names[i] == ',') {
  170. name = xmalloc((i-start+1));
  171. memcpy(name, names+start, (i-start));
  172. //info("got %s %d", name, i-start);
  173. while ((tmp_char = list_next(itr))) {
  174. if (!strcasecmp(tmp_char, name))
  175. break;
  176. }
  177. /* If we get a duplicate remove the
  178. * first one and tack this on the end.
  179. * This is needed for get associations
  180. * with qos.
  181. */
  182. if (tmp_char)
  183. list_delete_item(itr);
  184. else
  185. count++;
  186. xstrtolower(name);
  187. list_append(char_list, name);
  188. list_iterator_reset(itr);
  189. i++;
  190. start = i;
  191. if (!names[i]) {
  192. info("There is a problem with "
  193. "your request. It appears you "
  194. "have spaces inside your list.");
  195. count = 0;
  196. goto endit;
  197. }
  198. }
  199. i++;
  200. }
  201. name = xmalloc((i-start)+1);
  202. memcpy(name, names+start, (i-start));
  203. while ((tmp_char = list_next(itr))) {
  204. if (!strcasecmp(tmp_char, name))
  205. break;
  206. }
  207. /* If we get a duplicate remove the
  208. * first one and tack this on the end.
  209. * This is needed for get associations
  210. * with qos.
  211. */
  212. if (tmp_char)
  213. list_delete_item(itr);
  214. else
  215. count++;
  216. xstrtolower(name);
  217. list_append(char_list, name);
  218. }
  219. endit:
  220. list_iterator_destroy(itr);
  221. return count;
  222. }
  223. extern int slurm_sort_char_list_asc(char *name_a, char *name_b)
  224. {
  225. int diff = strcmp(name_a, name_b);
  226. if (diff < 0)
  227. return -1;
  228. else if (diff > 0)
  229. return 1;
  230. return 0;
  231. }
  232. extern int slurm_sort_char_list_desc(char *name_a, char *name_b)
  233. {
  234. int diff = strcmp(name_a, name_b);
  235. if (diff > 0)
  236. return -1;
  237. else if (diff < 0)
  238. return 1;
  239. return 0;
  240. }
  241. extern void slurm_free_last_update_msg(last_update_msg_t * msg)
  242. {
  243. xfree(msg);
  244. }
  245. extern void slurm_free_reboot_msg(reboot_msg_t * msg)
  246. {
  247. if (msg) {
  248. xfree(msg->node_list);
  249. xfree(msg);
  250. }
  251. }
  252. extern void slurm_free_shutdown_msg(shutdown_msg_t * msg)
  253. {
  254. xfree(msg);
  255. }
  256. extern void slurm_free_job_alloc_info_msg(job_alloc_info_msg_t * msg)
  257. {
  258. xfree(msg);
  259. }
  260. extern void slurm_free_return_code_msg(return_code_msg_t * msg)
  261. {
  262. xfree(msg);
  263. }
  264. extern void slurm_free_job_id_msg(job_id_msg_t * msg)
  265. {
  266. xfree(msg);
  267. }
  268. extern void slurm_free_job_step_id_msg(job_step_id_msg_t * msg)
  269. {
  270. xfree(msg);
  271. }
  272. extern void slurm_free_job_id_request_msg(job_id_request_msg_t * msg)
  273. {
  274. xfree(msg);
  275. }
  276. extern void slurm_free_update_step_msg(step_update_request_msg_t * msg)
  277. {
  278. xfree(msg);
  279. }
  280. extern void slurm_free_job_id_response_msg(job_id_response_msg_t * msg)
  281. {
  282. xfree(msg);
  283. }
  284. extern void slurm_free_job_step_kill_msg(job_step_kill_msg_t * msg)
  285. {
  286. xfree(msg);
  287. }
  288. extern void slurm_free_job_info_request_msg(job_info_request_msg_t *msg)
  289. {
  290. xfree(msg);
  291. }
  292. extern void slurm_free_job_step_info_request_msg(job_step_info_request_msg_t *msg)
  293. {
  294. xfree(msg);
  295. }
  296. extern void slurm_free_front_end_info_request_msg
  297. (front_end_info_request_msg_t *msg)
  298. {
  299. xfree(msg);
  300. }
  301. extern void slurm_free_node_info_request_msg(node_info_request_msg_t *msg)
  302. {
  303. xfree(msg);
  304. }
  305. extern void slurm_free_part_info_request_msg(part_info_request_msg_t *msg)
  306. {
  307. xfree(msg);
  308. }
  309. extern void slurm_free_job_desc_msg(job_desc_msg_t * msg)
  310. {
  311. int i;
  312. if (msg) {
  313. xfree(msg->account);
  314. xfree(msg->alloc_node);
  315. if (msg->argv) {
  316. for (i = 0; i < msg->argc; i++)
  317. xfree(msg->argv[i]);
  318. }
  319. xfree(msg->argv);
  320. xfree(msg->blrtsimage);
  321. xfree(msg->ckpt_dir);
  322. xfree(msg->comment);
  323. xfree(msg->cpu_bind);
  324. xfree(msg->dependency);
  325. for (i = 0; i < msg->env_size; i++)
  326. xfree(msg->environment[i]);
  327. xfree(msg->environment);
  328. xfree(msg->std_err);
  329. xfree(msg->exc_nodes);
  330. xfree(msg->features);
  331. xfree(msg->gres);
  332. xfree(msg->std_in);
  333. xfree(msg->licenses);
  334. xfree(msg->linuximage);
  335. xfree(msg->mail_user);
  336. xfree(msg->mem_bind);
  337. xfree(msg->mloaderimage);
  338. xfree(msg->name);
  339. xfree(msg->network);
  340. xfree(msg->std_out);
  341. xfree(msg->partition);
  342. xfree(msg->ramdiskimage);
  343. xfree(msg->req_nodes);
  344. xfree(msg->reservation);
  345. xfree(msg->resp_host);
  346. xfree(msg->script);
  347. select_g_select_jobinfo_free(msg->select_jobinfo);
  348. msg->select_jobinfo = NULL;
  349. for (i = 0; i < msg->spank_job_env_size; i++)
  350. xfree(msg->spank_job_env[i]);
  351. xfree(msg->spank_job_env);
  352. xfree(msg->wckey);
  353. xfree(msg->work_dir);
  354. xfree(msg);
  355. }
  356. }
  357. extern void slurm_free_job_launch_msg(batch_job_launch_msg_t * msg)
  358. {
  359. int i;
  360. if (msg) {
  361. xfree(msg->alias_list);
  362. xfree(msg->nodes);
  363. xfree(msg->cpu_bind);
  364. xfree(msg->cpus_per_node);
  365. xfree(msg->cpu_count_reps);
  366. xfree(msg->script);
  367. xfree(msg->std_err);
  368. xfree(msg->std_in);
  369. xfree(msg->std_out);
  370. xfree(msg->work_dir);
  371. xfree(msg->ckpt_dir);
  372. xfree(msg->restart_dir);
  373. for (i = 0; i < msg->argc; i++)
  374. xfree(msg->argv[i]);
  375. xfree(msg->argv);
  376. for (i = 0; i < msg->spank_job_env_size; i++)
  377. xfree(msg->spank_job_env[i]);
  378. xfree(msg->spank_job_env);
  379. if (msg->environment) {
  380. for (i = 0; i < msg->envc; i++)
  381. xfree(msg->environment[i]);
  382. xfree(msg->environment);
  383. }
  384. select_g_select_jobinfo_free(msg->select_jobinfo);
  385. msg->select_jobinfo = NULL;
  386. slurm_cred_destroy(msg->cred);
  387. xfree(msg);
  388. }
  389. }
  390. extern void slurm_free_job_info(job_info_t * job)
  391. {
  392. if (job) {
  393. slurm_free_job_info_members(job);
  394. xfree(job);
  395. }
  396. }
  397. extern void slurm_free_job_info_members(job_info_t * job)
  398. {
  399. if (job) {
  400. xfree(job->account);
  401. xfree(job->alloc_node);
  402. xfree(job->batch_host);
  403. xfree(job->batch_script);
  404. xfree(job->command);
  405. xfree(job->comment);
  406. xfree(job->dependency);
  407. xfree(job->exc_nodes);
  408. xfree(job->exc_node_inx);
  409. xfree(job->features);
  410. xfree(job->gres);
  411. xfree(job->licenses);
  412. xfree(job->name);
  413. xfree(job->network);
  414. xfree(job->node_inx);
  415. xfree(job->nodes);
  416. xfree(job->partition);
  417. xfree(job->qos);
  418. xfree(job->req_node_inx);
  419. xfree(job->req_nodes);
  420. xfree(job->resv_name);
  421. select_g_select_jobinfo_free(job->select_jobinfo);
  422. job->select_jobinfo = NULL;
  423. free_job_resources(&job->job_resrcs);
  424. xfree(job->state_desc);
  425. xfree(job->wckey);
  426. xfree(job->work_dir);
  427. }
  428. }
  429. extern void slurm_free_acct_gather_node_resp_msg(
  430. acct_gather_node_resp_msg_t *msg)
  431. {
  432. if (msg) {
  433. xfree(msg->node_name);
  434. acct_gather_energy_destroy(msg->energy);
  435. xfree(msg);
  436. }
  437. }
  438. extern void slurm_free_node_registration_status_msg(
  439. slurm_node_registration_status_msg_t * msg)
  440. {
  441. if (msg) {
  442. xfree(msg->arch);
  443. if (msg->energy)
  444. acct_gather_energy_destroy(msg->energy);
  445. if (msg->gres_info)
  446. free_buf(msg->gres_info);
  447. xfree(msg->job_id);
  448. xfree(msg->node_name);
  449. xfree(msg->os);
  450. xfree(msg->step_id);
  451. if (msg->switch_nodeinfo)
  452. switch_g_free_node_info(&msg->switch_nodeinfo);
  453. xfree(msg);
  454. }
  455. }
  456. extern void slurm_free_update_front_end_msg(update_front_end_msg_t * msg)
  457. {
  458. if (msg) {
  459. xfree(msg->name);
  460. xfree(msg->reason);
  461. xfree(msg);
  462. }
  463. }
  464. extern void slurm_free_update_node_msg(update_node_msg_t * msg)
  465. {
  466. if (msg) {
  467. xfree(msg->features);
  468. xfree(msg->gres);
  469. xfree(msg->node_addr);
  470. xfree(msg->node_hostname);
  471. xfree(msg->node_names);
  472. xfree(msg->reason);
  473. xfree(msg);
  474. }
  475. }
  476. extern void slurm_free_update_part_msg(update_part_msg_t * msg)
  477. {
  478. if (msg) {
  479. slurm_free_partition_info_members((partition_info_t *)msg);
  480. xfree(msg);
  481. }
  482. }
  483. extern void slurm_free_delete_part_msg(delete_part_msg_t * msg)
  484. {
  485. if (msg) {
  486. xfree(msg->name);
  487. xfree(msg);
  488. }
  489. }
  490. extern void slurm_free_resv_desc_msg(resv_desc_msg_t * msg)
  491. {
  492. if (msg) {
  493. xfree(msg->accounts);
  494. xfree(msg->features);
  495. xfree(msg->licenses);
  496. xfree(msg->name);
  497. xfree(msg->node_cnt);
  498. xfree(msg->node_list);
  499. xfree(msg->partition);
  500. xfree(msg->users);
  501. xfree(msg);
  502. }
  503. }
  504. extern void slurm_free_resv_name_msg(reservation_name_msg_t * msg)
  505. {
  506. if (msg) {
  507. xfree(msg->name);
  508. xfree(msg);
  509. }
  510. }
  511. extern void slurm_free_resv_info_request_msg(resv_info_request_msg_t * msg)
  512. {
  513. xfree(msg);
  514. }
  515. extern void slurm_free_job_step_create_request_msg(
  516. job_step_create_request_msg_t *msg)
  517. {
  518. if (msg) {
  519. xfree(msg->features);
  520. xfree(msg->gres);
  521. xfree(msg->host);
  522. xfree(msg->name);
  523. xfree(msg->network);
  524. xfree(msg->node_list);
  525. xfree(msg->ckpt_dir);
  526. xfree(msg);
  527. }
  528. }
  529. extern void slurm_free_complete_job_allocation_msg(
  530. complete_job_allocation_msg_t * msg)
  531. {
  532. xfree(msg);
  533. }
  534. extern void slurm_free_complete_batch_script_msg(
  535. complete_batch_script_msg_t * msg)
  536. {
  537. if (msg) {
  538. jobacctinfo_destroy(msg->jobacct);
  539. xfree(msg->node_name);
  540. xfree(msg);
  541. }
  542. }
  543. extern void slurm_free_launch_tasks_response_msg(
  544. launch_tasks_response_msg_t *msg)
  545. {
  546. if (msg) {
  547. xfree(msg->node_name);
  548. xfree(msg->local_pids);
  549. xfree(msg->task_ids);
  550. xfree(msg);
  551. }
  552. }
  553. extern void slurm_free_kill_job_msg(kill_job_msg_t * msg)
  554. {
  555. if (msg) {
  556. int i;
  557. xfree(msg->nodes);
  558. select_g_select_jobinfo_free(msg->select_jobinfo);
  559. msg->select_jobinfo = NULL;
  560. for (i=0; i<msg->spank_job_env_size; i++)
  561. xfree(msg->spank_job_env[i]);
  562. xfree(msg->spank_job_env);
  563. xfree(msg);
  564. }
  565. }
  566. extern void slurm_free_signal_job_msg(signal_job_msg_t * msg)
  567. {
  568. xfree(msg);
  569. }
  570. extern void slurm_free_update_job_time_msg(job_time_msg_t * msg)
  571. {
  572. xfree(msg);
  573. }
  574. extern void slurm_free_task_exit_msg(task_exit_msg_t * msg)
  575. {
  576. if (msg) {
  577. xfree(msg->task_id_list);
  578. xfree(msg);
  579. }
  580. }
  581. extern void slurm_free_launch_tasks_request_msg(launch_tasks_request_msg_t * msg)
  582. {
  583. int i;
  584. if (msg == NULL)
  585. return;
  586. slurm_cred_destroy(msg->cred);
  587. if (msg->env) {
  588. for (i = 0; i < msg->envc; i++) {
  589. xfree(msg->env[i]);
  590. }
  591. xfree(msg->env);
  592. }
  593. xfree(msg->alias_list);
  594. xfree(msg->cwd);
  595. xfree(msg->cpu_bind);
  596. xfree(msg->mem_bind);
  597. if (msg->argv) {
  598. for (i = 0; i < msg->argc; i++) {
  599. xfree(msg->argv[i]);
  600. }
  601. xfree(msg->argv);
  602. }
  603. for (i = 0; i < msg->spank_job_env_size; i++) {
  604. xfree(msg->spank_job_env[i]);
  605. }
  606. xfree(msg->spank_job_env);
  607. if(msg->nnodes && msg->global_task_ids)
  608. for(i=0; i<msg->nnodes; i++) {
  609. xfree(msg->global_task_ids[i]);
  610. }
  611. xfree(msg->tasks_to_launch);
  612. xfree(msg->cpus_allocated);
  613. xfree(msg->resp_port);
  614. xfree(msg->io_port);
  615. xfree(msg->global_task_ids);
  616. xfree(msg->ifname);
  617. xfree(msg->ofname);
  618. xfree(msg->efname);
  619. xfree(msg->task_prolog);
  620. xfree(msg->task_epilog);
  621. xfree(msg->complete_nodelist);
  622. xfree(msg->ckpt_dir);
  623. xfree(msg->restart_dir);
  624. if (msg->switch_job)
  625. switch_free_jobinfo(msg->switch_job);
  626. if (msg->options)
  627. job_options_destroy(msg->options);
  628. if (msg->select_jobinfo)
  629. select_g_select_jobinfo_free(msg->select_jobinfo);
  630. xfree(msg);
  631. }
  632. extern void slurm_free_task_user_managed_io_stream_msg(
  633. task_user_managed_io_msg_t *msg)
  634. {
  635. xfree(msg);
  636. }
  637. extern void slurm_free_reattach_tasks_request_msg(
  638. reattach_tasks_request_msg_t *msg)
  639. {
  640. if (msg) {
  641. xfree(msg->resp_port);
  642. xfree(msg->io_port);
  643. slurm_cred_destroy(msg->cred);
  644. xfree(msg);
  645. }
  646. }
  647. extern void slurm_free_reattach_tasks_response_msg(
  648. reattach_tasks_response_msg_t *msg)
  649. {
  650. int i;
  651. if (msg) {
  652. xfree(msg->node_name);
  653. xfree(msg->local_pids);
  654. xfree(msg->gtids);
  655. for (i = 0; i < msg->ntasks; i++) {
  656. xfree(msg->executable_names[i]);
  657. }
  658. xfree(msg->executable_names);
  659. xfree(msg);
  660. }
  661. }
  662. extern void slurm_free_kill_tasks_msg(kill_tasks_msg_t * msg)
  663. {
  664. xfree(msg);
  665. }
  666. extern void slurm_free_checkpoint_tasks_msg(checkpoint_tasks_msg_t * msg)
  667. {
  668. if (msg) {
  669. xfree(msg->image_dir);
  670. xfree(msg);
  671. }
  672. }
  673. extern void slurm_free_epilog_complete_msg(epilog_complete_msg_t * msg)
  674. {
  675. if (msg) {
  676. xfree(msg->node_name);
  677. switch_g_free_node_info(&msg->switch_nodeinfo);
  678. xfree(msg);
  679. }
  680. }
  681. extern void slurm_free_srun_job_complete_msg(
  682. srun_job_complete_msg_t * msg)
  683. {
  684. xfree(msg);
  685. }
  686. extern void slurm_free_srun_exec_msg(srun_exec_msg_t *msg)
  687. {
  688. int i;
  689. if (msg) {
  690. for (i = 0; i < msg->argc; i++)
  691. xfree(msg->argv[i]);
  692. xfree(msg->argv);
  693. xfree(msg);
  694. }
  695. }
  696. extern void slurm_free_srun_ping_msg(srun_ping_msg_t * msg)
  697. {
  698. xfree(msg);
  699. }
  700. extern void slurm_free_srun_node_fail_msg(srun_node_fail_msg_t * msg)
  701. {
  702. if (msg) {
  703. xfree(msg->nodelist);
  704. xfree(msg);
  705. }
  706. }
  707. extern void slurm_free_srun_step_missing_msg(srun_step_missing_msg_t * msg)
  708. {
  709. if (msg) {
  710. xfree(msg->nodelist);
  711. xfree(msg);
  712. }
  713. }
  714. extern void slurm_free_srun_timeout_msg(srun_timeout_msg_t * msg)
  715. {
  716. xfree(msg);
  717. }
  718. extern void slurm_free_srun_user_msg(srun_user_msg_t * user_msg)
  719. {
  720. if (user_msg) {
  721. xfree(user_msg->msg);
  722. xfree(user_msg);
  723. }
  724. }
  725. extern void slurm_free_checkpoint_msg(checkpoint_msg_t *msg)
  726. {
  727. if (msg) {
  728. xfree(msg->image_dir);
  729. xfree(msg);
  730. }
  731. }
  732. extern void slurm_free_checkpoint_comp_msg(checkpoint_comp_msg_t *msg)
  733. {
  734. if (msg) {
  735. xfree(msg->error_msg);
  736. xfree(msg);
  737. }
  738. }
  739. extern void slurm_free_checkpoint_task_comp_msg(checkpoint_task_comp_msg_t *msg)
  740. {
  741. if (msg) {
  742. xfree(msg->error_msg);
  743. xfree(msg);
  744. }
  745. }
  746. extern void slurm_free_checkpoint_resp_msg(checkpoint_resp_msg_t *msg)
  747. {
  748. if (msg) {
  749. xfree(msg->error_msg);
  750. xfree(msg);
  751. }
  752. }
  753. extern void slurm_free_suspend_msg(suspend_msg_t *msg)
  754. {
  755. xfree(msg);
  756. }
  757. extern void slurm_free_suspend_int_msg(suspend_int_msg_t *msg)
  758. {
  759. if (msg) {
  760. interconnect_suspend_info_free(msg->switch_info);
  761. xfree(msg);
  762. }
  763. }
  764. extern void slurm_free_stats_response_msg(stats_info_response_msg_t *msg)
  765. {
  766. xfree(msg);
  767. }
  768. extern void slurm_free_spank_env_request_msg(spank_env_request_msg_t *msg)
  769. {
  770. xfree(msg);
  771. }
  772. extern void slurm_free_spank_env_responce_msg(spank_env_responce_msg_t *msg)
  773. {
  774. uint32_t i;
  775. for (i = 0; i < msg->spank_job_env_size; i++)
  776. xfree(msg->spank_job_env[i]);
  777. xfree(msg->spank_job_env);
  778. xfree(msg);
  779. }
  780. /* Given a job's reason for waiting, return a descriptive string */
  781. extern char *job_reason_string(enum job_state_reason inx)
  782. {
  783. switch (inx) {
  784. case WAIT_NO_REASON:
  785. return "None";
  786. case WAIT_PRIORITY:
  787. return "Priority";
  788. case WAIT_DEPENDENCY:
  789. return "Dependency";
  790. case WAIT_RESOURCES:
  791. return "Resources";
  792. case WAIT_PART_NODE_LIMIT:
  793. return "PartitionNodeLimit";
  794. case WAIT_PART_TIME_LIMIT:
  795. return "PartitionTimeLimit";
  796. case WAIT_PART_DOWN:
  797. return "PartitionDown";
  798. case WAIT_PART_INACTIVE:
  799. return "PartitionInactive";
  800. case WAIT_HELD:
  801. return "JobHeldAdmin";
  802. case WAIT_HELD_USER:
  803. return "JobHeldUser";
  804. case WAIT_TIME:
  805. return "BeginTime";
  806. case WAIT_LICENSES:
  807. return "Licenses";
  808. case WAIT_ASSOC_JOB_LIMIT:
  809. return "AssociationJobLimit";
  810. case WAIT_ASSOC_RESOURCE_LIMIT:
  811. return "AssociationResourceLimit";
  812. case WAIT_ASSOC_TIME_LIMIT:
  813. return "AssociationTimeLimit";
  814. case WAIT_RESERVATION:
  815. return "Reservation";
  816. case WAIT_NODE_NOT_AVAIL:
  817. return "ReqNodeNotAvail";
  818. case WAIT_FRONT_END:
  819. return "FrontEndDown";
  820. case FAIL_DOWN_PARTITION:
  821. return "PartitionDown";
  822. case FAIL_DOWN_NODE:
  823. return "NodeDown";
  824. case FAIL_BAD_CONSTRAINTS:
  825. return "BadConstraints";
  826. case FAIL_SYSTEM:
  827. return "SystemFailure";
  828. case FAIL_LAUNCH:
  829. return "JobLaunchFailure";
  830. case FAIL_EXIT_CODE:
  831. return "NonZeroExitCode";
  832. case FAIL_TIMEOUT:
  833. return "TimeLimit";
  834. case FAIL_INACTIVE_LIMIT:
  835. return "InactiveLimit";
  836. case FAIL_ACCOUNT:
  837. return "InvalidAccount";
  838. case FAIL_QOS:
  839. return "InvalidQOS";
  840. case WAIT_QOS_THRES:
  841. return "QOSUsageThreshold";
  842. case WAIT_QOS_JOB_LIMIT:
  843. return "QOSJobLimit";
  844. case WAIT_QOS_RESOURCE_LIMIT:
  845. return "QOSResourceLimit";
  846. case WAIT_QOS_TIME_LIMIT:
  847. return "QOSTimeLimit";
  848. default:
  849. return "?";
  850. }
  851. }
  852. extern void slurm_free_get_kvs_msg(kvs_get_msg_t *msg)
  853. {
  854. if (msg) {
  855. xfree(msg->hostname);
  856. xfree(msg);
  857. }
  858. }
  859. extern void slurm_free_will_run_response_msg(will_run_response_msg_t *msg)
  860. {
  861. if (msg) {
  862. xfree(msg->node_list);
  863. if (msg->preemptee_job_id)
  864. list_destroy(msg->preemptee_job_id);
  865. xfree(msg);
  866. }
  867. }
  868. inline void slurm_free_forward_data_msg(forward_data_msg_t *msg)
  869. {
  870. if (msg) {
  871. xfree(msg->address);
  872. xfree(msg->data);
  873. xfree(msg);
  874. }
  875. }
  876. extern void slurm_free_ping_slurmd_resp(ping_slurmd_resp_msg_t *msg)
  877. {
  878. xfree(msg);
  879. }
  880. extern char *preempt_mode_string(uint16_t preempt_mode)
  881. {
  882. char *gang_str;
  883. static char preempt_str[64];
  884. if (preempt_mode == PREEMPT_MODE_OFF)
  885. return "OFF";
  886. if (preempt_mode == PREEMPT_MODE_GANG)
  887. return "GANG";
  888. if (preempt_mode & PREEMPT_MODE_GANG) {
  889. gang_str = "GANG,";
  890. preempt_mode &= (~PREEMPT_MODE_GANG);
  891. } else
  892. gang_str = "";
  893. if (preempt_mode == PREEMPT_MODE_CANCEL)
  894. sprintf(preempt_str, "%sCANCEL", gang_str);
  895. else if (preempt_mode == PREEMPT_MODE_CHECKPOINT)
  896. sprintf(preempt_str, "%sCHECKPOINT", gang_str);
  897. else if (preempt_mode == PREEMPT_MODE_REQUEUE)
  898. sprintf(preempt_str, "%sREQUEUE", gang_str);
  899. else if (preempt_mode == PREEMPT_MODE_SUSPEND)
  900. sprintf(preempt_str, "%sSUSPEND", gang_str);
  901. else
  902. sprintf(preempt_str, "%sUNKNOWN", gang_str);
  903. return preempt_str;
  904. }
  905. extern uint16_t preempt_mode_num(const char *preempt_mode)
  906. {
  907. uint16_t mode_num = 0;
  908. int preempt_modes = 0;
  909. char *tmp_str, *last = NULL, *tok;
  910. if (preempt_mode == NULL)
  911. return mode_num;
  912. tmp_str = xstrdup(preempt_mode);
  913. tok = strtok_r(tmp_str, ",", &last);
  914. while (tok) {
  915. if (strcasecmp(tok, "gang") == 0) {
  916. mode_num |= PREEMPT_MODE_GANG;
  917. } else if ((strcasecmp(tok, "off") == 0)
  918. || (strcasecmp(tok, "cluster") == 0)) {
  919. mode_num += PREEMPT_MODE_OFF;
  920. preempt_modes++;
  921. } else if (strcasecmp(tok, "cancel") == 0) {
  922. mode_num += PREEMPT_MODE_CANCEL;
  923. preempt_modes++;
  924. } else if (strcasecmp(tok, "checkpoint") == 0) {
  925. mode_num += PREEMPT_MODE_CHECKPOINT;
  926. preempt_modes++;
  927. } else if (strcasecmp(tok, "requeue") == 0) {
  928. mode_num += PREEMPT_MODE_REQUEUE;
  929. preempt_modes++;
  930. } else if ((strcasecmp(tok, "on") == 0) ||
  931. (strcasecmp(tok, "suspend") == 0)) {
  932. mode_num += PREEMPT_MODE_SUSPEND;
  933. preempt_modes++;
  934. } else {
  935. preempt_modes = 0;
  936. mode_num = (uint16_t) NO_VAL;
  937. break;
  938. }
  939. tok = strtok_r(NULL, ",", &last);
  940. }
  941. xfree(tmp_str);
  942. if (preempt_modes > 1) {
  943. mode_num = (uint16_t) NO_VAL;
  944. }
  945. return mode_num;
  946. }
  947. /* Convert log level number to equivalent string */
  948. extern char *log_num2string(uint16_t inx)
  949. {
  950. switch (inx) {
  951. case 0:
  952. return "quiet";
  953. case 1:
  954. return "fatal";
  955. case 2:
  956. return "error";
  957. case 3:
  958. return "info";
  959. case 4:
  960. return "verbose";
  961. case 5:
  962. return "debug";
  963. case 6:
  964. return "debug2";
  965. case 7:
  966. return "debug3";
  967. case 8:
  968. return "debug4";
  969. case 9:
  970. return "debug5";
  971. default:
  972. return "unknown";
  973. }
  974. }
  975. /* Convert log level string to equivalent number */
  976. extern uint16_t log_string2num(char *name)
  977. {
  978. if (name == NULL)
  979. return (uint16_t) NO_VAL;
  980. if ((name[0] >= '0') && (name[0] <= '9'))
  981. return (uint16_t) atoi(name);
  982. if (!strcasecmp(name, "quiet"))
  983. return (uint16_t) 0;
  984. if (!strcasecmp(name, "fatal"))
  985. return (uint16_t) 1;
  986. if (!strcasecmp(name, "error"))
  987. return (uint16_t) 2;
  988. if (!strcasecmp(name, "info"))
  989. return (uint16_t) 3;
  990. if (!strcasecmp(name, "verbose"))
  991. return (uint16_t) 4;
  992. if (!strcasecmp(name, "debug"))
  993. return (uint16_t) 5;
  994. if (!strcasecmp(name, "debug2"))
  995. return (uint16_t) 6;
  996. if (!strcasecmp(name, "debug3"))
  997. return (uint16_t) 7;
  998. if (!strcasecmp(name, "debug4"))
  999. return (uint16_t) 8;
  1000. if (!strcasecmp(name, "debug5"))
  1001. return (uint16_t) 9;
  1002. if (!strcasecmp(name, "debug2"))
  1003. return (uint16_t) 6;
  1004. return (uint16_t) NO_VAL;
  1005. }
  1006. /* Convert SelectTypeParameter to equivalent string
  1007. * NOTE: Not reentrant */
  1008. extern char *sched_param_type_string(uint16_t select_type_param)
  1009. {
  1010. static char select_str[64];
  1011. select_str[0] = '\0';
  1012. if ((select_type_param & CR_CPU) &&
  1013. (select_type_param & CR_MEMORY))
  1014. strcat(select_str, "CR_CPU_MEMORY");
  1015. else if ((select_type_param & CR_CORE) &&
  1016. (select_type_param & CR_MEMORY))
  1017. strcat(select_str, "CR_CORE_MEMORY");
  1018. else if ((select_type_param & CR_SOCKET) &&
  1019. (select_type_param & CR_MEMORY))
  1020. strcat(select_str, "CR_SOCKET_MEMORY");
  1021. else if (select_type_param & CR_CPU)
  1022. strcat(select_str, "CR_CPU");
  1023. else if (select_type_param & CR_CORE)
  1024. strcat(select_str, "CR_CORE");
  1025. else if (select_type_param & CR_SOCKET)
  1026. strcat(select_str, "CR_SOCKET");
  1027. else if (select_type_param & CR_MEMORY)
  1028. strcat(select_str, "CR_MEMORY");
  1029. if (select_type_param & CR_ONE_TASK_PER_CORE) {
  1030. if (select_str[0])
  1031. strcat(select_str, ",");
  1032. strcat(select_str, "CR_ONE_TASK_PER_CORE");
  1033. }
  1034. if (select_type_param & CR_CORE_DEFAULT_DIST_BLOCK) {
  1035. if (select_str[0])
  1036. strcat(select_str, ",");
  1037. strcat(select_str, "CR_CORE_DEFAULT_DIST_BLOCK");
  1038. }
  1039. if (select_str[0] == '\0')
  1040. strcat(select_str, "NONE");
  1041. return select_str;
  1042. }
  1043. extern char *job_state_string(uint16_t inx)
  1044. {
  1045. /* Process JOB_STATE_FLAGS */
  1046. if (inx & JOB_COMPLETING)
  1047. return "COMPLETING";
  1048. if (inx & JOB_CONFIGURING)
  1049. return "CONFIGURING";
  1050. if (inx & JOB_RESIZING)
  1051. return "RESIZING";
  1052. /* Process JOB_STATE_BASE */
  1053. switch (inx & JOB_STATE_BASE) {
  1054. case JOB_PENDING:
  1055. return "PENDING";
  1056. case JOB_RUNNING:
  1057. return "RUNNING";
  1058. case JOB_SUSPENDED:
  1059. return "SUSPENDED";
  1060. case JOB_COMPLETE:
  1061. return "COMPLETED";
  1062. case JOB_CANCELLED:
  1063. return "CANCELLED";
  1064. case JOB_FAILED:
  1065. return "FAILED";
  1066. case JOB_TIMEOUT:
  1067. return "TIMEOUT";
  1068. case JOB_NODE_FAIL:
  1069. return "NODE_FAIL";
  1070. case JOB_PREEMPTED:
  1071. return "PREEMPTED";
  1072. default:
  1073. return "?";
  1074. }
  1075. }
  1076. extern char *job_state_string_compact(uint16_t inx)
  1077. {
  1078. /* Process JOB_STATE_FLAGS */
  1079. if (inx & JOB_COMPLETING)
  1080. return "CG";
  1081. if (inx & JOB_CONFIGURING)
  1082. return "CF";
  1083. if (inx & JOB_RESIZING)
  1084. return "RS";
  1085. /* Process JOB_STATE_BASE */
  1086. switch (inx & JOB_STATE_BASE) {
  1087. case JOB_PENDING:
  1088. return "PD";
  1089. case JOB_RUNNING:
  1090. return "R";
  1091. case JOB_SUSPENDED:
  1092. return "S";
  1093. case JOB_COMPLETE:
  1094. return "CD";
  1095. case JOB_CANCELLED:
  1096. return "CA";
  1097. case JOB_FAILED:
  1098. return "F";
  1099. case JOB_TIMEOUT:
  1100. return "TO";
  1101. case JOB_NODE_FAIL:
  1102. return "NF";
  1103. case JOB_PREEMPTED:
  1104. return "PR";
  1105. default:
  1106. return "?";
  1107. }
  1108. }
  1109. static bool _job_name_test(int state_num, const char *state_name)
  1110. {
  1111. if (!strcasecmp(state_name, job_state_string(state_num)) ||
  1112. !strcasecmp(state_name, job_state_string_compact(state_num))) {
  1113. return true;
  1114. }
  1115. return false;
  1116. }
  1117. extern int job_state_num(const char *state_name)
  1118. {
  1119. int i;
  1120. for (i=0; i<JOB_END; i++) {
  1121. if (_job_name_test(i, state_name))
  1122. return i;
  1123. }
  1124. if (_job_name_test(JOB_COMPLETING, state_name))
  1125. return JOB_COMPLETING;
  1126. if (_job_name_test(JOB_CONFIGURING, state_name))
  1127. return JOB_CONFIGURING;
  1128. if (_job_name_test(JOB_RESIZING, state_name))
  1129. return JOB_RESIZING;
  1130. return -1;
  1131. }
  1132. extern char *trigger_res_type(uint16_t res_type)
  1133. {
  1134. if (res_type == TRIGGER_RES_TYPE_JOB)
  1135. return "job";
  1136. else if (res_type == TRIGGER_RES_TYPE_NODE)
  1137. return "node";
  1138. else if (res_type == TRIGGER_RES_TYPE_SLURMCTLD)
  1139. return "slurmctld";
  1140. else if (res_type == TRIGGER_RES_TYPE_SLURMDBD)
  1141. return "slurmdbd";
  1142. else if (res_type == TRIGGER_RES_TYPE_DATABASE)
  1143. return "database";
  1144. else if (res_type == TRIGGER_RES_TYPE_FRONT_END)
  1145. return "front_end";
  1146. else
  1147. return "unknown";
  1148. }
  1149. extern char *trigger_type(uint32_t trig_type)
  1150. {
  1151. if (trig_type == TRIGGER_TYPE_UP)
  1152. return "up";
  1153. else if (trig_type == TRIGGER_TYPE_DOWN)
  1154. return "down";
  1155. else if (trig_type == TRIGGER_TYPE_DRAINED)
  1156. return "drained";
  1157. else if (trig_type == TRIGGER_TYPE_FAIL)
  1158. return "fail";
  1159. else if (trig_type == TRIGGER_TYPE_IDLE)
  1160. return "idle";
  1161. else if (trig_type == TRIGGER_TYPE_TIME)
  1162. return "time";
  1163. else if (trig_type == TRIGGER_TYPE_FINI)
  1164. return "fini";
  1165. else if (trig_type == TRIGGER_TYPE_RECONFIG)
  1166. return "reconfig";
  1167. else if (trig_type == TRIGGER_TYPE_PRI_CTLD_FAIL)
  1168. return "primary_slurmctld_failure";
  1169. else if (trig_type == TRIGGER_TYPE_PRI_CTLD_RES_OP)
  1170. return "primary_slurmctld_resumed_operation";
  1171. else if (trig_type == TRIGGER_TYPE_PRI_CTLD_RES_CTRL)
  1172. return "primary_slurmctld_resumed_control";
  1173. else if (trig_type == TRIGGER_TYPE_PRI_CTLD_ACCT_FULL)
  1174. return "primary_slurmctld_acct_buffer_full";
  1175. else if (trig_type == TRIGGER_TYPE_BU_CTLD_FAIL)
  1176. return "backup_slurmctld_failure";
  1177. else if (trig_type == TRIGGER_TYPE_BU_CTLD_RES_OP)
  1178. return "backup_slurmctld_resumed_operation";
  1179. else if (trig_type == TRIGGER_TYPE_BU_CTLD_AS_CTRL)
  1180. return "backup_slurmctld_assumed_control";
  1181. else if (trig_type == TRIGGER_TYPE_PRI_DBD_FAIL)
  1182. return "primary_slurmdbd_failure";
  1183. else if (trig_type == TRIGGER_TYPE_PRI_DBD_RES_OP)
  1184. return "primary_slurmdbd_resumed_operation";
  1185. else if (trig_type == TRIGGER_TYPE_PRI_DB_FAIL)
  1186. return "primary_database_failure";
  1187. else if (trig_type == TRIGGER_TYPE_PRI_DB_RES_OP)
  1188. return "primary_database_resumed_operation";
  1189. else if (trig_type == TRIGGER_TYPE_BLOCK_ERR)
  1190. return "block_err";
  1191. else
  1192. return "unknown";
  1193. }
  1194. extern char *reservation_flags_string(uint16_t flags)
  1195. {
  1196. char *flag_str = xstrdup("");
  1197. if (flags & RESERVE_FLAG_MAINT)
  1198. xstrcat(flag_str, "MAINT");
  1199. if (flags & RESERVE_FLAG_NO_MAINT) {
  1200. if (flag_str[0])
  1201. xstrcat(flag_str, ",");
  1202. xstrcat(flag_str, "NO_MAINT");
  1203. }
  1204. if (flags & RESERVE_FLAG_OVERLAP) {
  1205. if (flag_str[0])
  1206. xstrcat(flag_str, ",");
  1207. xstrcat(flag_str, "OVERLAP");
  1208. }
  1209. if (flags & RESERVE_FLAG_IGN_JOBS) {
  1210. if (flag_str[0])
  1211. xstrcat(flag_str, ",");
  1212. xstrcat(flag_str, "IGNORE_JOBS");
  1213. }
  1214. if (flags & RESERVE_FLAG_DAILY) {
  1215. if (flag_str[0])
  1216. xstrcat(flag_str, ",");
  1217. xstrcat(flag_str, "DAILY");
  1218. }
  1219. if (flags & RESERVE_FLAG_NO_DAILY) {
  1220. if (flag_str[0])
  1221. xstrcat(flag_str, ",");
  1222. xstrcat(flag_str, "NO_DAILY");
  1223. }
  1224. if (flags & RESERVE_FLAG_WEEKLY) {
  1225. if (flag_str[0])
  1226. xstrcat(flag_str, ",");
  1227. xstrcat(flag_str, "WEEKLY");
  1228. }
  1229. if (flags & RESERVE_FLAG_NO_WEEKLY) {
  1230. if (flag_str[0])
  1231. xstrcat(flag_str, ",");
  1232. xstrcat(flag_str, "NO_WEEKLY");
  1233. }
  1234. if (flags & RESERVE_FLAG_SPEC_NODES) {
  1235. if (flag_str[0])
  1236. xstrcat(flag_str, ",");
  1237. xstrcat(flag_str, "SPEC_NODES");
  1238. }
  1239. if (flags & RESERVE_FLAG_LIC_ONLY) {
  1240. if (flag_str[0])
  1241. xstrcat(flag_str, ",");
  1242. xstrcat(flag_str, "LICENSE_ONLY");
  1243. }
  1244. if (flags & RESERVE_FLAG_NO_LIC_ONLY) {
  1245. if (flag_str[0])
  1246. xstrcat(flag_str, ",");
  1247. xstrcat(flag_str, "NO_LICENSE_ONLY");
  1248. }
  1249. if (flags & RESERVE_FLAG_STATIC) {
  1250. if (flag_str[0])
  1251. xstrcat(flag_str, ",");
  1252. xstrcat(flag_str, "STATIC");
  1253. }
  1254. if (flags & RESERVE_FLAG_NO_STATIC) {
  1255. if (flag_str[0])
  1256. xstrcat(flag_str, ",");
  1257. xstrcat(flag_str, "NO_STATIC");
  1258. }
  1259. if (flags & RESERVE_FLAG_PART_NODES) {
  1260. if (flag_str[0])
  1261. xstrcat(flag_str, ",");
  1262. xstrcat(flag_str, "PART_NODES");
  1263. }
  1264. if (flags & RESERVE_FLAG_NO_PART_NODES) {
  1265. if (flag_str[0])
  1266. xstrcat(flag_str, ",");
  1267. xstrcat(flag_str, "NO_PART_NODES");
  1268. }
  1269. return flag_str;
  1270. }
  1271. extern char *node_state_string(uint16_t inx)
  1272. {
  1273. int base = (inx & NODE_STATE_BASE);
  1274. bool comp_flag = (inx & NODE_STATE_COMPLETING);
  1275. bool drain_flag = (inx & NODE_STATE_DRAIN);
  1276. bool fail_flag = (inx & NODE_STATE_FAIL);
  1277. bool maint_flag = (inx & NODE_STATE_MAINT);
  1278. bool resume_flag = (inx & NODE_RESUME);
  1279. bool no_resp_flag = (inx & NODE_STATE_NO_RESPOND);
  1280. bool power_down_flag = (inx & NODE_STATE_POWER_SAVE);
  1281. bool power_up_flag = (inx & NODE_STATE_POWER_UP);
  1282. if (maint_flag) {
  1283. if (no_resp_flag)
  1284. return "MAINT*";
  1285. if (base != NODE_STATE_ALLOCATED)
  1286. return "MAINT";
  1287. }
  1288. if (drain_flag) {
  1289. if (comp_flag || (base == NODE_STATE_ALLOCATED)) {
  1290. if (no_resp_flag)
  1291. return "DRAINING*";
  1292. return "DRAINING";
  1293. } else if (base == NODE_STATE_ERROR) {
  1294. if (no_resp_flag)
  1295. return "ERROR*";
  1296. return "ERROR";
  1297. } else if (base == NODE_STATE_MIXED) {
  1298. if (no_resp_flag)
  1299. return "MIXED*";
  1300. return "MIXED";
  1301. } else {
  1302. if (no_resp_flag)
  1303. return "DRAINED*";
  1304. return "DRAINED";
  1305. }
  1306. }
  1307. if (fail_flag) {
  1308. if (comp_flag || (base == NODE_STATE_ALLOCATED)) {
  1309. if (no_resp_flag)
  1310. return "FAILING*";
  1311. return "FAILING";
  1312. } else {
  1313. if (no_resp_flag)
  1314. return "FAIL*";
  1315. return "FAIL";
  1316. }
  1317. }
  1318. if (inx == NODE_STATE_POWER_SAVE)
  1319. return "POWER_DOWN";
  1320. if (inx == NODE_STATE_POWER_UP)
  1321. return "POWER_UP";
  1322. if (base == NODE_STATE_DOWN) {
  1323. if (no_resp_flag)
  1324. return "DOWN*";
  1325. return "DOWN";
  1326. }
  1327. if (base == NODE_STATE_ALLOCATED) {
  1328. if (power_up_flag)
  1329. return "ALLOCATED#";
  1330. if (power_down_flag)
  1331. return "ALLOCATED~";
  1332. if (no_resp_flag)
  1333. return "ALLOCATED*";
  1334. if (comp_flag)
  1335. return "ALLOCATED+";
  1336. return "ALLOCATED";
  1337. }
  1338. if (comp_flag) {
  1339. if (no_resp_flag)
  1340. return "COMPLETING*";
  1341. return "COMPLETING";
  1342. }
  1343. if (base == NODE_STATE_IDLE) {
  1344. if (power_up_flag)
  1345. return "IDLE#";
  1346. if (power_down_flag)
  1347. return "IDLE~";
  1348. if (no_resp_flag)
  1349. return "IDLE*";
  1350. return "IDLE";
  1351. }
  1352. if (base == NODE_STATE_ERROR) {
  1353. if (power_up_flag)
  1354. return "ERROR#";
  1355. if (power_down_flag)
  1356. return "ERROR~";
  1357. if (no_resp_flag)
  1358. return "ERROR*";
  1359. return "ERROR";
  1360. }
  1361. if (base == NODE_STATE_MIXED) {
  1362. if (power_up_flag)
  1363. return "MIXED#";
  1364. if (power_down_flag)
  1365. return "MIXED~";
  1366. if (no_resp_flag)
  1367. return "MIXED*";
  1368. return "MIXED";
  1369. }
  1370. if (base == NODE_STATE_FUTURE) {
  1371. if (no_resp_flag)
  1372. return "FUTURE*";
  1373. return "FUTURE";
  1374. }
  1375. if (resume_flag)
  1376. return "RESUME";
  1377. if (base == NODE_STATE_UNKNOWN) {
  1378. if (no_resp_flag)
  1379. return "UNKNOWN*";
  1380. return "UNKNOWN";
  1381. }
  1382. return "?";
  1383. }
  1384. extern char *node_state_string_compact(uint16_t inx)
  1385. {
  1386. bool comp_flag = (inx & NODE_STATE_COMPLETING);
  1387. bool drain_flag = (inx & NODE_STATE_DRAIN);
  1388. bool fail_flag = (inx & NODE_STATE_FAIL);
  1389. bool maint_flag = (inx & NODE_STATE_MAINT);
  1390. bool resume_flag = (inx & NODE_RESUME);
  1391. bool no_resp_flag = (inx & NODE_STATE_NO_RESPOND);
  1392. bool power_down_flag = (inx & NODE_STATE_POWER_SAVE);
  1393. bool power_up_flag = (inx & NODE_STATE_POWER_UP);
  1394. inx = (uint16_t) (inx & NODE_STATE_BASE);
  1395. if (maint_flag) {
  1396. if (no_resp_flag)
  1397. return "MAINT*";
  1398. if (inx != NODE_STATE_ALLOCATED)
  1399. return "MAINT";
  1400. }
  1401. if (drain_flag) {
  1402. if (comp_flag || (inx == NODE_STATE_ALLOCATED)) {
  1403. if (no_resp_flag)
  1404. return "DRNG*";
  1405. return "DRNG";
  1406. } else if (inx == NODE_STATE_ERROR) {
  1407. if (no_resp_flag)
  1408. return "ERROR*";
  1409. return "ERROR";
  1410. } else if (inx == NODE_STATE_MIXED) {
  1411. if (no_resp_flag)
  1412. return "MIXED*";
  1413. return "MIXED";
  1414. } else {
  1415. if (no_resp_flag)
  1416. return "DRAIN*";
  1417. return "DRAIN";
  1418. }
  1419. }
  1420. if (fail_flag) {
  1421. if (comp_flag || (inx == NODE_STATE_ALLOCATED)) {
  1422. if (no_resp_flag)
  1423. return "FAILG*";
  1424. return "FAILG";
  1425. } else {
  1426. if (no_resp_flag)
  1427. return "FAIL*";
  1428. return "FAIL";
  1429. }
  1430. }
  1431. if (inx == NODE_STATE_POWER_SAVE)
  1432. return "POW_DN";
  1433. if (inx == NODE_STATE_POWER_UP)
  1434. return "POW_UP";
  1435. if (inx == NODE_STATE_DOWN) {
  1436. if (no_resp_flag)
  1437. return "DOWN*";
  1438. return "DOWN";
  1439. }
  1440. if (inx == NODE_STATE_ALLOCATED) {
  1441. if (power_up_flag)
  1442. return "ALLOC#";
  1443. if (power_down_flag)
  1444. return "ALLOC~";
  1445. if (no_resp_flag)
  1446. return "ALLOC*";
  1447. if (comp_flag)
  1448. return "ALLOC+";
  1449. return "ALLOC";
  1450. }
  1451. if (comp_flag) {
  1452. if (no_resp_flag)
  1453. return "COMP*";
  1454. return "COMP";
  1455. }
  1456. if (inx == NODE_STATE_IDLE) {
  1457. if (power_up_flag)
  1458. return "IDLE#";
  1459. if (power_down_flag)
  1460. return "IDLE~";
  1461. if (no_resp_flag)
  1462. return "IDLE*";
  1463. return "IDLE";
  1464. }
  1465. if (inx == NODE_STATE_ERROR) {
  1466. if (power_up_flag)
  1467. return "ERR#";
  1468. if (power_down_flag)
  1469. return "ERR~";
  1470. if (no_resp_flag)
  1471. return "ERR*";
  1472. return "ERR";
  1473. }
  1474. if (inx == NODE_STATE_MIXED) {
  1475. if (power_up_flag)
  1476. return "MIX#";
  1477. if (power_down_flag)
  1478. return "MIX~";
  1479. if (no_resp_flag)
  1480. return "MIX*";
  1481. return "MIX";
  1482. }
  1483. if (inx == NODE_STATE_FUTURE) {
  1484. if (no_resp_flag)
  1485. return "FUTR*";
  1486. return "FUTR";
  1487. }
  1488. if (resume_flag)
  1489. return "RESM";
  1490. if (inx == NODE_STATE_UNKNOWN) {
  1491. if (no_resp_flag)
  1492. return "UNK*";
  1493. return "UNK";
  1494. }
  1495. return "?";
  1496. }
  1497. extern void private_data_string(uint16_t private_data, char *str, int str_len)
  1498. {
  1499. if (str_len > 0)
  1500. str[0] = '\0';
  1501. if (str_len < 55) {
  1502. error("private_data_string: output buffer too small");
  1503. return;
  1504. }
  1505. if (private_data & PRIVATE_DATA_JOBS)
  1506. strcat(str, "jobs"); //4 len
  1507. if (private_data & PRIVATE_DATA_NODES) {
  1508. if (str[0])
  1509. strcat(str, ",");
  1510. strcat(str, "nodes"); //6 len
  1511. }
  1512. if (private_data & PRIVATE_DATA_PARTITIONS) {
  1513. if (str[0])
  1514. strcat(str, ",");
  1515. strcat(str, "partitions"); //11 len
  1516. }
  1517. if (private_data & PRIVATE_DATA_USAGE) {
  1518. if (str[0])
  1519. strcat(str, ",");
  1520. strcat(str, "usage"); //6 len
  1521. }
  1522. if (private_data & PRIVATE_DATA_USERS) {
  1523. if (str[0])
  1524. strcat(str, ",");
  1525. strcat(str, "users"); //6 len
  1526. }
  1527. if (private_data & PRIVATE_DATA_ACCOUNTS) {
  1528. if (str[0])
  1529. strcat(str, ",");
  1530. strcat(str, "accounts"); //9 len
  1531. }
  1532. if (private_data & PRIVATE_DATA_RESERVATIONS) {
  1533. if (str[0])
  1534. strcat(str, ",");
  1535. strcat(str, "reservations"); //13 len
  1536. }
  1537. // total len 55
  1538. if (str[0] == '\0')
  1539. strcat(str, "none");
  1540. }
  1541. extern void accounting_enforce_string(uint16_t enforce, char *str, int str_len)
  1542. {
  1543. if (str_len > 0)
  1544. str[0] = '\0';
  1545. if (str_len < 30) {
  1546. error("enforce: output buffer too small");
  1547. return;
  1548. }
  1549. if (enforce & ACCOUNTING_ENFORCE_ASSOCS)
  1550. strcat(str, "associations"); //12 len
  1551. if (enforce & ACCOUNTING_ENFORCE_LIMITS) {
  1552. if (str[0])
  1553. strcat(str, ",");
  1554. strcat(str, "limits"); //7 len
  1555. }
  1556. if (enforce & ACCOUNTING_ENFORCE_QOS) {
  1557. if (str[0])
  1558. strcat(str, ",");
  1559. strcat(str, "qos"); //4 len
  1560. }
  1561. if (enforce & ACCOUNTING_ENFORCE_WCKEYS) {
  1562. if (str[0])
  1563. strcat(str, ",");
  1564. strcat(str, "wckeys"); //7 len
  1565. }
  1566. // total len 30
  1567. if (str[0] == '\0')
  1568. strcat(str, "none");
  1569. }
  1570. extern char *conn_type_string(enum connection_type conn_type)
  1571. {
  1572. switch (conn_type) {
  1573. case (SELECT_MESH):
  1574. return "Mesh";
  1575. case (SELECT_TORUS):
  1576. return "Torus";
  1577. case (SELECT_SMALL):
  1578. return "Small";
  1579. case (SELECT_NAV):
  1580. return "NAV";
  1581. case SELECT_HTC_S:
  1582. return "HTC_S";
  1583. case SELECT_HTC_D:
  1584. return "HTC_D";
  1585. case SELECT_HTC_V:
  1586. return "HTC_V";
  1587. case SELECT_HTC_L:
  1588. return "HTC_L";
  1589. default:
  1590. return "n/a";
  1591. }
  1592. return "n/a";
  1593. }
  1594. /* caller must xfree after call */
  1595. extern char *conn_type_string_full(uint16_t *conn_type)
  1596. {
  1597. uint32_t cluster_flags = slurmdb_setup_cluster_flags();
  1598. if ((cluster_flags & CLUSTER_FLAG_BGQ)
  1599. && (conn_type[0] < SELECT_SMALL)) {
  1600. int dim, pos = 0;
  1601. uint16_t cluster_dims = slurmdb_setup_cluster_dims();
  1602. char conn_type_part[cluster_dims*2], *tmp_char;
  1603. for (dim = 0; dim < cluster_dims; dim++) {
  1604. if (pos)
  1605. conn_type_part[pos++] = ',';
  1606. tmp_char = conn_type_string(conn_type[dim]);
  1607. conn_type_part[pos++] = tmp_char[0];
  1608. }
  1609. conn_type_part[pos] = '\0';
  1610. return xstrdup(conn_type_part);
  1611. } else
  1612. return xstrdup(conn_type_string(conn_type[0]));
  1613. }
  1614. extern char* node_use_string(enum node_use_type node_use)
  1615. {
  1616. switch (node_use) {
  1617. case (SELECT_COPROCESSOR_MODE):
  1618. return "COPROCESSOR";
  1619. case (SELECT_VIRTUAL_NODE_MODE):
  1620. return "VIRTUAL";
  1621. default:
  1622. break;
  1623. }
  1624. return "";
  1625. }
  1626. extern char *bg_block_state_string(uint16_t state)
  1627. {
  1628. static char tmp[25];
  1629. char *state_str = NULL;
  1630. char *err_str = NULL;
  1631. if (state & BG_BLOCK_ERROR_FLAG) {
  1632. err_str = "Error";
  1633. state &= (~BG_BLOCK_ERROR_FLAG);
  1634. }
  1635. switch (state) {
  1636. case BG_BLOCK_NAV:
  1637. if (!err_str)
  1638. state_str = "NAV";
  1639. else {
  1640. err_str = NULL;
  1641. state_str = "Error";
  1642. }
  1643. break;
  1644. case BG_BLOCK_FREE:
  1645. state_str = "Free";
  1646. break;
  1647. case BG_BLOCK_BUSY:
  1648. state_str = "Busy";
  1649. break;
  1650. case BG_BLOCK_BOOTING:
  1651. state_str = "Boot";
  1652. break;
  1653. case BG_BLOCK_REBOOTING:
  1654. state_str = "Reboot";
  1655. break;
  1656. case BG_BLOCK_INITED:
  1657. state_str = "Ready";
  1658. break;
  1659. case BG_BLOCK_ALLOCATED:
  1660. state_str = "Alloc";
  1661. break;
  1662. case BG_BLOCK_TERM:
  1663. state_str = "Term";
  1664. break;
  1665. default:
  1666. state_str = "Unknown";
  1667. break;
  1668. }
  1669. if (err_str)
  1670. snprintf(tmp, sizeof(tmp), "%s(%s)", err_str, state_str);
  1671. else
  1672. return state_str;
  1673. return tmp;
  1674. }
  1675. /*
  1676. * slurm_free_resource_allocation_response_msg - free slurm resource
  1677. * allocation response message
  1678. * IN msg - pointer to allocation response message
  1679. * NOTE: buffer is loaded by slurm_allocate_resources
  1680. */
  1681. extern void slurm_free_resource_allocation_response_msg (
  1682. resource_allocation_response_msg_t * msg)
  1683. {
  1684. if (msg) {
  1685. select_g_select_jobinfo_free(msg->select_jobinfo);
  1686. msg->select_jobinfo = NULL;
  1687. xfree(msg->alias_list);
  1688. xfree(msg->node_list);
  1689. xfree(msg->cpus_per_node);
  1690. xfree(msg->cpu_count_reps);
  1691. xfree(msg);
  1692. }
  1693. }
  1694. /*
  1695. * slurm_free_sbcast_cred_msg - free slurm resource allocation response
  1696. * message including an sbcast credential
  1697. * IN msg - pointer to response message from slurm_sbcast_lookup()
  1698. * NOTE: buffer is loaded by slurm_allocate_resources
  1699. */
  1700. extern void slurm_free_sbcast_cred_msg(job_sbcast_cred_msg_t * msg)
  1701. {
  1702. if (msg) {
  1703. xfree(msg->node_addr);
  1704. xfree(msg->node_list);
  1705. delete_sbcast_cred(msg->sbcast_cred);
  1706. xfree(msg);
  1707. }
  1708. }
  1709. /*
  1710. * slurm_free_job_alloc_info_response_msg - free slurm job allocation
  1711. * info response message
  1712. * IN msg - pointer to job allocation info response message
  1713. * NOTE: buffer is loaded by slurm_allocate_resources
  1714. */
  1715. extern void slurm_free_job_alloc_info_response_msg(
  1716. job_alloc_info_response_msg_t *msg)
  1717. {
  1718. if (msg) {
  1719. if (msg->select_jobinfo)
  1720. select_g_select_jobinfo_free(msg->select_jobinfo);
  1721. xfree(msg->node_list);
  1722. xfree(msg->cpus_per_node);
  1723. xfree(msg->cpu_count_reps);
  1724. xfree(msg->node_addr);
  1725. xfree(msg);
  1726. }
  1727. }
  1728. /*
  1729. * slurm_free_job_step_create_response_msg - free slurm
  1730. * job step create response message
  1731. * IN msg - pointer to job step create response message
  1732. * NOTE: buffer is loaded by slurm_job_step_create
  1733. */
  1734. extern void slurm_free_job_step_create_response_msg(
  1735. job_step_create_response_msg_t * msg)
  1736. {
  1737. if (msg) {
  1738. xfree(msg->resv_ports);
  1739. slurm_step_layout_destroy(msg->step_layout);
  1740. slurm_cred_destroy(msg->cred);
  1741. if (msg->select_jobinfo)
  1742. select_g_select_jobinfo_free(msg->select_jobinfo);
  1743. if (msg->switch_job)
  1744. switch_free_jobinfo(msg->switch_job);
  1745. xfree(msg);
  1746. }
  1747. }
  1748. /*
  1749. * slurm_free_submit_response_response_msg - free slurm
  1750. * job submit response message
  1751. * IN msg - pointer to job submit response message
  1752. * NOTE: buffer is loaded by slurm_submit_batch_job
  1753. */
  1754. extern void slurm_free_submit_response_response_msg(submit_response_msg_t * msg)
  1755. {
  1756. xfree(msg);
  1757. }
  1758. /*
  1759. * slurm_free_ctl_conf - free slurm control information response message
  1760. * IN msg - pointer to slurm control information response message
  1761. * NOTE: buffer is loaded by slurm_load_jobs
  1762. */
  1763. extern void slurm_free_ctl_conf(slurm_ctl_conf_info_msg_t * config_ptr)
  1764. {
  1765. if (config_ptr) {
  1766. free_slurm_conf(config_ptr, 0);
  1767. xfree(config_ptr);
  1768. }
  1769. }
  1770. /*
  1771. * slurm_free_slurmd_status - free slurmd state information
  1772. * IN msg - pointer to slurmd state information
  1773. * NOTE: buffer is loaded by slurm_load_slurmd_status
  1774. */
  1775. extern void slurm_free_slurmd_status(slurmd_status_t* slurmd_status_ptr)
  1776. {
  1777. if (slurmd_status_ptr) {
  1778. xfree(slurmd_status_ptr->hostname);
  1779. xfree(slurmd_status_ptr->slurmd_logfile);
  1780. xfree(slurmd_status_ptr->step_list);
  1781. xfree(slurmd_status_ptr->version);
  1782. xfree(slurmd_status_ptr);
  1783. }
  1784. }
  1785. /*
  1786. * slurm_free_job_info - free the job information response message
  1787. * IN msg - pointer to job information response message
  1788. * NOTE: buffer is loaded by slurm_load_job.
  1789. */
  1790. extern void slurm_free_job_info_msg(job_info_msg_t * job_buffer_ptr)
  1791. {
  1792. if (job_buffer_ptr) {
  1793. if (job_buffer_ptr->job_array) {
  1794. _free_all_job_info(job_buffer_ptr);
  1795. xfree(job_buffer_ptr->job_array);
  1796. }
  1797. xfree(job_buffer_ptr);
  1798. }
  1799. }
  1800. static void _free_all_job_info(job_info_msg_t *msg)
  1801. {
  1802. int i;
  1803. if ((msg == NULL) ||
  1804. (msg->job_array == NULL))
  1805. return;
  1806. for (i = 0; i < msg->record_count; i++)
  1807. slurm_free_job_info_members (&msg->job_array[i]);
  1808. }
  1809. /*
  1810. * slurm_free_job_step_info_response_msg - free the job step
  1811. * information response message
  1812. * IN msg - pointer to job step information response message
  1813. * NOTE: buffer is loaded by slurm_get_job_steps.
  1814. */
  1815. extern void slurm_free_job_step_info_response_msg(job_step_info_response_msg_t *
  1816. msg)
  1817. {
  1818. if (msg != NULL) {
  1819. if (msg->job_steps != NULL) {
  1820. _free_all_step_info(msg);
  1821. xfree(msg->job_steps);
  1822. }
  1823. xfree(msg);
  1824. }
  1825. }
  1826. static void _free_all_step_info (job_step_info_response_msg_t *msg)
  1827. {
  1828. int i;
  1829. if ((msg == NULL) ||
  1830. (msg->job_steps == NULL))
  1831. return;
  1832. for (i = 0; i < msg->job_step_count; i++)
  1833. slurm_free_job_step_info_members (&msg->job_steps[i]);
  1834. }
  1835. extern void slurm_free_job_step_info_members (job_step_info_t * msg)
  1836. {
  1837. if (msg != NULL) {
  1838. xfree(msg->ckpt_dir);
  1839. xfree(msg->name);
  1840. xfree(msg->network);
  1841. xfree(msg->nodes);
  1842. xfree(msg->node_inx);
  1843. xfree(msg->partition);
  1844. xfree(msg->resv_ports);
  1845. select_g_select_jobinfo_free(msg->select_jobinfo);
  1846. msg->select_jobinfo = NULL;
  1847. }
  1848. }
  1849. /*
  1850. * slurm_free_front_end_info - free the front_end information response message
  1851. * IN msg - pointer to front_end information response message
  1852. * NOTE: buffer is loaded by slurm_load_front_end.
  1853. */
  1854. extern void slurm_free_front_end_info_msg(front_end_info_msg_t * msg)
  1855. {
  1856. if (msg) {
  1857. if (msg->front_end_array) {
  1858. _free_all_front_end_info(msg);
  1859. xfree(msg->front_end_array);
  1860. }
  1861. xfree(msg);
  1862. }
  1863. }
  1864. static void _free_all_front_end_info(front_end_info_msg_t *msg)
  1865. {
  1866. int i;
  1867. if ((msg == NULL) || (msg->front_end_array == NULL))
  1868. return;
  1869. for (i = 0; i < msg->record_count; i++)
  1870. slurm_free_front_end_info_members(&msg->front_end_array[i]);
  1871. }
  1872. extern void slurm_free_front_end_info_members(front_end_info_t * front_end)
  1873. {
  1874. if (front_end) {
  1875. xfree(front_end->name);
  1876. xfree(front_end->reason);
  1877. }
  1878. }
  1879. /*
  1880. * slurm_free_node_info - free the node information response message
  1881. * IN msg - pointer to node information response message
  1882. * NOTE: buffer is loaded by slurm_load_node.
  1883. */
  1884. extern void slurm_free_node_info_msg(node_info_msg_t * msg)
  1885. {
  1886. if (msg) {
  1887. if (msg->node_array) {
  1888. _free_all_node_info(msg);
  1889. xfree(msg->node_array);
  1890. }
  1891. xfree(msg);
  1892. }
  1893. }
  1894. static void _free_all_node_info(node_info_msg_t *msg)
  1895. {
  1896. int i;
  1897. if ((msg == NULL) || (msg->node_array == NULL))
  1898. return;
  1899. for (i = 0; i < msg->record_count; i++)
  1900. slurm_free_node_info_members(&msg->node_array[i]);
  1901. }
  1902. extern void slurm_free_node_info_members(node_info_t * node)
  1903. {
  1904. if (node) {
  1905. xfree(node->arch);
  1906. xfree(node->features);
  1907. xfree(node->name);
  1908. xfree(node->node_hostname);
  1909. xfree(node->node_addr);
  1910. xfree(node->os);
  1911. xfree(node->reason);
  1912. select_g_select_nodeinfo_free(node->select_nodeinfo);
  1913. node->select_nodeinfo = NULL;
  1914. }
  1915. }
  1916. /*
  1917. * slurm_free_partition_info_msg - free the partition information
  1918. * response message
  1919. * IN msg - pointer to partition information response message
  1920. * NOTE: buffer is loaded by slurm_load_partitions
  1921. */
  1922. extern void slurm_free_partition_info_msg(partition_info_msg_t * msg)
  1923. {
  1924. if (msg) {
  1925. if (msg->partition_array) {
  1926. _free_all_partitions(msg);
  1927. xfree(msg->partition_array);
  1928. }
  1929. xfree(msg);
  1930. }
  1931. }
  1932. static void _free_all_partitions(partition_info_msg_t *msg)
  1933. {
  1934. int i;
  1935. if ((msg == NULL) ||
  1936. (msg->partition_array == NULL))
  1937. return;
  1938. for (i = 0; i < msg->record_count; i++)
  1939. slurm_free_partition_info_members(
  1940. &msg->partition_array[i]);
  1941. }
  1942. extern void slurm_free_partition_info_members(partition_info_t * part)
  1943. {
  1944. if (part) {
  1945. xfree(part->allow_alloc_nodes);
  1946. xfree(part->allow_groups);
  1947. xfree(part->alternate);
  1948. xfree(part->name);
  1949. xfree(part->nodes);
  1950. xfree(part->node_inx);
  1951. }
  1952. }
  1953. /*
  1954. * slurm_free_reserve_info_msg - free the reservation information
  1955. * response message
  1956. * IN msg - pointer to reservation information response message
  1957. * NOTE: buffer is loaded by slurm_load_reservation
  1958. */
  1959. extern void slurm_free_reservation_info_msg(reserve_info_msg_t * msg)
  1960. {
  1961. if (msg) {
  1962. if (msg->reservation_array) {
  1963. _free_all_reservations(msg);
  1964. xfree(msg->reservation_array);
  1965. }
  1966. xfree(msg);
  1967. }
  1968. }
  1969. static void _free_all_reservations(reserve_info_msg_t *msg)
  1970. {
  1971. int i;
  1972. if ((msg == NULL) ||
  1973. (msg->rese

Large files files are truncated, but you can click here to view the full file