clvmd.h revision 1.1.1.1 1 1.1 haad /* $NetBSD: clvmd.h,v 1.1.1.1 2008/12/22 00:18:51 haad Exp $ */
2 1.1 haad
3 1.1 haad /*
4 1.1 haad * Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved.
5 1.1 haad * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
6 1.1 haad *
7 1.1 haad * This file is part of LVM2.
8 1.1 haad *
9 1.1 haad * This copyrighted material is made available to anyone wishing to use,
10 1.1 haad * modify, copy, or redistribute it subject to the terms and conditions
11 1.1 haad * of the GNU General Public License v.2.
12 1.1 haad *
13 1.1 haad * You should have received a copy of the GNU General Public License
14 1.1 haad * along with this program; if not, write to the Free Software Foundation,
15 1.1 haad * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 1.1 haad */
17 1.1 haad
18 1.1 haad #ifndef _CLVMD_H
19 1.1 haad #define _CLVMD_H
20 1.1 haad
21 1.1 haad #define CLVMD_MAJOR_VERSION 0
22 1.1 haad #define CLVMD_MINOR_VERSION 2
23 1.1 haad #define CLVMD_PATCH_VERSION 1
24 1.1 haad
25 1.1 haad /* Name of the cluster LVM admin lock */
26 1.1 haad #define ADMIN_LOCK_NAME "CLVMD_ADMIN"
27 1.1 haad
28 1.1 haad /* Default time (in seconds) we will wait for all remote commands to execute
29 1.1 haad before declaring them dead */
30 1.1 haad #define DEFAULT_CMD_TIMEOUT 60
31 1.1 haad
32 1.1 haad /* One of these for each reply we get from command execution on a node */
33 1.1 haad struct node_reply {
34 1.1 haad char node[MAX_CLUSTER_MEMBER_NAME_LEN];
35 1.1 haad char *replymsg;
36 1.1 haad int status;
37 1.1 haad struct node_reply *next;
38 1.1 haad };
39 1.1 haad
40 1.1 haad typedef enum {DEBUG_OFF, DEBUG_STDERR, DEBUG_SYSLOG} debug_t;
41 1.1 haad
42 1.1 haad /*
43 1.1 haad * These exist for the use of local sockets only when we are
44 1.1 haad * collecting responses from all cluster nodes
45 1.1 haad */
46 1.1 haad struct localsock_bits {
47 1.1 haad struct node_reply *replies;
48 1.1 haad int num_replies;
49 1.1 haad int expected_replies;
50 1.1 haad time_t sent_time; /* So we can check for timeouts */
51 1.1 haad int in_progress; /* Only execute one cmd at a time per client */
52 1.1 haad int sent_out; /* Flag to indicate that a command was sent
53 1.1 haad to remote nodes */
54 1.1 haad void *private; /* Private area for command processor use */
55 1.1 haad void *cmd; /* Whole command as passed down local socket */
56 1.1 haad int cmd_len; /* Length of above */
57 1.1 haad int pipe; /* Pipe to send PRE completion status down */
58 1.1 haad int finished; /* Flag to tell subthread to exit */
59 1.1 haad int all_success; /* Set to 0 if any node (or the pre_command)
60 1.1 haad failed */
61 1.1 haad struct local_client *pipe_client;
62 1.1 haad pthread_t threadid;
63 1.1 haad enum { PRE_COMMAND, POST_COMMAND, QUIT } state;
64 1.1 haad pthread_mutex_t mutex; /* Main thread and worker synchronisation */
65 1.1 haad pthread_cond_t cond;
66 1.1 haad
67 1.1 haad pthread_mutex_t reply_mutex; /* Protect reply structure */
68 1.1 haad };
69 1.1 haad
70 1.1 haad /* Entries for PIPE clients */
71 1.1 haad struct pipe_bits {
72 1.1 haad struct local_client *client; /* Actual (localsock) client */
73 1.1 haad pthread_t threadid; /* Our own copy of the thread id */
74 1.1 haad };
75 1.1 haad
76 1.1 haad /* Entries for Network socket clients */
77 1.1 haad struct netsock_bits {
78 1.1 haad void *private;
79 1.1 haad int flags;
80 1.1 haad };
81 1.1 haad
82 1.1 haad typedef int (*fd_callback_t) (struct local_client * fd, char *buf, int len,
83 1.1 haad const char *csid,
84 1.1 haad struct local_client ** new_client);
85 1.1 haad
86 1.1 haad /* One of these for each fd we are listening on */
87 1.1 haad struct local_client {
88 1.1 haad int fd;
89 1.1 haad enum { CLUSTER_MAIN_SOCK, CLUSTER_DATA_SOCK, LOCAL_RENDEZVOUS,
90 1.1 haad LOCAL_SOCK, THREAD_PIPE, CLUSTER_INTERNAL } type;
91 1.1 haad struct local_client *next;
92 1.1 haad unsigned short xid;
93 1.1 haad fd_callback_t callback;
94 1.1 haad uint8_t removeme;
95 1.1 haad
96 1.1 haad union {
97 1.1 haad struct localsock_bits localsock;
98 1.1 haad struct pipe_bits pipe;
99 1.1 haad struct netsock_bits net;
100 1.1 haad } bits;
101 1.1 haad };
102 1.1 haad
103 1.1 haad #define DEBUGLOG(fmt, args...) debuglog(fmt, ## args);
104 1.1 haad
105 1.1 haad #ifndef max
106 1.1 haad #define max(a,b) ((a)>(b)?(a):(b))
107 1.1 haad #endif
108 1.1 haad
109 1.1 haad /* The real command processor is in clvmd-command.c */
110 1.1 haad extern int do_command(struct local_client *client, struct clvm_header *msg,
111 1.1 haad int msglen, char **buf, int buflen, int *retlen);
112 1.1 haad
113 1.1 haad /* Pre and post command routines are called only on the local node */
114 1.1 haad extern int do_pre_command(struct local_client *client);
115 1.1 haad extern int do_post_command(struct local_client *client);
116 1.1 haad extern void cmd_client_cleanup(struct local_client *client);
117 1.1 haad extern int add_client(struct local_client *new_client);
118 1.1 haad
119 1.1 haad extern void clvmd_cluster_init_completed(void);
120 1.1 haad extern void process_message(struct local_client *client, const char *buf,
121 1.1 haad int len, const char *csid);
122 1.1 haad extern void debuglog(const char *fmt, ... )
123 1.1 haad __attribute__ ((format(printf, 1, 2)));
124 1.1 haad
125 1.1 haad int sync_lock(const char *resource, int mode, int flags, int *lockid);
126 1.1 haad int sync_unlock(const char *resource, int lockid);
127 1.1 haad
128 1.1 haad #endif
129