merge status code changes from samba4 ctdb
[vlendec/samba-autobuild/.git] / ctdb / include / ctdb_private.h
1 /* 
2    ctdb database library
3
4    Copyright (C) Andrew Tridgell  2006
5
6    This library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2 of the License, or (at your option) any later version.
10
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with this library; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #ifndef _CTDB_PRIVATE_H
22 #define _CTDB_PRIVATE_H
23
24 #include "ctdb.h"
25
26 /*
27   an installed ctdb remote call
28 */
29 struct ctdb_registered_call {
30         struct ctdb_registered_call *next, *prev;
31         uint32_t id;
32         ctdb_fn_t fn;
33 };
34
35 /*
36   this address structure might need to be generalised later for some
37   transports
38 */
39 struct ctdb_address {
40         const char *address;
41         int port;
42 };
43
44 /*
45   state associated with one node
46 */
47 struct ctdb_node {
48         struct ctdb_context *ctdb;
49         struct ctdb_address address;
50         const char *name; /* for debug messages */
51         void *private; /* private to transport */
52         uint32_t vnn;
53 };
54
55 /*
56   transport specific methods
57 */
58 struct ctdb_methods {
59         int (*start)(struct ctdb_context *); /* start protocol processing */    
60         int (*add_node)(struct ctdb_node *); /* setup a new node */     
61         int (*queue_pkt)(struct ctdb_node *, uint8_t *data, uint32_t length);
62         void *(*allocate_pkt)(struct ctdb_context *, size_t );
63 };
64
65 /*
66   transport calls up to the ctdb layer
67 */
68 struct ctdb_upcalls {
69         /* recv_pkt is called when a packet comes in */
70         void (*recv_pkt)(struct ctdb_context *, uint8_t *data, uint32_t length);
71
72         /* node_dead is called when an attempt to send to a node fails */
73         void (*node_dead)(struct ctdb_node *);
74
75         /* node_connected is called when a connection to a node is established */
76         void (*node_connected)(struct ctdb_node *);
77 };
78
79 /* main state of the ctdb daemon */
80 struct ctdb_context {
81         struct event_context *ev;
82         struct ctdb_address address;
83         const char *name;
84         uint32_t vnn; /* our own vnn */
85         uint32_t num_nodes;
86         uint32_t num_connected;
87         unsigned flags;
88         struct idr_context *idr;
89         struct ctdb_node **nodes; /* array of nodes in the cluster - indexed by vnn */
90         struct ctdb_registered_call *calls; /* list of registered calls */
91         char *err_msg;
92         struct tdb_wrap *ltdb;
93         const struct ctdb_methods *methods; /* transport methods */
94         const struct ctdb_upcalls *upcalls; /* transport upcalls */
95         void *private; /* private to transport */
96         unsigned max_lacount;
97 };
98
99 #define CTDB_NO_MEMORY(ctdb, p) do { if (!(p)) { \
100           ctdb_set_error(ctdb, "Out of memory at %s:%d", __FILE__, __LINE__); \
101           return -1; }} while (0)
102
103 #define CTDB_NO_MEMORY_NULL(ctdb, p) do { if (!(p)) { \
104           ctdb_set_error(ctdb, "Out of memory at %s:%d", __FILE__, __LINE__); \
105           return NULL; }} while (0)
106
107 #define CTDB_NO_MEMORY_FATAL(ctdb, p) do { if (!(p)) { \
108           ctdb_fatal(ctdb, "Out of memory in " __location__ ); \
109           }} while (0)
110
111 /* arbitrary maximum timeout for ctdb operations */
112 #define CTDB_REQ_TIMEOUT 10
113
114 /* max number of redirects before we ask the lmaster */
115 #define CTDB_MAX_REDIRECT 2
116
117 /* number of consecutive calls from the same node before we give them
118    the record */
119 #define CTDB_DEFAULT_MAX_LACOUNT 7
120
121 /*
122   the extended header for records in the ltdb
123 */
124 struct ctdb_ltdb_header {
125         uint64_t rsn;
126         uint32_t dmaster;
127         uint32_t laccessor;
128         uint32_t lacount;
129 };
130
131
132 /*
133   operation IDs
134 */
135 enum ctdb_operation {
136         CTDB_REQ_CALL       = 0,
137         CTDB_REPLY_CALL     = 1,
138         CTDB_REPLY_REDIRECT = 2,
139         CTDB_REQ_DMASTER    = 3,
140         CTDB_REPLY_DMASTER  = 4,
141         CTDB_REPLY_ERROR    = 5
142 };
143
144 /*
145   packet structures
146 */
147 struct ctdb_req_header {
148         uint32_t length;
149         uint32_t operation;
150         uint32_t destnode;
151         uint32_t srcnode;
152         uint32_t reqid;
153 };
154
155 struct ctdb_req_call {
156         struct ctdb_req_header hdr;
157         uint32_t callid;
158         uint32_t keylen;
159         uint32_t calldatalen;
160         uint8_t data[1]; /* key[] followed by calldata[] */
161 };
162
163 struct ctdb_reply_call {
164         struct ctdb_req_header hdr;
165         uint32_t status;
166         uint32_t datalen;
167         uint8_t  data[1];
168 };
169
170 struct ctdb_reply_error {
171         struct ctdb_req_header hdr;
172         uint32_t status;
173         uint32_t msglen;
174         uint8_t  msg[1];
175 };
176
177 struct ctdb_reply_redirect {
178         struct ctdb_req_header hdr;
179         uint32_t dmaster;
180 };
181
182 struct ctdb_req_dmaster {
183         struct ctdb_req_header hdr;
184         uint32_t dmaster;
185         uint32_t keylen;
186         uint32_t datalen;
187         uint8_t  data[1];
188 };
189
190 struct ctdb_reply_dmaster {
191         struct ctdb_req_header hdr;
192         uint32_t datalen;
193         uint8_t  data[1];
194 };
195
196 /* internal prototypes */
197 void ctdb_set_error(struct ctdb_context *ctdb, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
198 void ctdb_fatal(struct ctdb_context *ctdb, const char *msg);
199 bool ctdb_same_address(struct ctdb_address *a1, struct ctdb_address *a2);
200 int ctdb_parse_address(struct ctdb_context *ctdb,
201                        TALLOC_CTX *mem_ctx, const char *str,
202                        struct ctdb_address *address);
203 uint32_t ctdb_hash(const TDB_DATA *key);
204 void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
205 void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
206 void ctdb_reply_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
207 void ctdb_reply_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
208 void ctdb_reply_error(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
209 void ctdb_reply_redirect(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
210
211 uint32_t ctdb_lmaster(struct ctdb_context *ctdb, const TDB_DATA *key);
212 int ctdb_ltdb_fetch(struct ctdb_context *ctdb, 
213                     TDB_DATA key, struct ctdb_ltdb_header *header, TDB_DATA *data);
214 int ctdb_ltdb_store(struct ctdb_context *ctdb, TDB_DATA key, 
215                     struct ctdb_ltdb_header *header, TDB_DATA data);
216
217
218 #endif