1 /*****************************************************************************\
2 * slurm_accounting_storage.c - account storage plugin wrapper.
3 *****************************************************************************
4 * Copyright (C) 2002-2007 The Regents of the University of California.
5 * Copyright (C) 2008-2010 Lawrence Livermore National Security.
6 * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
7 * Written by Danny Auble <da@llnl.gov>.
8 * CODE-OCEC-09-009. All rights reserved.
9 *
10 * This file is part of Slurm, a resource management program.
11 * For details, see <https://slurm.schedmd.com/>.
12 * Please also read the included file: DISCLAIMER.
13 *
14 * Slurm is free software; you can redistribute it and/or modify it under
15 * the terms of the GNU General Public License as published by the Free
16 * Software Foundation; either version 2 of the License, or (at your option)
17 * any later version.
18 *
19 * In addition, as a special exception, the copyright holders give permission
20 * to link the code of portions of this program with the OpenSSL library under
21 * certain conditions as described in each individual source file, and
22 * distribute linked combinations including the two. You must obey the GNU
23 * General Public License in all respects for all of the code used other than
24 * OpenSSL. If you modify file(s) with this exception, you may extend this
25 * exception to your version of the file(s), but you are not obligated to do
26 * so. If you do not wish to do so, delete this exception statement from your
27 * version. If you delete this exception statement from all source files in
28 * the program, then also delete it here.
29 *
30 * Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
31 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
32 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
33 * details.
34 *
35 * You should have received a copy of the GNU General Public License along
36 * with Slurm; if not, write to the Free Software Foundation, Inc.,
37 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
38 \*****************************************************************************/
39
40 #define _GNU_SOURCE
41
42 #include <pthread.h>
43 #include <string.h>
44
45 #include "src/common/list.h"
46 #include "src/common/plugin.h"
47 #include "src/common/plugrack.h"
48 #include "src/common/node_select.h"
49 #include "src/common/slurm_accounting_storage.h"
50 #include "src/common/slurm_protocol_api.h"
51 #include "src/common/slurm_protocol_defs.h"
52 #include "src/common/xstring.h"
53 #include "src/sacctmgr/sacctmgr.h"
54 #include "src/slurmctld/slurmctld.h"
55
56 int with_slurmdbd = 0;
57 uid_t db_api_uid = -1;
58 /*
59 * Local data
60 */
61
62 typedef struct slurm_acct_storage_ops {
63 void *(*get_conn) (const slurm_trigger_callbacks_t *callbacks,
64 int conn_num, uint16_t *persist_conn_flags,
65 bool rollback, char *cluster_name);
66 int (*close_conn) (void **db_conn);
67 int (*commit) (void *db_conn, bool commit);
68 int (*add_users) (void *db_conn, uint32_t uid,
69 List user_list);
70 int (*add_coord) (void *db_conn, uint32_t uid,
71 List acct_list,
72 slurmdb_user_cond_t *user_cond);
73 int (*add_accts) (void *db_conn, uint32_t uid,
74 List acct_list);
75 int (*add_clusters) (void *db_conn, uint32_t uid,
76 List cluster_list);
77 int (*add_federations) (void *db_conn, uint32_t uid,
78 List federation_list);
79 int (*add_tres) (void *db_conn, uint32_t uid,
80 List tres_list_in);
81 int (*add_assocs) (void *db_conn, uint32_t uid,
82 List assoc_list);
83 int (*add_qos) (void *db_conn, uint32_t uid,
84 List qos_list);
85 int (*add_res) (void *db_conn, uint32_t uid,
86 List res_list);
87 int (*add_wckeys) (void *db_conn, uint32_t uid,
88 List wckey_list);
89 int (*add_reservation) (void *db_conn,
90 slurmdb_reservation_rec_t *resv);
91 List (*modify_users) (void *db_conn, uint32_t uid,
92 slurmdb_user_cond_t *user_cond,
93 slurmdb_user_rec_t *user);
94 List (*modify_accts) (void *db_conn, uint32_t uid,
95 slurmdb_account_cond_t *acct_cond,
96 slurmdb_account_rec_t *acct);
97 List (*modify_clusters) (void *db_conn, uint32_t uid,
98 slurmdb_cluster_cond_t *cluster_cond,
99 slurmdb_cluster_rec_t *cluster);
100 List (*modify_assocs) (void *db_conn, uint32_t uid,
101 slurmdb_assoc_cond_t *assoc_cond,
102 slurmdb_assoc_rec_t *assoc);
103 List (*modify_federations) (void *db_conn, uint32_t uid,
104 slurmdb_federation_cond_t *fed_cond,
105 slurmdb_federation_rec_t *fed);
106 List (*modify_job) (void *db_conn, uint32_t uid,
107 slurmdb_job_cond_t *job_cond,
108 slurmdb_job_rec_t *job);
109 List (*modify_qos) (void *db_conn, uint32_t uid,
110 slurmdb_qos_cond_t *qos_cond,
111 slurmdb_qos_rec_t *qos);
112 List (*modify_res) (void *db_conn, uint32_t uid,
113 slurmdb_res_cond_t *res_cond,
114 slurmdb_res_rec_t *res);
115 List (*modify_wckeys) (void *db_conn, uint32_t uid,
116 slurmdb_wckey_cond_t *wckey_cond,
117 slurmdb_wckey_rec_t *wckey);
118 int (*modify_reservation) (void *db_conn,
119 slurmdb_reservation_rec_t *resv);
120 List (*remove_users) (void *db_conn, uint32_t uid,
121 slurmdb_user_cond_t *user_cond);
122 List (*remove_coord) (void *db_conn, uint32_t uid,
123 List acct_list,
124 slurmdb_user_cond_t *user_cond);
125 List (*remove_accts) (void *db_conn, uint32_t uid,
126 slurmdb_account_cond_t *acct_cond);
127 List (*remove_clusters) (void *db_conn, uint32_t uid,
128 slurmdb_cluster_cond_t *cluster_cond);
129 List (*remove_assocs) (void *db_conn, uint32_t uid,
130 slurmdb_assoc_cond_t *assoc_cond);
131 List (*remove_federations) (void *db_conn, uint32_t uid,
132 slurmdb_federation_cond_t *fed_cond);
133 List (*remove_qos) (void *db_conn, uint32_t uid,
134 slurmdb_qos_cond_t *qos_cond);
135 List (*remove_res) (void *db_conn, uint32_t uid,
136 slurmdb_res_cond_t *res_cond);
137 List (*remove_wckeys) (void *db_conn, uint32_t uid,
138 slurmdb_wckey_cond_t *wckey_cond);
139 int (*remove_reservation) (void *db_conn,
140 slurmdb_reservation_rec_t *resv);
141 List (*get_users) (void *db_conn, uint32_t uid,
142 slurmdb_user_cond_t *user_cond);
143 List (*get_accts) (void *db_conn, uint32_t uid,
144 slurmdb_account_cond_t *acct_cond);
145 List (*get_clusters) (void *db_conn, uint32_t uid,
146 slurmdb_cluster_cond_t *cluster_cond);
147 List (*get_federations) (void *db_conn, uint32_t uid,
148 slurmdb_federation_cond_t *fed_cond);
149 List (*get_config) (void *db_conn, char *config_name);
150 List (*get_tres) (void *db_conn, uint32_t uid,
151 slurmdb_tres_cond_t *tres_cond);
152 List (*get_assocs) (void *db_conn, uint32_t uid,
153 slurmdb_assoc_cond_t *assoc_cond);
154 List (*get_events) (void *db_conn, uint32_t uid,
155 slurmdb_event_cond_t *event_cond);
156 List (*get_problems) (void *db_conn, uint32_t uid,
157 slurmdb_assoc_cond_t *assoc_cond);
158 List (*get_qos) (void *db_conn, uint32_t uid,
159 slurmdb_qos_cond_t *qos_cond);
160 List (*get_res) (void *db_conn, uint32_t uid,
161 slurmdb_res_cond_t *res_cond);
162 List (*get_wckeys) (void *db_conn, uint32_t uid,
163 slurmdb_wckey_cond_t *wckey_cond);
164 List (*get_resvs) (void *db_conn, uint32_t uid,
165 slurmdb_reservation_cond_t *resv_cond);
166 List (*get_txn) (void *db_conn, uint32_t uid,
167 slurmdb_txn_cond_t *txn_cond);
168 int (*get_usage) (void *db_conn, uint32_t uid,
169 void *in, int type,
170 time_t start,
171 time_t end);
172 int (*roll_usage) (void *db_conn,
173 time_t sent_start, time_t sent_end,
174 uint16_t archive_data,
175 List *rollup_stats_list_in);
176 int (*fix_runaway_jobs) (void *db_conn, uint32_t uid, List jobs);
177 int (*node_down) (void *db_conn, node_record_t *node_ptr,
178 time_t event_time, char *reason,
179 uint32_t reason_uid);
180 int (*node_up) (void *db_conn, node_record_t *node_ptr,
181 time_t event_time);
182 int (*cluster_tres) (void *db_conn, char *cluster_nodes,
183 char *tres_str_in, time_t event_time,
184 uint16_t rpc_version);
185 int (*register_ctld) (void *db_conn, uint16_t port);
186 int (*register_disconn_ctld)(void *db_conn, char *control_host);
187 int (*fini_ctld) (void *db_conn,
188 slurmdb_cluster_rec_t *cluster_rec);
189 int (*job_start) (void *db_conn, job_record_t *job_ptr);
190 int (*job_complete) (void *db_conn, job_record_t *job_ptr);
191 int (*step_start) (void *db_conn, step_record_t *step_ptr);
192 int (*step_complete) (void *db_conn, step_record_t *step_ptr);
193 int (*job_suspend) (void *db_conn, job_record_t *job_ptr);
194 List (*get_jobs_cond) (void *db_conn, uint32_t uid,
195 slurmdb_job_cond_t *job_cond);
196 int (*archive_dump) (void *db_conn,
197 slurmdb_archive_cond_t *arch_cond);
198 int (*archive_load) (void *db_conn,
199 slurmdb_archive_rec_t *arch_rec);
200 int (*update_shares_used) (void *db_conn,
201 List shares_used);
202 int (*flush_jobs) (void *db_conn,
203 time_t event_time);
204 int (*reconfig) (void *db_conn, bool dbd);
205 int (*reset_lft_rgt) (void *db_conn, uid_t uid,
206 List cluster_list);
207 int (*get_stats) (void *db_conn, slurmdb_stats_rec_t **stats);
208 int (*clear_stats) (void *db_conn);
209 int (*get_data) (void *db_conn, acct_storage_info_t dinfo,
210 void *data);
211 int (*shutdown) (void *db_conn);
212 } slurm_acct_storage_ops_t;
213 /*
214 * Must be synchronized with slurm_acct_storage_ops_t above.
215 */
216 static const char *syms[] = {
217 "acct_storage_p_get_connection",
218 "acct_storage_p_close_connection",
219 "acct_storage_p_commit",
220 "acct_storage_p_add_users",
221 "acct_storage_p_add_coord",
222 "acct_storage_p_add_accts",
223 "acct_storage_p_add_clusters",
224 "acct_storage_p_add_federations",
225 "acct_storage_p_add_tres",
226 "acct_storage_p_add_assocs",
227 "acct_storage_p_add_qos",
228 "acct_storage_p_add_res",
229 "acct_storage_p_add_wckeys",
230 "acct_storage_p_add_reservation",
231 "acct_storage_p_modify_users",
232 "acct_storage_p_modify_accts",
233 "acct_storage_p_modify_clusters",
234 "acct_storage_p_modify_assocs",
235 "acct_storage_p_modify_federations",
236 "acct_storage_p_modify_job",
237 "acct_storage_p_modify_qos",
238 "acct_storage_p_modify_res",
239 "acct_storage_p_modify_wckeys",
240 "acct_storage_p_modify_reservation",
241 "acct_storage_p_remove_users",
242 "acct_storage_p_remove_coord",
243 "acct_storage_p_remove_accts",
244 "acct_storage_p_remove_clusters",
245 "acct_storage_p_remove_assocs",
246 "acct_storage_p_remove_federations",
247 "acct_storage_p_remove_qos",
248 "acct_storage_p_remove_res",
249 "acct_storage_p_remove_wckeys",
250 "acct_storage_p_remove_reservation",
251 "acct_storage_p_get_users",
252 "acct_storage_p_get_accts",
253 "acct_storage_p_get_clusters",
254 "acct_storage_p_get_federations",
255 "acct_storage_p_get_config",
256 "acct_storage_p_get_tres",
257 "acct_storage_p_get_assocs",
258 "acct_storage_p_get_events",
259 "acct_storage_p_get_problems",
260 "acct_storage_p_get_qos",
261 "acct_storage_p_get_res",
262 "acct_storage_p_get_wckeys",
263 "acct_storage_p_get_reservations",
264 "acct_storage_p_get_txn",
265 "acct_storage_p_get_usage",
266 "acct_storage_p_roll_usage",
267 "acct_storage_p_fix_runaway_jobs",
268 "clusteracct_storage_p_node_down",
269 "clusteracct_storage_p_node_up",
270 "clusteracct_storage_p_cluster_tres",
271 "clusteracct_storage_p_register_ctld",
272 "clusteracct_storage_p_register_disconn_ctld",
273 "clusteracct_storage_p_fini_ctld",
274 "jobacct_storage_p_job_start",
275 "jobacct_storage_p_job_complete",
276 "jobacct_storage_p_step_start",
277 "jobacct_storage_p_step_complete",
278 "jobacct_storage_p_suspend",
279 "jobacct_storage_p_get_jobs_cond",
280 "jobacct_storage_p_archive",
281 "jobacct_storage_p_archive_load",
282 "acct_storage_p_update_shares_used",
283 "acct_storage_p_flush_jobs_on_cluster",
284 "acct_storage_p_reconfig",
285 "acct_storage_p_reset_lft_rgt",
286 "acct_storage_p_get_stats",
287 "acct_storage_p_clear_stats",
288 "acct_storage_p_get_data",
289 "acct_storage_p_shutdown",
290 };
291
292 static slurm_acct_storage_ops_t ops;
293 static plugin_context_t *plugin_context = NULL;
294 static pthread_mutex_t plugin_context_lock = PTHREAD_MUTEX_INITIALIZER;
295 static bool init_run = false;
296 static uint16_t enforce = 0;
297
298 /*
299 * If running with slurmdbd don't run if we don't have an index, else
300 * go ahead.
301 */
jobacct_storage_job_start_direct(void * db_conn,job_record_t * job_ptr)302 extern int jobacct_storage_job_start_direct(void *db_conn,
303 job_record_t *job_ptr)
304 {
305 if (with_slurmdbd && !job_ptr->db_index)
306 return SLURM_SUCCESS;
307
308 return jobacct_storage_g_job_start(db_conn, job_ptr);
309 }
310
311 /*
312 * Initialize context for acct_storage plugin
313 */
slurm_acct_storage_init(char * loc)314 extern int slurm_acct_storage_init(char *loc)
315 {
316 int retval = SLURM_SUCCESS;
317 char *plugin_type = "accounting_storage";
318 char *type = NULL;
319
320 if (init_run && plugin_context)
321 return retval;
322
323 slurm_mutex_lock(&plugin_context_lock);
324
325 if (plugin_context)
326 goto done;
327
328 if (loc)
329 slurm_set_accounting_storage_loc(loc);
330
331 type = slurm_get_accounting_storage_type();
332
333 plugin_context = plugin_context_create(
334 plugin_type, type, (void **)&ops, syms, sizeof(syms));
335
336 if (!plugin_context) {
337 error("cannot create %s context for %s", plugin_type, type);
338 retval = SLURM_ERROR;
339 goto done;
340 }
341 init_run = true;
342 enforce = slurm_get_accounting_storage_enforce();
343 done:
344 slurm_mutex_unlock(&plugin_context_lock);
345 xfree(type);
346 return retval;
347 }
348
slurm_acct_storage_fini(void)349 extern int slurm_acct_storage_fini(void)
350 {
351 int rc;
352
353 if (!plugin_context)
354 return SLURM_SUCCESS;
355
356 init_run = false;
357 // (*(ops.acct_storage_fini))();
358 rc = plugin_context_destroy(plugin_context);
359 plugin_context = NULL;
360 return rc;
361 }
362
acct_storage_g_get_connection(const slurm_trigger_callbacks_t * callbacks,int conn_num,uint16_t * persist_conn_flags,bool rollback,char * cluster_name)363 extern void *acct_storage_g_get_connection(
364 const slurm_trigger_callbacks_t *callbacks,
365 int conn_num, uint16_t *persist_conn_flags,
366 bool rollback,char *cluster_name)
367 {
368 if (slurm_acct_storage_init(NULL) < 0)
369 return NULL;
370 return (*(ops.get_conn))(callbacks, conn_num, persist_conn_flags,
371 rollback, cluster_name);
372 }
373
acct_storage_g_close_connection(void ** db_conn)374 extern int acct_storage_g_close_connection(void **db_conn)
375 {
376 if (slurm_acct_storage_init(NULL) < 0)
377 return SLURM_ERROR;
378 return (*(ops.close_conn))(db_conn);
379
380 }
381
acct_storage_g_commit(void * db_conn,bool commit)382 extern int acct_storage_g_commit(void *db_conn, bool commit)
383 {
384 if (slurm_acct_storage_init(NULL) < 0)
385 return SLURM_ERROR;
386 return (*(ops.commit))(db_conn, commit);
387
388 }
389
acct_storage_g_add_users(void * db_conn,uint32_t uid,List user_list)390 extern int acct_storage_g_add_users(void *db_conn, uint32_t uid,
391 List user_list)
392 {
393 if (slurm_acct_storage_init(NULL) < 0)
394 return SLURM_ERROR;
395 return (*(ops.add_users))(db_conn, uid, user_list);
396 }
397
acct_storage_g_add_coord(void * db_conn,uint32_t uid,List acct_list,slurmdb_user_cond_t * user_cond)398 extern int acct_storage_g_add_coord(void *db_conn, uint32_t uid,
399 List acct_list,
400 slurmdb_user_cond_t *user_cond)
401 {
402 if (slurm_acct_storage_init(NULL) < 0)
403 return SLURM_ERROR;
404 return (*(ops.add_coord))(db_conn, uid, acct_list, user_cond);
405 }
406
acct_storage_g_add_accounts(void * db_conn,uint32_t uid,List acct_list)407 extern int acct_storage_g_add_accounts(void *db_conn, uint32_t uid,
408 List acct_list)
409 {
410 if (slurm_acct_storage_init(NULL) < 0)
411 return SLURM_ERROR;
412 return (*(ops.add_accts))(db_conn, uid, acct_list);
413 }
414
acct_storage_g_add_clusters(void * db_conn,uint32_t uid,List cluster_list)415 extern int acct_storage_g_add_clusters(void *db_conn, uint32_t uid,
416 List cluster_list)
417 {
418 if (slurm_acct_storage_init(NULL) < 0)
419 return SLURM_ERROR;
420 return (*(ops.add_clusters))(db_conn, uid, cluster_list);
421 }
422
acct_storage_g_add_federations(void * db_conn,uint32_t uid,List federation_list)423 extern int acct_storage_g_add_federations(void *db_conn, uint32_t uid,
424 List federation_list)
425 {
426 if (slurm_acct_storage_init(NULL) < 0)
427 return SLURM_ERROR;
428 return (*(ops.add_federations))(db_conn, uid, federation_list);
429 }
430
acct_storage_g_add_tres(void * db_conn,uint32_t uid,List tres_list_in)431 extern int acct_storage_g_add_tres(void *db_conn, uint32_t uid,
432 List tres_list_in)
433 {
434 if (slurm_acct_storage_init(NULL) < 0)
435 return SLURM_ERROR;
436 return (*(ops.add_tres))(db_conn, uid, tres_list_in);
437 }
438
acct_storage_g_add_assocs(void * db_conn,uint32_t uid,List assoc_list)439 extern int acct_storage_g_add_assocs(void *db_conn, uint32_t uid,
440 List assoc_list)
441 {
442 if (slurm_acct_storage_init(NULL) < 0)
443 return SLURM_ERROR;
444 return (*(ops.add_assocs))(db_conn, uid, assoc_list);
445 }
446
acct_storage_g_add_qos(void * db_conn,uint32_t uid,List qos_list)447 extern int acct_storage_g_add_qos(void *db_conn, uint32_t uid,
448 List qos_list)
449 {
450 if (slurm_acct_storage_init(NULL) < 0)
451 return SLURM_ERROR;
452 return (*(ops.add_qos))(db_conn, uid, qos_list);
453 }
454
acct_storage_g_add_res(void * db_conn,uint32_t uid,List res_list)455 extern int acct_storage_g_add_res(void *db_conn, uint32_t uid,
456 List res_list)
457 {
458 if (slurm_acct_storage_init(NULL) < 0)
459 return SLURM_ERROR;
460 return (*(ops.add_res))(db_conn, uid, res_list);
461 }
acct_storage_g_add_wckeys(void * db_conn,uint32_t uid,List wckey_list)462 extern int acct_storage_g_add_wckeys(void *db_conn, uint32_t uid,
463 List wckey_list)
464 {
465 if (slurm_acct_storage_init(NULL) < 0)
466 return SLURM_ERROR;
467 return (*(ops.add_wckeys))(db_conn, uid, wckey_list);
468 }
469
acct_storage_g_add_reservation(void * db_conn,slurmdb_reservation_rec_t * resv)470 extern int acct_storage_g_add_reservation(void *db_conn,
471 slurmdb_reservation_rec_t *resv)
472 {
473 if (slurm_acct_storage_init(NULL) < 0)
474 return NO_VAL;
475 return (*(ops.add_reservation))(db_conn, resv);
476 }
477
acct_storage_g_modify_users(void * db_conn,uint32_t uid,slurmdb_user_cond_t * user_cond,slurmdb_user_rec_t * user)478 extern List acct_storage_g_modify_users(void *db_conn, uint32_t uid,
479 slurmdb_user_cond_t *user_cond,
480 slurmdb_user_rec_t *user)
481 {
482 if (slurm_acct_storage_init(NULL) < 0)
483 return NULL;
484 return (*(ops.modify_users))(db_conn, uid, user_cond, user);
485 }
486
acct_storage_g_modify_accounts(void * db_conn,uint32_t uid,slurmdb_account_cond_t * acct_cond,slurmdb_account_rec_t * acct)487 extern List acct_storage_g_modify_accounts(void *db_conn, uint32_t uid,
488 slurmdb_account_cond_t *acct_cond,
489 slurmdb_account_rec_t *acct)
490 {
491 if (slurm_acct_storage_init(NULL) < 0)
492 return NULL;
493 return (*(ops.modify_accts))(db_conn, uid, acct_cond, acct);
494 }
495
acct_storage_g_modify_clusters(void * db_conn,uint32_t uid,slurmdb_cluster_cond_t * cluster_cond,slurmdb_cluster_rec_t * cluster)496 extern List acct_storage_g_modify_clusters(void *db_conn, uint32_t uid,
497 slurmdb_cluster_cond_t *cluster_cond,
498 slurmdb_cluster_rec_t *cluster)
499 {
500 if (slurm_acct_storage_init(NULL) < 0)
501 return NULL;
502 return (*(ops.modify_clusters))(db_conn, uid, cluster_cond, cluster);
503 }
504
acct_storage_g_modify_assocs(void * db_conn,uint32_t uid,slurmdb_assoc_cond_t * assoc_cond,slurmdb_assoc_rec_t * assoc)505 extern List acct_storage_g_modify_assocs(
506 void *db_conn, uint32_t uid,
507 slurmdb_assoc_cond_t *assoc_cond,
508 slurmdb_assoc_rec_t *assoc)
509 {
510 if (slurm_acct_storage_init(NULL) < 0)
511 return NULL;
512 return (*(ops.modify_assocs))(db_conn, uid, assoc_cond, assoc);
513 }
514
acct_storage_g_modify_federations(void * db_conn,uint32_t uid,slurmdb_federation_cond_t * fed_cond,slurmdb_federation_rec_t * fed)515 extern List acct_storage_g_modify_federations(
516 void *db_conn, uint32_t uid,
517 slurmdb_federation_cond_t *fed_cond,
518 slurmdb_federation_rec_t *fed)
519 {
520 if (slurm_acct_storage_init(NULL) < 0)
521 return NULL;
522 return (*(ops.modify_federations))(db_conn, uid, fed_cond, fed);
523 }
524
acct_storage_g_modify_job(void * db_conn,uint32_t uid,slurmdb_job_cond_t * job_cond,slurmdb_job_rec_t * job)525 extern List acct_storage_g_modify_job(void *db_conn, uint32_t uid,
526 slurmdb_job_cond_t *job_cond,
527 slurmdb_job_rec_t *job)
528 {
529 if (slurm_acct_storage_init(NULL) < 0)
530 return NULL;
531
532 return (*(ops.modify_job))(db_conn, uid, job_cond, job);
533 }
534
acct_storage_g_modify_qos(void * db_conn,uint32_t uid,slurmdb_qos_cond_t * qos_cond,slurmdb_qos_rec_t * qos)535 extern List acct_storage_g_modify_qos(void *db_conn, uint32_t uid,
536 slurmdb_qos_cond_t *qos_cond,
537 slurmdb_qos_rec_t *qos)
538 {
539 if (slurm_acct_storage_init(NULL) < 0)
540 return NULL;
541 return (*(ops.modify_qos))(db_conn, uid, qos_cond, qos);
542 }
543
acct_storage_g_modify_res(void * db_conn,uint32_t uid,slurmdb_res_cond_t * res_cond,slurmdb_res_rec_t * res)544 extern List acct_storage_g_modify_res(void *db_conn, uint32_t uid,
545 slurmdb_res_cond_t *res_cond,
546 slurmdb_res_rec_t *res)
547 {
548 if (slurm_acct_storage_init(NULL) < 0)
549 return NULL;
550 return (*(ops.modify_res))(db_conn, uid, res_cond, res);
551 }
552
acct_storage_g_modify_wckeys(void * db_conn,uint32_t uid,slurmdb_wckey_cond_t * wckey_cond,slurmdb_wckey_rec_t * wckey)553 extern List acct_storage_g_modify_wckeys(void *db_conn, uint32_t uid,
554 slurmdb_wckey_cond_t *wckey_cond,
555 slurmdb_wckey_rec_t *wckey)
556 {
557 if (slurm_acct_storage_init(NULL) < 0)
558 return NULL;
559 return (*(ops.modify_wckeys))(db_conn, uid, wckey_cond, wckey);
560 }
561
acct_storage_g_modify_reservation(void * db_conn,slurmdb_reservation_rec_t * resv)562 extern int acct_storage_g_modify_reservation(void *db_conn,
563 slurmdb_reservation_rec_t *resv)
564 {
565 if (slurm_acct_storage_init(NULL) < 0)
566 return NO_VAL;
567 return (*(ops.modify_reservation))(db_conn, resv);
568 }
569
acct_storage_g_remove_users(void * db_conn,uint32_t uid,slurmdb_user_cond_t * user_cond)570 extern List acct_storage_g_remove_users(void *db_conn, uint32_t uid,
571 slurmdb_user_cond_t *user_cond)
572 {
573 if (slurm_acct_storage_init(NULL) < 0)
574 return NULL;
575 return (*(ops.remove_users))(db_conn, uid, user_cond);
576 }
577
acct_storage_g_remove_coord(void * db_conn,uint32_t uid,List acct_list,slurmdb_user_cond_t * user_cond)578 extern List acct_storage_g_remove_coord(void *db_conn, uint32_t uid,
579 List acct_list,
580 slurmdb_user_cond_t *user_cond)
581 {
582 if (slurm_acct_storage_init(NULL) < 0)
583 return NULL;
584 return (*(ops.remove_coord))(db_conn, uid, acct_list, user_cond);
585 }
586
acct_storage_g_remove_accounts(void * db_conn,uint32_t uid,slurmdb_account_cond_t * acct_cond)587 extern List acct_storage_g_remove_accounts(void *db_conn, uint32_t uid,
588 slurmdb_account_cond_t *acct_cond)
589 {
590 if (slurm_acct_storage_init(NULL) < 0)
591 return NULL;
592 return (*(ops.remove_accts))(db_conn, uid, acct_cond);
593 }
594
acct_storage_g_remove_clusters(void * db_conn,uint32_t uid,slurmdb_cluster_cond_t * cluster_cond)595 extern List acct_storage_g_remove_clusters(void *db_conn, uint32_t uid,
596 slurmdb_cluster_cond_t *cluster_cond)
597 {
598 if (slurm_acct_storage_init(NULL) < 0)
599 return NULL;
600 return (*(ops.remove_clusters))(db_conn, uid, cluster_cond);
601 }
602
acct_storage_g_remove_assocs(void * db_conn,uint32_t uid,slurmdb_assoc_cond_t * assoc_cond)603 extern List acct_storage_g_remove_assocs(
604 void *db_conn, uint32_t uid,
605 slurmdb_assoc_cond_t *assoc_cond)
606 {
607 if (slurm_acct_storage_init(NULL) < 0)
608 return NULL;
609 return (*(ops.remove_assocs))(db_conn, uid, assoc_cond);
610 }
611
acct_storage_g_remove_federations(void * db_conn,uint32_t uid,slurmdb_federation_cond_t * fed_cond)612 extern List acct_storage_g_remove_federations(
613 void *db_conn, uint32_t uid,
614 slurmdb_federation_cond_t *fed_cond)
615 {
616 if (slurm_acct_storage_init(NULL) < 0)
617 return NULL;
618 return (*(ops.remove_federations))(db_conn, uid, fed_cond);
619 }
620
acct_storage_g_remove_qos(void * db_conn,uint32_t uid,slurmdb_qos_cond_t * qos_cond)621 extern List acct_storage_g_remove_qos(void *db_conn, uint32_t uid,
622 slurmdb_qos_cond_t *qos_cond)
623 {
624 if (slurm_acct_storage_init(NULL) < 0)
625 return NULL;
626 return (*(ops.remove_qos))(db_conn, uid, qos_cond);
627 }
628
acct_storage_g_remove_res(void * db_conn,uint32_t uid,slurmdb_res_cond_t * res_cond)629 extern List acct_storage_g_remove_res(void *db_conn, uint32_t uid,
630 slurmdb_res_cond_t *res_cond)
631 {
632 if (slurm_acct_storage_init(NULL) < 0)
633 return NULL;
634 return (*(ops.remove_res))(db_conn, uid, res_cond);
635 }
636
acct_storage_g_remove_wckeys(void * db_conn,uint32_t uid,slurmdb_wckey_cond_t * wckey_cond)637 extern List acct_storage_g_remove_wckeys(void *db_conn, uint32_t uid,
638 slurmdb_wckey_cond_t *wckey_cond)
639 {
640 if (slurm_acct_storage_init(NULL) < 0)
641 return NULL;
642 return (*(ops.remove_wckeys))(db_conn, uid, wckey_cond);
643 }
644
acct_storage_g_remove_reservation(void * db_conn,slurmdb_reservation_rec_t * resv)645 extern int acct_storage_g_remove_reservation(void *db_conn,
646 slurmdb_reservation_rec_t *resv)
647 {
648 if (slurm_acct_storage_init(NULL) < 0)
649 return NO_VAL;
650 return (*(ops.remove_reservation))(db_conn, resv);
651 }
652
acct_storage_g_get_users(void * db_conn,uint32_t uid,slurmdb_user_cond_t * user_cond)653 extern List acct_storage_g_get_users(void *db_conn, uint32_t uid,
654 slurmdb_user_cond_t *user_cond)
655 {
656 if (slurm_acct_storage_init(NULL) < 0)
657 return NULL;
658 return (*(ops.get_users))(db_conn, uid, user_cond);
659 }
660
acct_storage_g_get_accounts(void * db_conn,uint32_t uid,slurmdb_account_cond_t * acct_cond)661 extern List acct_storage_g_get_accounts(void *db_conn, uint32_t uid,
662 slurmdb_account_cond_t *acct_cond)
663 {
664 if (slurm_acct_storage_init(NULL) < 0)
665 return NULL;
666 return (*(ops.get_accts))(db_conn, uid, acct_cond);
667 }
668
acct_storage_g_get_clusters(void * db_conn,uint32_t uid,slurmdb_cluster_cond_t * cluster_cond)669 extern List acct_storage_g_get_clusters(void *db_conn, uint32_t uid,
670 slurmdb_cluster_cond_t *cluster_cond)
671 {
672 if (slurm_acct_storage_init(NULL) < 0)
673 return NULL;
674 return (*(ops.get_clusters))(db_conn, uid, cluster_cond);
675 }
676
acct_storage_g_get_federations(void * db_conn,uint32_t uid,slurmdb_federation_cond_t * fed_cond)677 extern List acct_storage_g_get_federations(void *db_conn, uint32_t uid,
678 slurmdb_federation_cond_t *fed_cond)
679 {
680 if (slurm_acct_storage_init(NULL) < 0)
681 return NULL;
682 return (*(ops.get_federations))(db_conn, uid, fed_cond);
683 }
684
acct_storage_g_get_config(void * db_conn,char * config_name)685 extern List acct_storage_g_get_config(void *db_conn, char *config_name)
686 {
687 if (slurm_acct_storage_init(NULL) < 0)
688 return NULL;
689 return (*(ops.get_config))(db_conn, config_name);
690 }
691
acct_storage_g_get_tres(void * db_conn,uint32_t uid,slurmdb_tres_cond_t * tres_cond)692 extern List acct_storage_g_get_tres(
693 void *db_conn, uint32_t uid,
694 slurmdb_tres_cond_t *tres_cond)
695 {
696 if (slurm_acct_storage_init(NULL) < 0)
697 return NULL;
698 return (*(ops.get_tres))(db_conn, uid, tres_cond);
699 }
700
acct_storage_g_get_assocs(void * db_conn,uint32_t uid,slurmdb_assoc_cond_t * assoc_cond)701 extern List acct_storage_g_get_assocs(
702 void *db_conn, uint32_t uid,
703 slurmdb_assoc_cond_t *assoc_cond)
704 {
705 if (slurm_acct_storage_init(NULL) < 0)
706 return NULL;
707 return (*(ops.get_assocs))(db_conn, uid, assoc_cond);
708 }
709
acct_storage_g_get_events(void * db_conn,uint32_t uid,slurmdb_event_cond_t * event_cond)710 extern List acct_storage_g_get_events(void *db_conn, uint32_t uid,
711 slurmdb_event_cond_t *event_cond)
712 {
713 if (slurm_acct_storage_init(NULL) < 0)
714 return NULL;
715 return (*(ops.get_events))(db_conn, uid, event_cond);
716 }
717
acct_storage_g_get_problems(void * db_conn,uint32_t uid,slurmdb_assoc_cond_t * assoc_cond)718 extern List acct_storage_g_get_problems(void *db_conn, uint32_t uid,
719 slurmdb_assoc_cond_t *assoc_cond)
720 {
721 if (slurm_acct_storage_init(NULL) < 0)
722 return NULL;
723 return (*(ops.get_problems))(db_conn, uid, assoc_cond);
724 }
725
acct_storage_g_get_qos(void * db_conn,uint32_t uid,slurmdb_qos_cond_t * qos_cond)726 extern List acct_storage_g_get_qos(void *db_conn, uint32_t uid,
727 slurmdb_qos_cond_t *qos_cond)
728 {
729 if (slurm_acct_storage_init(NULL) < 0)
730 return NULL;
731 return (*(ops.get_qos))(db_conn, uid, qos_cond);
732 }
733
acct_storage_g_get_res(void * db_conn,uint32_t uid,slurmdb_res_cond_t * res_cond)734 extern List acct_storage_g_get_res(void *db_conn, uint32_t uid,
735 slurmdb_res_cond_t *res_cond)
736 {
737 if (slurm_acct_storage_init(NULL) < 0)
738 return NULL;
739 return (*(ops.get_res))(db_conn, uid, res_cond);
740 }
741
acct_storage_g_get_wckeys(void * db_conn,uint32_t uid,slurmdb_wckey_cond_t * wckey_cond)742 extern List acct_storage_g_get_wckeys(void *db_conn, uint32_t uid,
743 slurmdb_wckey_cond_t *wckey_cond)
744 {
745 if (slurm_acct_storage_init(NULL) < 0)
746 return NULL;
747 return (*(ops.get_wckeys))(db_conn, uid, wckey_cond);
748 }
749
acct_storage_g_get_reservations(void * db_conn,uint32_t uid,slurmdb_reservation_cond_t * resv_cond)750 extern List acct_storage_g_get_reservations(
751 void *db_conn, uint32_t uid, slurmdb_reservation_cond_t *resv_cond)
752 {
753 if (slurm_acct_storage_init(NULL) < 0)
754 return NULL;
755 return (*(ops.get_resvs))(db_conn, uid, resv_cond);
756 }
757
acct_storage_g_get_txn(void * db_conn,uint32_t uid,slurmdb_txn_cond_t * txn_cond)758 extern List acct_storage_g_get_txn(void *db_conn, uint32_t uid,
759 slurmdb_txn_cond_t *txn_cond)
760 {
761 if (slurm_acct_storage_init(NULL) < 0)
762 return NULL;
763 return (*(ops.get_txn))(db_conn, uid, txn_cond);
764 }
765
acct_storage_g_get_usage(void * db_conn,uint32_t uid,void * in,int type,time_t start,time_t end)766 extern int acct_storage_g_get_usage(void *db_conn, uint32_t uid,
767 void *in, int type,
768 time_t start, time_t end)
769 {
770 if (slurm_acct_storage_init(NULL) < 0)
771 return SLURM_ERROR;
772 return (*(ops.get_usage))(db_conn, uid, in, type, start, end);
773 }
774
acct_storage_g_roll_usage(void * db_conn,time_t sent_start,time_t sent_end,uint16_t archive_data,List * rollup_stats_list_in)775 extern int acct_storage_g_roll_usage(void *db_conn,
776 time_t sent_start, time_t sent_end,
777 uint16_t archive_data,
778 List *rollup_stats_list_in)
779 {
780 if (slurm_acct_storage_init(NULL) < 0)
781 return SLURM_ERROR;
782 return (*(ops.roll_usage))(db_conn, sent_start, sent_end, archive_data,
783 rollup_stats_list_in);
784 }
785
acct_storage_g_fix_runaway_jobs(void * db_conn,uint32_t uid,List jobs)786 extern int acct_storage_g_fix_runaway_jobs(void *db_conn,
787 uint32_t uid, List jobs)
788 {
789 if (slurm_acct_storage_init(NULL) < 0)
790 return SLURM_ERROR;
791 return (*(ops.fix_runaway_jobs))(db_conn, uid, jobs);
792
793 }
794
clusteracct_storage_g_node_down(void * db_conn,node_record_t * node_ptr,time_t event_time,char * reason,uint32_t reason_uid)795 extern int clusteracct_storage_g_node_down(void *db_conn,
796 node_record_t *node_ptr,
797 time_t event_time,
798 char *reason, uint32_t reason_uid)
799 {
800 if (slurm_acct_storage_init(NULL) < 0)
801 return SLURM_ERROR;
802 return (*(ops.node_down))(db_conn, node_ptr, event_time,
803 reason, reason_uid);
804 }
805
clusteracct_storage_g_node_up(void * db_conn,node_record_t * node_ptr,time_t event_time)806 extern int clusteracct_storage_g_node_up(void *db_conn,
807 node_record_t *node_ptr,
808 time_t event_time)
809 {
810 if (slurm_acct_storage_init(NULL) < 0)
811 return SLURM_ERROR;
812
813 xfree(node_ptr->reason);
814 node_ptr->reason_time = 0;
815 node_ptr->reason_uid = NO_VAL;
816
817 return (*(ops.node_up))(db_conn, node_ptr, event_time);
818 }
819
820
clusteracct_storage_g_cluster_tres(void * db_conn,char * cluster_nodes,char * tres_str_in,time_t event_time,uint16_t rpc_version)821 extern int clusteracct_storage_g_cluster_tres(void *db_conn,
822 char *cluster_nodes,
823 char *tres_str_in,
824 time_t event_time,
825 uint16_t rpc_version)
826 {
827 if (slurm_acct_storage_init(NULL) < 0)
828 return SLURM_ERROR;
829 return (*(ops.cluster_tres))(db_conn, cluster_nodes,
830 tres_str_in, event_time, rpc_version);
831 }
832
833
clusteracct_storage_g_register_ctld(void * db_conn,uint16_t port)834 extern int clusteracct_storage_g_register_ctld(void *db_conn, uint16_t port)
835 {
836 if (slurm_acct_storage_init(NULL) < 0)
837 return SLURM_ERROR;
838 return (*(ops.register_ctld))(db_conn, port);
839 }
840
clusteracct_storage_g_register_disconn_ctld(void * db_conn,char * control_host)841 extern int clusteracct_storage_g_register_disconn_ctld(
842 void *db_conn, char *control_host)
843 {
844 if (slurm_acct_storage_init(NULL) < 0)
845 return SLURM_ERROR;
846 return (*(ops.register_disconn_ctld))(db_conn, control_host);
847 }
848
clusteracct_storage_g_fini_ctld(void * db_conn,slurmdb_cluster_rec_t * cluster_rec)849 extern int clusteracct_storage_g_fini_ctld(void *db_conn,
850 slurmdb_cluster_rec_t *cluster_rec)
851 {
852 if (slurm_acct_storage_init(NULL) < 0)
853 return SLURM_ERROR;
854 return (*(ops.fini_ctld))(db_conn, cluster_rec);
855 }
856
857 /*
858 * load into the storage information about a job,
859 * typically when it begins execution, but possibly earlier
860 */
jobacct_storage_g_job_start(void * db_conn,job_record_t * job_ptr)861 extern int jobacct_storage_g_job_start(void *db_conn,
862 job_record_t *job_ptr)
863 {
864 if (slurm_acct_storage_init(NULL) < 0)
865 return SLURM_ERROR;
866 if (enforce & ACCOUNTING_ENFORCE_NO_JOBS)
867 return SLURM_SUCCESS;
868
869 /* A pending job's start_time is it's expected initiation time
870 * (changed in slurm v2.1). Rather than changing a bunch of code
871 * in the accounting_storage plugins and SlurmDBD, just clear
872 * start_time before accounting and restore it later.
873 * If an update for a job that is being requeued[hold] happens,
874 * we don't want to modify the start_time of the old record.
875 * Pending + Completing is equivalent to Requeue.
876 */
877 if (IS_JOB_PENDING(job_ptr) && !IS_JOB_COMPLETING(job_ptr)) {
878 int rc;
879 time_t orig_start_time = job_ptr->start_time;
880 job_ptr->start_time = (time_t) 0;
881 rc = (*(ops.job_start))(db_conn, job_ptr);
882 job_ptr->start_time = orig_start_time;
883 return rc;
884 }
885
886 return (*(ops.job_start))(db_conn, job_ptr);
887 }
888
889 /*
890 * load into the storage the end of a job
891 */
jobacct_storage_g_job_complete(void * db_conn,job_record_t * job_ptr)892 extern int jobacct_storage_g_job_complete(void *db_conn,
893 job_record_t *job_ptr)
894 {
895 if (slurm_acct_storage_init(NULL) < 0)
896 return SLURM_ERROR;
897 if (enforce & ACCOUNTING_ENFORCE_NO_JOBS)
898 return SLURM_SUCCESS;
899 return (*(ops.job_complete))(db_conn, job_ptr);
900 }
901
902 /*
903 * load into the storage the start of a job step
904 */
jobacct_storage_g_step_start(void * db_conn,step_record_t * step_ptr)905 extern int jobacct_storage_g_step_start(void *db_conn, step_record_t *step_ptr)
906 {
907 if (slurm_acct_storage_init(NULL) < 0)
908 return SLURM_ERROR;
909 if (enforce & ACCOUNTING_ENFORCE_NO_STEPS)
910 return SLURM_SUCCESS;
911 return (*(ops.step_start))(db_conn, step_ptr);
912 }
913
914 /*
915 * load into the storage the end of a job step
916 */
jobacct_storage_g_step_complete(void * db_conn,step_record_t * step_ptr)917 extern int jobacct_storage_g_step_complete(void *db_conn,
918 step_record_t *step_ptr)
919 {
920 if (slurm_acct_storage_init(NULL) < 0)
921 return SLURM_ERROR;
922 if (enforce & ACCOUNTING_ENFORCE_NO_STEPS)
923 return SLURM_SUCCESS;
924 return (*(ops.step_complete))(db_conn, step_ptr);
925 }
926
927 /*
928 * load into the storage a suspension of a job
929 */
jobacct_storage_g_job_suspend(void * db_conn,job_record_t * job_ptr)930 extern int jobacct_storage_g_job_suspend(void *db_conn,
931 job_record_t *job_ptr)
932 {
933 if (slurm_acct_storage_init(NULL) < 0)
934 return SLURM_ERROR;
935 if (enforce & ACCOUNTING_ENFORCE_NO_JOBS)
936 return SLURM_SUCCESS;
937 return (*(ops.job_suspend))(db_conn, job_ptr);
938 }
939
_sort_desc_submit_time(void * x,void * y)940 static int _sort_desc_submit_time(void *x, void *y)
941 {
942 slurmdb_job_rec_t *j1 = *(slurmdb_job_rec_t **)x;
943 slurmdb_job_rec_t *j2 = *(slurmdb_job_rec_t **)y;
944
945 if (j1->submit < j2->submit)
946 return -1;
947 else if (j1->submit > j2->submit)
948 return 1;
949
950 return 0;
951 }
952
953 /*
954 * get info from the storage
955 * returns List of job_rec_t *
956 * note List needs to be freed when called
957 */
jobacct_storage_g_get_jobs_cond(void * db_conn,uint32_t uid,slurmdb_job_cond_t * job_cond)958 extern List jobacct_storage_g_get_jobs_cond(void *db_conn, uint32_t uid,
959 slurmdb_job_cond_t *job_cond)
960 {
961 List ret_list;
962
963 if (slurm_acct_storage_init(NULL) < 0)
964 return NULL;
965 ret_list = (*(ops.get_jobs_cond))(db_conn, uid, job_cond);
966
967 /* If multiple clusters were requested, the jobs are grouped together by
968 * cluster -- each group sorted by submit time. Sort all the jobs by
969 * submit time */
970 if (ret_list && job_cond && job_cond->cluster_list &&
971 (list_count(job_cond->cluster_list) > 1))
972 list_sort(ret_list, (ListCmpF)_sort_desc_submit_time);
973
974 return ret_list;
975 }
976
977 /*
978 * expire old info from the storage
979 */
jobacct_storage_g_archive(void * db_conn,slurmdb_archive_cond_t * arch_cond)980 extern int jobacct_storage_g_archive(void *db_conn,
981 slurmdb_archive_cond_t *arch_cond)
982 {
983 if (slurm_acct_storage_init(NULL) < 0)
984 return SLURM_ERROR;
985 return (*(ops.archive_dump))(db_conn, arch_cond);
986 }
987
988 /*
989 * load expired info into the storage
990 */
jobacct_storage_g_archive_load(void * db_conn,slurmdb_archive_rec_t * arch_rec)991 extern int jobacct_storage_g_archive_load(void *db_conn,
992 slurmdb_archive_rec_t *arch_rec)
993 {
994 if (slurm_acct_storage_init(NULL) < 0)
995 return SLURM_ERROR;
996 return (*(ops.archive_load))(db_conn, arch_rec);
997
998 }
999
1000 /*
1001 * record shares used information for backup in case slurmctld restarts
1002 * IN: account_list List of shares_used_object_t *
1003 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1004 */
acct_storage_g_update_shares_used(void * db_conn,List acct_list)1005 extern int acct_storage_g_update_shares_used(void *db_conn, List acct_list)
1006 {
1007 if (slurm_acct_storage_init(NULL) < 0)
1008 return SLURM_ERROR;
1009 return (*(ops.update_shares_used))(db_conn, acct_list);
1010 }
1011
1012 /*
1013 * This should be called when a cluster does a cold start to flush out
1014 * any jobs that were running during the restart so we don't have any
1015 * jobs in the database "running" forever since no endtime will be
1016 * placed in there other wise.
1017 * IN: char * = cluster name
1018 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1019 */
acct_storage_g_flush_jobs_on_cluster(void * db_conn,time_t event_time)1020 extern int acct_storage_g_flush_jobs_on_cluster(
1021 void *db_conn, time_t event_time)
1022 {
1023 if (slurm_acct_storage_init(NULL) < 0)
1024 return SLURM_ERROR;
1025 return (*(ops.flush_jobs))(db_conn, event_time);
1026
1027 }
1028
1029 /*
1030 * When a reconfigure happens this should be called.
1031 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1032 */
acct_storage_g_reconfig(void * db_conn,bool dbd)1033 extern int acct_storage_g_reconfig(void *db_conn, bool dbd)
1034 {
1035 if (slurm_acct_storage_init(NULL) < 0)
1036 return SLURM_ERROR;
1037 return (*(ops.reconfig))(db_conn, dbd);
1038
1039 }
1040
1041 /*
1042 * Reset the lft and rights of an association table.
1043 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1044 */
acct_storage_g_reset_lft_rgt(void * db_conn,uid_t uid,List cluster_list)1045 extern int acct_storage_g_reset_lft_rgt(void *db_conn, uid_t uid,
1046 List cluster_list)
1047 {
1048 if (slurm_acct_storage_init(NULL) < 0)
1049 return SLURM_ERROR;
1050 return (*(ops.reset_lft_rgt))(db_conn, uid, cluster_list);
1051
1052 }
1053
1054 /*
1055 * Get performance statistics.
1056 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1057 */
acct_storage_g_get_stats(void * db_conn,slurmdb_stats_rec_t ** stats)1058 extern int acct_storage_g_get_stats(void *db_conn, slurmdb_stats_rec_t **stats)
1059 {
1060 if (slurm_acct_storage_init(NULL) < 0)
1061 return SLURM_ERROR;
1062 return (*(ops.get_stats))(db_conn, stats);
1063 }
1064
1065 /*
1066 * Clear performance statistics.
1067 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1068 */
acct_storage_g_clear_stats(void * db_conn)1069 extern int acct_storage_g_clear_stats(void *db_conn)
1070 {
1071 if (slurm_acct_storage_init(NULL) < 0)
1072 return SLURM_ERROR;
1073 return (*(ops.clear_stats))(db_conn);
1074 }
1075
1076 /*
1077 * Get generic data.
1078 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1079 */
acct_storage_g_get_data(void * db_conn,acct_storage_info_t dinfo,void * data)1080 extern int acct_storage_g_get_data(void *db_conn, acct_storage_info_t dinfo,
1081 void *data)
1082 {
1083 if (slurm_acct_storage_init(NULL) < 0)
1084 return SLURM_ERROR;
1085 return (*(ops.get_data))(db_conn, dinfo, data);
1086 }
1087
1088
1089 /*
1090 * Shutdown database server.
1091 * RET: SLURM_SUCCESS on success SLURM_ERROR else
1092 */
acct_storage_g_shutdown(void * db_conn)1093 extern int acct_storage_g_shutdown(void *db_conn)
1094 {
1095 if (slurm_acct_storage_init(NULL) < 0)
1096 return SLURM_ERROR;
1097 return (*(ops.shutdown))(db_conn);
1098
1099 }
1100