mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
be313b1300
You can do with cluster-wide too, by adding -C
127 lines
3.9 KiB
C
127 lines
3.9 KiB
C
/*
|
|
* Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved.
|
|
* Copyright (C) 2004 Red Hat, Inc. All rights reserved.
|
|
*
|
|
* This file is part of LVM2.
|
|
*
|
|
* This copyrighted material is made available to anyone wishing to use,
|
|
* modify, copy, or redistribute it subject to the terms and conditions
|
|
* of the GNU General Public License v.2.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef _CLVMD_H
|
|
#define _CLVMD_H
|
|
|
|
#define CLVMD_MAJOR_VERSION 0
|
|
#define CLVMD_MINOR_VERSION 2
|
|
#define CLVMD_PATCH_VERSION 1
|
|
|
|
/* Name of the cluster LVM admin lock */
|
|
#define ADMIN_LOCK_NAME "CLVMD_ADMIN"
|
|
|
|
/* Default time (in seconds) we will wait for all remote commands to execute
|
|
before declaring them dead */
|
|
#define DEFAULT_CMD_TIMEOUT 60
|
|
|
|
/* One of these for each reply we get from command execution on a node */
|
|
struct node_reply {
|
|
char node[MAX_CLUSTER_MEMBER_NAME_LEN];
|
|
char *replymsg;
|
|
int status;
|
|
struct node_reply *next;
|
|
};
|
|
|
|
typedef enum {DEBUG_OFF, DEBUG_STDERR, DEBUG_SYSLOG} debug_t;
|
|
|
|
/*
|
|
* These exist for the use of local sockets only when we are
|
|
* collecting responses from all cluster nodes
|
|
*/
|
|
struct localsock_bits {
|
|
struct node_reply *replies;
|
|
int num_replies;
|
|
int expected_replies;
|
|
time_t sent_time; /* So we can check for timeouts */
|
|
int in_progress; /* Only execute one cmd at a time per client */
|
|
int sent_out; /* Flag to indicate that a command was sent
|
|
to remote nodes */
|
|
void *private; /* Private area for command processor use */
|
|
void *cmd; /* Whole command as passed down local socket */
|
|
int cmd_len; /* Length of above */
|
|
int pipe; /* Pipe to send PRE completion status down */
|
|
int finished; /* Flag to tell subthread to exit */
|
|
int all_success; /* Set to 0 if any node (or the pre_command)
|
|
failed */
|
|
struct local_client *pipe_client;
|
|
pthread_t threadid;
|
|
enum { PRE_COMMAND, POST_COMMAND, QUIT } state;
|
|
pthread_mutex_t mutex; /* Main thread and worker synchronisation */
|
|
pthread_cond_t cond;
|
|
|
|
pthread_mutex_t reply_mutex; /* Protect reply structure */
|
|
};
|
|
|
|
/* Entries for PIPE clients */
|
|
struct pipe_bits {
|
|
struct local_client *client; /* Actual (localsock) client */
|
|
pthread_t threadid; /* Our own copy of the thread id */
|
|
};
|
|
|
|
/* Entries for Network socket clients */
|
|
struct netsock_bits {
|
|
void *private;
|
|
int flags;
|
|
};
|
|
|
|
typedef int (*fd_callback_t) (struct local_client * fd, char *buf, int len,
|
|
const char *csid,
|
|
struct local_client ** new_client);
|
|
|
|
/* One of these for each fd we are listening on */
|
|
struct local_client {
|
|
int fd;
|
|
enum { CLUSTER_MAIN_SOCK, CLUSTER_DATA_SOCK, LOCAL_RENDEZVOUS,
|
|
LOCAL_SOCK, THREAD_PIPE, CLUSTER_INTERNAL } type;
|
|
struct local_client *next;
|
|
unsigned short xid;
|
|
fd_callback_t callback;
|
|
uint8_t removeme;
|
|
|
|
union {
|
|
struct localsock_bits localsock;
|
|
struct pipe_bits pipe;
|
|
struct netsock_bits net;
|
|
} bits;
|
|
};
|
|
|
|
#define DEBUGLOG(fmt, args...) debuglog(fmt, ## args);
|
|
|
|
#ifndef max
|
|
#define max(a,b) ((a)>(b)?(a):(b))
|
|
#endif
|
|
|
|
/* The real command processor is in clvmd-command.c */
|
|
extern int do_command(struct local_client *client, struct clvm_header *msg,
|
|
int msglen, char **buf, int buflen, int *retlen);
|
|
|
|
/* Pre and post command routines are called only on the local node */
|
|
extern int do_pre_command(struct local_client *client);
|
|
extern int do_post_command(struct local_client *client);
|
|
extern void cmd_client_cleanup(struct local_client *client);
|
|
extern int add_client(struct local_client *new_client);
|
|
|
|
extern void clvmd_cluster_init_completed(void);
|
|
extern void process_message(struct local_client *client, const char *buf,
|
|
int len, const char *csid);
|
|
extern void debuglog(const char *fmt, ... )
|
|
__attribute__ ((format(printf, 1, 2)));
|
|
|
|
int sync_lock(const char *resource, int mode, int flags, int *lockid);
|
|
int sync_unlock(const char *resource, int lockid);
|
|
|
|
#endif
|