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