blob: 04778a09ee89fc4f5cbe98d0abdd300e6bd9b05a [file] [log] [blame]
/*****************************************************************************\
* persist_conn.h - Definitions for communicating over a persistent
* connection within Slurm.
******************************************************************************
* Copyright (C) SchedMD LLC.
*
* This file is part of Slurm, a resource management program.
* For details, see <https://slurm.schedmd.com/>.
* Please also read the included file: DISCLAIMER.
*
* Slurm is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* In addition, as a special exception, the copyright holders give permission
* to link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two. You must obey the GNU
* General Public License in all respects for all of the code used other than
* OpenSSL. If you modify file(s) with this exception, you may extend this
* exception to your version of the file(s), but you are not obligated to do
* so. If you do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source files in
* the program, then also delete it here.
*
* Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with Slurm; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\*****************************************************************************/
#ifndef _SLURM_PERSIST_CONN_H
#define _SLURM_PERSIST_CONN_H
#include "slurm/slurm.h"
#include "pack.h"
#define PERSIST_FLAG_NONE 0x0000
#define PERSIST_FLAG_DBD SLURM_BIT(0)
#define PERSIST_FLAG_RECONNECT SLURM_BIT(1)
#define PERSIST_FLAG_ALREADY_INITED SLURM_BIT(2)
#define PERSIST_FLAG_P_USER_CASE SLURM_BIT(3)
#define PERSIST_FLAG_SUPPRESS_ERR SLURM_BIT(4)
#define PERSIST_FLAG_EXT_DBD SLURM_BIT(5)
#define PERSIST_FLAG_DONT_UPDATE_CLUSTER SLURM_BIT(6)
#define PERSIST_CONN_NOT_INITED -2
typedef enum {
PERSIST_TYPE_NONE = 0,
PERSIST_TYPE_DBD,
PERSIST_TYPE_FED,
PERSIST_TYPE_HA_CTL,
PERSIST_TYPE_HA_DBD,
PERSIST_TYPE_ACCT_UPDATE,
} persist_conn_type_t;
typedef struct {
void *conn; /* persist_conn_t */
void *data; /* pointer to a message type below */
uint16_t msg_type; /* slurmdbd_msg_type_t / slurm_msg_type_t */
} persist_msg_t;
typedef struct {
void *auth_cred;
uid_t auth_uid;
gid_t auth_gid;
bool auth_ids_set;
int (*callback_proc)(void *arg, persist_msg_t *msg, buf_t **out_buffer);
void (*callback_fini)(void *arg);
char *cluster_name;
time_t comm_fail_time; /* avoid constant error messages */
uint16_t my_port;
uint16_t flags;
bool inited;
persist_conn_type_t persist_type;
uid_t r_uid;
char *rem_host;
uint16_t rem_port;
time_t *shutdown;
pthread_t thread_id;
int timeout;
void *tls_conn;
slurm_trigger_callbacks_t trigger_callbacks;
uint16_t version;
} persist_conn_t;
typedef struct {
char *cluster_name; /* cluster this message is coming from */
uint16_t persist_type; /* really persist_conn_type_t, uint16_t on wire */
uint16_t port; /* If you want to open a new connection, this is
* the port to talk to. */
uint16_t version; /* protocol version */
uint32_t uid; /* UID originating connection,
* filled by authtentication plugin*/
} persist_init_req_msg_t;
typedef struct {
char *comment;
uint16_t flags;
uint32_t rc;
uint16_t ret_info; /* protocol version we are connecting to since we
* sent the lowest one to begin with, or the return
* of a message type sent. */
} persist_rc_msg_t;
/* setup a daemon to receive incoming persistent connections. */
extern void slurm_persist_conn_recv_server_init(void);
/* finish up any persistent connections we are listening to */
extern void slurm_persist_conn_recv_server_fini(void);
/*
* Create a thread that will wait listening on the fd in the persist_conn_t.
*
* IN - persist_conn - persistent connection to listen to. This will be freed
* internally, so forget about once it enters here.
* IN - thread_loc - location in the persist_conn thread pool. This number can
* be got from slurm_persist_conn_wait_for_thread_loc or given
* -1 to get one inside the function.
* IN - arg - arbitrary argument that will be sent to the callback as well as
* the callback in the persist_conn.
*/
extern void slurm_persist_conn_recv_thread_init(persist_conn_t *persist_conn,
int fd, int thread_loc,
void *arg);
/* Increment thread_count and don't return until its value is no larger
* than MAX_THREAD_COUNT,
* RET index of free index in persist_pthread_id or -1 to exit */
extern int slurm_persist_conn_wait_for_thread_loc(void);
/* Free the index given from slurm_persist_conn_wait_for_thread_loc */
extern void slurm_persist_conn_free_thread_loc(int thread_loc);
/* Open a persistent socket connection and sends an init message to establish
* the connection.
* IN/OUT - persistent connection needing host and port filled in. Returned
* completely filled in.
* Returns SLURM_SUCCESS on success or SLURM_ERROR on failure */
extern int slurm_persist_conn_open(persist_conn_t *persist_conn);
/* Close the persistent connection don't free structure or members */
extern void slurm_persist_conn_close(persist_conn_t *persist_conn);
extern int slurm_persist_conn_reopen(persist_conn_t *persist_conn);
/* Close the persistent connection members, but don't free structure */
extern void slurm_persist_conn_members_destroy(persist_conn_t *persist_conn);
/* Close the persistent connection and free structure */
extern void slurm_persist_conn_destroy(persist_conn_t *persist_conn);
extern int slurm_persist_conn_process_msg(persist_conn_t *persist_conn,
persist_msg_t *persist_msg,
char *msg_char, uint32_t msg_size,
buf_t **out_buffer, bool first);
extern int slurm_persist_conn_writeable(persist_conn_t *persist_conn);
extern int slurm_persist_send_msg(persist_conn_t *persist_conn,
buf_t *buffer);
extern buf_t *slurm_persist_recv_msg(persist_conn_t *persist_conn);
extern buf_t *slurm_persist_msg_pack(persist_conn_t *persist_conn,
persist_msg_t *req_msg);
extern int slurm_persist_msg_unpack(persist_conn_t *persist_conn,
persist_msg_t *resp_msg, buf_t *buffer);
extern void slurm_persist_pack_init_req_msg(persist_init_req_msg_t *msg,
buf_t *buffer);
extern int slurm_persist_unpack_init_req_msg(persist_init_req_msg_t **msg,
buf_t *buffer);
extern void slurm_persist_free_init_req_msg(persist_init_req_msg_t *msg);
extern void slurm_persist_pack_rc_msg(persist_rc_msg_t *msg, buf_t *buffer,
uint16_t protocol_version);
extern int slurm_persist_unpack_rc_msg(persist_rc_msg_t **msg, buf_t *buffer,
uint16_t protocol_version);
extern void slurm_persist_free_rc_msg(persist_rc_msg_t *msg);
extern buf_t *slurm_persist_make_rc_msg(persist_conn_t *persist_conn,
uint32_t rc, char *comment,
uint16_t ret_info);
extern buf_t *slurm_persist_make_rc_msg_flags(persist_conn_t *persist_conn,
uint32_t rc, char *comment,
uint16_t flags,
uint16_t ret_info);
#endif