1c6cf353f2e6a870d614ba7ca8f20bdd97e4fef7
[sahlberg/ctdb.git] / include / ctdb.h
1 /*
2    ctdb database library
3
4    Copyright (C) Ronnie sahlberg 2010
5    Copyright (C) Rusty Russell 2010
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #ifndef _CTDB_H
22 #define _CTDB_H
23 #include <sys/types.h>
24 #include <stdint.h>
25 #include <stdbool.h>
26 #include <stdarg.h>
27 #include <stdio.h>
28 #include <tdb.h>
29 #include <netinet/in.h>
30 #include <ctdb_protocol.h>
31
32 /**
33  * ctdb - a library for accessing tdbs controlled by ctdbd
34  *
35  * ctdbd (clustered tdb daemon) is a daemon designed to syncronize TDB
36  * databases across a cluster.  Using this library, you can communicate with
37  * the daemon to access the databases, pass messages across the cluster, and
38  * control the daemon itself.
39  *
40  * The general API is event-driven and asynchronous: you call the
41  * *_send functions, supplying callbacks, then when the ctdbd file
42  * descriptor is usable, call ctdb_service() to perform read from it
43  * and call your callbacks, which use the *_recv functions to unpack
44  * the replies from ctdbd.
45  *
46  * There is also a synchronous wrapper for each function for trivial
47  * programs; these can be found in the section marked "Synchronous API".
48  */
49
50 /**
51  * ctdb_log_fn_t - logging function for ctdbd
52  * @log_priv: private (typesafe) arg via ctdb_connect
53  * @severity: syslog-style severity
54  * @format: printf-style format string.
55  * @ap: arguments for formatting.
56  *
57  * The severity passed to log() are as per syslog(3).  In particular,
58  * LOG_DEBUG is used for tracing, LOG_WARNING is used for unusual
59  * conditions which don't necessarily return an error through the API,
60  * LOG_ERR is used for errors such as lost communication with ctdbd or
61  * out-of-memory, LOG_ALERT is used for library usage bugs, LOG_CRIT is
62  * used for libctdb internal consistency checks.
63  *
64  * The log() function can be typesafe: the @log_priv arg to
65  * ctdb_donnect and signature of log() should match.
66  */
67 typedef void (*ctdb_log_fn_t)(void *log_priv,
68                               int severity, const char *format, va_list ap);
69
70 /**
71  * ctdb_connect - connect to ctdb using the specified domain socket.
72  * @addr: the socket address, or NULL for default
73  * @log: the logging function
74  * @log_priv: the private argument to the logging function.
75  *
76  * Returns a ctdb context if successful or NULL.  Use ctdb_disconnect() to
77  * release the returned ctdb_connection when finished.
78  *
79  * See Also:
80  *      ctdb_log_fn_t, ctdb_log_file()
81  */
82 struct ctdb_connection *ctdb_connect(const char *addr,
83                                      ctdb_log_fn_t log_fn, void *log_priv);
84
85 /**
86  * ctdb_log_file - example logging function
87  *
88  * Logs everything at priority LOG_WARNING or above to the file given (via
89  * the log_priv argument, usually stderr).
90  */
91 void ctdb_log_file(FILE *, int, const char *, va_list);
92
93 /**
94  * ctdb_log_level - level at which to call logging function
95  *
96  * This variable globally controls filtering on the logging function.
97  * It is initialized to LOG_WARNING, meaning that strange but nonfatal
98  * events, as well as errors and API misuses are reported.
99  *
100  * Set it to LOG_DEBUG to receive all messages.
101  */
102 extern int ctdb_log_level;
103
104 /**
105  * ctdb_disconnect - close down a connection to ctdbd.
106  * @ctdb: the ctdb connectio returned from ctdb_connect.
107  *
108  * The @ctdb arg will be freed by this call, and must not be used again.
109  */
110 void ctdb_disconnect(struct ctdb_connection *ctdb);
111
112 /***
113  *
114  *  Asynchronous API
115  *
116  ***/
117
118 /**
119  * ctdb_get_fd - get the filedescriptor to select/poll on
120  * @ctdb: the ctdb_connection from ctdb_connect.
121  *
122  * By using poll or select on this file descriptor, you will know when to call
123  * ctdb_service().
124  *
125  * See Also:
126  *      ctdb_which_events(), ctdb_service()
127  */
128 int ctdb_get_fd(struct ctdb_connection *ctdb);
129
130 /**
131  * ctdb_which_events - determine which events ctdb_service wants to see
132  * @ctdb: the ctdb_connection from ctdb_connect.
133  *
134  * This returns POLLIN, possibly or'd with POLLOUT if there are writes
135  * pending.  You can set this straight into poll.events.
136  *
137  * See Also:
138  *      ctdb_service()
139  */
140 int ctdb_which_events(struct ctdb_connection *ctdb);
141
142 /**
143  * ctdb_service - service any I/O and callbacks from ctdbd communication
144  * @ctdb: the ctdb_connection from ctdb_connect.
145  * @revents: which events are available.
146  *
147  * This is the core of the library: it read and writes to the ctdbd
148  * socket.  It may call callbacks registered with the various _send
149  * functions.
150  *
151  * revents is a bitset: POLLIN and/or POLLOUT may be set to indicate
152  * it is worth attempting to read/write the (nonblocking)
153  * filedescriptor respectively.
154  *
155  * Note that the synchronous functions call this internally.
156  * Returns false on catastrophic failure.
157  */
158 bool ctdb_service(struct ctdb_connection *ctdb, int revents);
159
160 /**
161  * struct ctdb_request - handle for an outstanding request
162  *
163  * This opaque structure returned from various *_send functions gives
164  * you a handle by which you can cancel a request.  You can't do
165  * anything else with it until the request is completed and it is
166  * handed to your callback function.
167  */
168 struct ctdb_request;
169
170 /**
171  * ctdb_request_free - free a completed request
172  *
173  * This frees a request: you should only call it once it has been
174  * handed to your callback.  For incomplete requests, see ctdb_cancel().
175  */
176 void ctdb_request_free(struct ctdb_connection *ctdb, struct ctdb_request *req);
177
178 /**
179  * ctdb_callback_t - callback for completed requests.
180  *
181  * This would normally unpack the request using ctdb_*_recv().  You
182  * must free the request using ctdb_request_free().
183  *
184  * Note that due to macro magic, actual your callback can be typesafe:
185  * instead of taking a void *, it can take a type which matches the
186  * actual private parameter.
187  */
188 typedef void (*ctdb_callback_t)(struct ctdb_connection *ctdb,
189                                 struct ctdb_request *req, void *private_data);
190
191 /**
192  * struct ctdb_db - connection to a particular open TDB
193  *
194  * This represents a particular open database: you receive it from
195  * ctdb_attachdb or ctdb_attachdb_recv to manipulate a database.
196  *
197  * You have to free the handle with ctdb_detachdb() when finished with it.
198  */
199 struct ctdb_db;
200
201 /**
202  * ctdb_attachdb_send - open a clustered TDB
203  * @ctdb: the ctdb_connection from ctdb_connect.
204  * @name: the filename of the database (no /).
205  * @persistent: whether the database is persistent across ctdbd's life
206  * @tdb_flags: the flags to pass to tdb_open.
207  * @callback: the callback when we're attached or failed (typesafe)
208  * @cbdata: the argument to callback()
209  *
210  * This function connects to a TDB controlled by ctdbd.  It can create
211  * a new TDB if it does not exist, depending on tdb_flags.  Returns
212  * the pending request, or NULL on error.
213  */
214 struct ctdb_request *
215 ctdb_attachdb_send(struct ctdb_connection *ctdb,
216                    const char *name, bool persistent, uint32_t tdb_flags,
217                    ctdb_callback_t callback, void *cbdata);
218
219 /**
220  * ctdb_attachdb_recv - read an ctdb_attach reply from ctdbd
221  * @ctdb: the ctdb_connection from ctdb_connect.
222  * @req: the completed request.
223  *
224  * This returns NULL if something went wrong, or otherwise the open database.
225  */
226 struct ctdb_db *ctdb_attachdb_recv(struct ctdb_connection *ctdb,
227                                    struct ctdb_request *req);
228
229
230 /**
231  * struct ctdb_lock - a record lock on a clustered TDB database
232  *
233  * This locks a subset of the database across the entire cluster; it
234  * is the fundamental sychronization element for ctdb.  You cannot have
235  * more than one lock at once.
236  *
237  * You MUST NOT block during holding this lock and MUST release it
238  * quickly by performing ctdb_release_lock(lock).
239  * Do NOT make any system calls that may block while holding the lock.
240  *
241  * Try to release the lock as quickly as possible.
242  */
243 struct ctdb_lock;
244
245 /**
246  * ctdb_rrl_callback_t - callback for ctdb_readrecordlock_async
247  *
248  * This is not the standard ctdb_callback_t, because there is often no
249  * request required to access a database record (ie. if it is local already).
250  * So the callback is handed the lock directly: it might be NULL if there
251  * was an error obtaining the lock.
252  *
253  * See Also:
254  *      ctdb_readrecordlock_async(), ctdb_readrecordlock()
255  */
256 typedef void (*ctdb_rrl_callback_t)(struct ctdb_db *ctdb_db,
257                                     struct ctdb_lock *lock,
258                                     TDB_DATA data,
259                                     void *private_data);
260
261 /**
262  * ctdb_readrecordlock_async - read and lock a record
263  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
264  * @key: the key of the record to lock.
265  * @callback: the callback once the record is locked (typesafe).
266  * @cbdata: the argument to callback()
267  *
268  * This returns true on success.  Commonly, we can obtain the record
269  * immediately and so the callback will be invoked.  Otherwise a request
270  * will be queued to ctdbd for the record.
271  *
272  * If failure is immediate, false is returned.  Otherwise, the callback
273  * may receive a NULL lock arg to indicate asynchronous failure.
274  */
275 bool ctdb_readrecordlock_async(struct ctdb_db *ctdb_db, TDB_DATA key,
276                                ctdb_rrl_callback_t callback, void *cbdata);
277
278 /**
279  * ctdb_writerecord - write a locked record in a TDB
280  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
281  * @lock: the lock from ctdb_readrecordlock/ctdb_readrecordlock_recv
282  * @data: the new data to place in the record.
283  */
284 bool ctdb_writerecord(struct ctdb_db *ctdb_db,
285                       struct ctdb_lock *lock, TDB_DATA data);
286
287 /**
288  * ctdb_release_lock - release a record lock on a TDB
289  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
290  * @lock: the lock from ctdb_readrecordlock/ctdb_readrecordlock_async
291  */
292 void ctdb_release_lock(struct ctdb_db *ctdb_db, struct ctdb_lock *lock);
293
294 /**
295  * ctdb_message_fn_t - messaging callback for ctdb messages
296  *
297  * ctdbd provides a simple messaging API; you can register for a particular
298  * 64-bit id on which you want to send messages, and send to other ids.
299  *
300  * See Also:
301  *      ctdb_set_message_handler_send()
302  */
303 typedef void (*ctdb_message_fn_t)(struct ctdb_connection *,
304                                   uint64_t srvid, TDB_DATA data, void *);
305
306 /**
307  * ctdb_set_message_handler_send - register for messages to a srvid
308  * @ctdb: the ctdb_connection from ctdb_connect.
309  * @srvid: the 64 bit identifier for our messages.
310  * @handler: the callback when we receive such a message (typesafe)
311  * @handler_data: the argument to handler()
312  * @callback: the callback when ctdb replies to our message (typesafe)
313  * @cbdata: the argument to callback()
314  *
315  * Note: our callback will always be called before handler.
316  *
317  * See Also:
318  *      ctdb_set_message_handler_recv(), ctdb_remove_message_handler_send()
319  */
320 struct ctdb_request *
321 ctdb_set_message_handler_send(struct ctdb_connection *ctdb, uint64_t srvid,
322                               ctdb_message_fn_t handler,
323                               void *handler_data,
324                               ctdb_callback_t callback,
325                               void *cbdata);
326
327 /**
328  * ctdb_set_message_handler_recv - read a set_message_handler result
329  * @ctdb: the ctdb_connection from ctdb_connect.
330  * @req: the completed request
331  *
332  * If this returns true, the registered handler may be called from the next
333  * ctdb_service().  If this returns false, the registration failed.
334  */
335 bool ctdb_set_message_handler_recv(struct ctdb_connection *ctdb,
336                                    struct ctdb_request *handle);
337
338 /**
339  * ctdb_remove_message_handler_send - unregister for messages to a srvid
340  * @ctdb: the ctdb_connection from ctdb_connect.
341  * @srvid: the 64 bit identifier for our messages.
342  * @handler: the callback when we receive such a message (typesafe)
343  * @handler_data: the argument to handler()
344  * @callback: the callback when ctdb replies to our message (typesafe)
345  * @cbdata: the argument to callback()
346  *
347  * This undoes a successful ctdb_set_message_handler or
348  * ctdb_set_message_handler_recv.
349  */
350 struct ctdb_request *
351 ctdb_remove_message_handler_send(struct ctdb_connection *ctdb, uint64_t srvid,
352                                  ctdb_message_fn_t handler, void *handler_data,
353                                  ctdb_callback_t callback, void *cbdata);
354
355 /**
356  * ctdb_remove_message_handler_recv - read a remove_message_handler result
357  * @ctdb: the ctdb_connection from ctdb_connect.
358  * @req: the completed request
359  *
360  * After this returns true, the registered handler will no longer be called.
361  * If this returns false, the de-registration failed.
362  */
363 bool ctdb_remove_message_handler_recv(struct ctdb_connection *ctdb,
364                                       struct ctdb_request *req);
365
366
367 /**
368  * ctdb_send_message - send a message via ctdbd
369  * @ctdb: the ctdb_connection from ctdb_connect.
370  * @pnn: the physical node number to send to
371  * @srvid: the 64 bit identifier for this message type.
372  * @data: the data to send
373  *
374  * This allows arbitrary messages to be sent across the cluster to those
375  * listening (via ctdb_set_message_handler et al).
376  *
377  * This queues a message to be sent: you will need to call
378  * ctdb_service() to actually send the message.  There is no callback
379  * because there is no acknowledgement.
380  *
381  * See Also:
382  *      ctdb_getpnn_send(), ctdb_getpnn()
383  */
384 bool ctdb_send_message(struct ctdb_connection *ctdb, uint32_t pnn, uint64_t srvid, TDB_DATA data);
385
386 /**
387  * ctdb_getpnn_send - read the pnn number of a node.
388  * @ctdb: the ctdb_connection from ctdb_connect.
389  * @destnode: the destination node (see below)
390  * @callback: the callback when ctdb replies to our message (typesafe)
391  * @cbdata: the argument to callback()
392  *
393  * There are several special values for destnode, detailed in
394  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
395  * local ctdbd.
396  */
397 struct ctdb_request *
398 ctdb_getpnn_send(struct ctdb_connection *ctdb,
399                  uint32_t destnode,
400                  ctdb_callback_t callback,
401                  void *cbdata);
402 /**
403  * ctdb_getpnn_recv - read an ctdb_getpnn reply from ctdbd
404  * @ctdb: the ctdb_connection from ctdb_connect.
405  * @req: the completed request.
406  * @pnn: a pointer to the pnn to fill in
407  *
408  * This returns false if something went wrong, or otherwise fills in pnn.
409  */
410 bool ctdb_getpnn_recv(struct ctdb_connection *ctdb,
411                       struct ctdb_request *req, uint32_t *pnn);
412
413
414 /**
415  * ctdb_getnodemap_send - read the nodemap number from a node.
416  * @ctdb: the ctdb_connection from ctdb_connect.
417  * @destnode: the destination node (see below)
418  * @callback: the callback when ctdb replies to our message (typesafe)
419  * @cbdata: the argument to callback()
420  *
421  * There are several special values for destnode, detailed in
422  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
423  * local ctdbd.
424  */
425 struct ctdb_request *
426 ctdb_getnodemap_send(struct ctdb_connection *ctdb,
427                  uint32_t destnode,
428                  ctdb_callback_t callback,
429                  void *cbdata);
430 /**
431  * ctdb_getnodemap_recv - read an ctdb_getnodemap reply from ctdbd
432  * @ctdb: the ctdb_connection from ctdb_connect.
433  * @req: the completed request.
434  * @nodemap: a pointer to the returned nodemap structure
435  *
436  * This returns false if something went wrong.
437  * If the command failed, it guarantees to set nodemap to NULL.
438  * A non-NULL value for nodemap means the command was successful.
439  *
440  * A non-NULL value of the nodemap must be release released/freed
441  * by ctdb_free_nodemap().
442  */
443 bool ctdb_getnodemap_recv(struct ctdb_connection *ctdb,
444                       struct ctdb_request *req, struct ctdb_node_map **nodemap);
445
446 /**
447  * ctdb_getpublicips_send - read the public ip list from a node.
448  * @ctdb: the ctdb_connection from ctdb_connect.
449  * @destnode: the destination node (see below)
450  * @callback: the callback when ctdb replies to our message (typesafe)
451  * @cbdata: the argument to callback()
452  *
453  * This control returns the list of public ips known to the local node.
454  * Deamons only know about those ips that are listed in the local
455  * public addresses file, which means the returned list of ips may
456  * be only a subset of all ips across the entire cluster.
457  *
458  * There are several special values for destnode, detailed in
459  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
460  * local ctdbd.
461  */
462 struct ctdb_request *
463 ctdb_getpublicips_send(struct ctdb_connection *ctdb,
464                  uint32_t destnode,
465                  ctdb_callback_t callback,
466                  void *cbdata);
467 /**
468  * ctdb_getpublicips_recv - read the public ip list from a node
469  * @ctdb: the ctdb_connection from ctdb_connect.
470  * @req: the completed request.
471  * @ips: a pointer to the returned public ip list
472  *
473  * This returns false if something went wrong.
474  * If the command failed, it guarantees to set ips to NULL.
475  * A non-NULL value for nodemap means the command was successful.
476  *
477  * A non-NULL value of the nodemap must be release released/freed
478  * by ctdb_free_publicips().
479  */
480 bool ctdb_getpublicips_recv(struct ctdb_connection *ctdb,
481                       struct ctdb_request *req, struct ctdb_all_public_ips **ips);
482
483 /**
484  * ctdb_getrecmaster_send - read the recovery master of a node
485  * @ctdb: the ctdb_connection from ctdb_connect.
486  * @destnode: the destination node (see below)
487  * @callback: the callback when ctdb replies to our message (typesafe)
488  * @cbdata: the argument to callback()
489  *
490  * There are several special values for destnode, detailed in
491  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
492  * local ctdbd.
493  */
494 struct ctdb_request *
495 ctdb_getrecmaster_send(struct ctdb_connection *ctdb,
496                         uint32_t destnode,
497                         ctdb_callback_t callback, void *cbdata);
498
499 /**
500  * ctdb_getrecmaster_recv - read an ctdb_getrecmaster reply from ctdbd
501  * @ctdb: the ctdb_connection from ctdb_connect.
502  * @req: the completed request.
503  * @recmaster: a pointer to the recmaster to fill in
504  *
505  * This returns false if something went wrong, or otherwise fills in
506  * recmaster.
507  */
508 bool ctdb_getrecmaster_recv(struct ctdb_connection *ctdb,
509                             struct ctdb_request *handle,
510                             uint32_t *recmaster);
511
512 /**
513  * ctdb_cancel - cancel an uncompleted request
514  * @ctdb: the ctdb_connection from ctdb_connect.
515  * @req: the uncompleted request.
516  *
517  * This cancels a request, returning true.  You may not cancel a
518  * request which has already been completed (ie. once its callback has
519  * been called); you should simply use ctdb_request_free() in that case.
520  */
521 void ctdb_cancel(struct ctdb_connection *ctdb, struct ctdb_request *req);
522
523 /***
524  *
525  *  Synchronous API
526  *
527  ***/
528
529 /**
530  * ctdb_attachdb - open a clustered TDB (synchronous)
531  * @ctdb: the ctdb_connection from ctdb_connect.
532  * @name: the filename of the database (no /).
533  * @persistent: whether the database is persistent across ctdbd's life
534  * @tdb_flags: the flags to pass to tdb_open.
535  *
536  * Do a ctdb_attachdb_send and wait for it to complete.
537  * Returns NULL on failure.
538  */
539 struct ctdb_db *ctdb_attachdb(struct ctdb_connection *ctdb,
540                               const char *name, bool persistent,
541                               uint32_t tdb_flags);
542
543 /**
544  * ctdb_detachdb - close a clustered TDB.
545  * @ctdb: the ctdb_connection from ctdb_connect.
546  * @db: the database from ctdb_attachdb/ctdb_attachdb_send
547  *
548  * Closes a clustered tdb.
549  */
550 void ctdb_detachdb(struct ctdb_connection *ctdb, struct ctdb_db *db);
551
552 /**
553  * ctdb_readrecordlock - read and lock a record (synchronous)
554  * @ctdb: the ctdb_connection from ctdb_connect.
555  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
556  * @key: the key of the record to lock.
557  * @req: a pointer to the request, if one is needed.
558  *
559  * Do a ctdb_readrecordlock_send and wait for it to complete.
560  * Returns NULL on failure.
561  */
562 struct ctdb_lock *ctdb_readrecordlock(struct ctdb_connection *ctdb,
563                                       struct ctdb_db *ctdb_db, TDB_DATA key,
564                                       TDB_DATA *data);
565
566
567 /**
568  * ctdb_set_message_handler - register for messages to a srvid (synchronous)
569  * @ctdb: the ctdb_connection from ctdb_connect.
570  * @srvid: the 64 bit identifier for our messages.
571  * @handler: the callback when we receive such a message (typesafe)
572  * @cbdata: the argument to handler()
573  *
574  * If this returns true, the message handler can be called from any
575  * ctdb_service() (which is also called indirectly by other
576  * synchronous functions).  If this returns false, the registration
577  * failed.
578  */
579 bool ctdb_set_message_handler(struct ctdb_connection *ctdb, uint64_t srvid,
580                               ctdb_message_fn_t handler, void *cbdata);
581
582
583 /**
584  * ctdb_remove_message_handler - deregister for messages (synchronous)
585  * @ctdb: the ctdb_connection from ctdb_connect.
586  * @srvid: the 64 bit identifier for our messages.
587  * @handler: the callback when we receive such a message (typesafe)
588  * @handler_data: the argument to handler()
589  *
590  * If this returns true, the message handler will no longer be called.
591  * If this returns false, the deregistration failed.
592  */
593 bool ctdb_remove_message_handler(struct ctdb_connection *ctdb, uint64_t srvid,
594                                  ctdb_message_fn_t handler, void *handler_data);
595
596 /**
597  * ctdb_getpnn - read the pnn number of a node (synchronous)
598  * @ctdb: the ctdb_connection from ctdb_connect.
599  * @destnode: the destination node (see below)
600  * @pnn: a pointer to the pnn to fill in
601  *
602  * There are several special values for destnode, detailed in
603  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
604  * local ctdbd.
605  *
606  * Returns true and fills in *pnn on success.
607  */
608 bool ctdb_getpnn(struct ctdb_connection *ctdb,
609                  uint32_t destnode,
610                  uint32_t *pnn);
611
612 /**
613  * ctdb_getrecmaster - read the recovery master of a node (synchronous)
614  * @ctdb: the ctdb_connection from ctdb_connect.
615  * @destnode: the destination node (see below)
616  * @recmaster: a pointer to the recmaster to fill in
617  *
618  * There are several special values for destnode, detailed in
619  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
620  * local ctdbd.
621  *
622  * Returns true and fills in *recmaster on success.
623  */
624 bool ctdb_getrecmaster(struct ctdb_connection *ctdb,
625                        uint32_t destnode,
626                        uint32_t *recmaster);
627
628
629 /**
630  * ctdb_getnodemap - read the nodemap from a node (synchronous)
631  * @ctdb: the ctdb_connection from ctdb_connect.
632  * @destnode: the destination node (see below)
633  * @nodemap: a pointer to the nodemap to fill in
634  *
635  * There are several special values for destnode, detailed in
636  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
637  * local ctdbd.
638  *
639  * Returns true and fills in *nodemap on success.
640  * A non-NULL nodemap must be freed by calling ctdb_free_nodemap.
641  */
642 bool ctdb_getnodemap(struct ctdb_connection *ctdb,
643                      uint32_t destnode, struct ctdb_node_map **nodemap);
644
645 /*
646  * This function is used to release/free the nodemap structure returned
647  * by ctdb_getnodemap() and ctdb_getnodemap_recv()
648  */
649 void ctdb_free_nodemap(struct ctdb_node_map *nodemap);
650
651
652 /**
653  * ctdb_getpublicips - read the public ip list from a node.
654  * @ctdb: the ctdb_connection from ctdb_connect.
655  * @destnode: the destination node (see below)
656  * @ips: a pointer to the returned public ip list
657  *
658  * This control returns the list of public ips known to the local node.
659  * Deamons only know about those ips that are listed in the local
660  * public addresses file, which means the returned list of ips may
661  * be only a subset of all ips across the entire cluster.
662  *
663  * There are several special values for destnode, detailed in
664  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
665  * local ctdbd.
666  *
667  * This returns false if something went wrong.
668  * If the command failed, it guarantees to set ips to NULL.
669  * A non-NULL value for nodemap means the command was successful.
670  *
671  * A non-NULL value of the nodemap must be release released/freed
672  * by ctdb_free_publicips().
673  */
674 bool ctdb_getpublicips(struct ctdb_connection *ctdb,
675                      uint32_t destnode, struct ctdb_all_public_ips **ips);
676
677 /*
678  * This function is used to release/free the public ip structure returned
679  * by ctdb_getpublicips() and ctdb_getpublicips_recv()
680  */
681 void ctdb_free_publicips(struct ctdb_all_public_ips *ips);
682
683
684 /* These ugly macro wrappers make the callbacks typesafe. */
685 #include <ctdb_typesafe_cb.h>
686 #define ctdb_sendcb(cb, cbdata)                                         \
687          typesafe_cb_preargs(void, (cb), (cbdata),                      \
688                              struct ctdb_connection *, struct ctdb_request *)
689
690 #define ctdb_msgcb(cb, cbdata)                                          \
691         typesafe_cb_preargs(void, (cb), (cbdata),                       \
692                             struct ctdb_connection *, uint64_t, TDB_DATA)
693
694 #define ctdb_connect(addr, log, logpriv)                                \
695         ctdb_connect((addr),                                            \
696                      typesafe_cb_postargs(void, (log), (logpriv),       \
697                                           int, const char *, va_list),  \
698                      (logpriv))
699
700 #define ctdb_set_message_handler(ctdb, srvid, handler, hdata)           \
701         ctdb_set_message_handler((ctdb), (srvid),                       \
702                                  ctdb_msgcb((handler), (hdata)), (hdata))
703
704 #define ctdb_remove_message_handler(ctdb, srvid, handler, hdata)        \
705         ctdb_remove_message_handler((ctdb), (srvid),                    \
706                                     ctdb_msgcb((handler), (hdata)), (hdata))
707
708 #define ctdb_attachdb_send(ctdb, name, persistent, tdb_flags, cb, cbdata) \
709         ctdb_attachdb_send((ctdb), (name), (persistent), (tdb_flags),   \
710                            ctdb_sendcb((cb), (cbdata)), (cbdata))
711
712 #define ctdb_readrecordlock_async(_ctdb_db, key, cb, cbdata)            \
713         ctdb_readrecordlock_async((_ctdb_db), (key),                    \
714                 typesafe_cb_preargs(void, (cb), (cbdata),               \
715                                     struct ctdb_db *, struct ctdb_lock *, \
716                                     TDB_DATA), (cbdata))
717
718 #define ctdb_set_message_handler_send(ctdb, srvid, handler, hdata, cb, cbdata) \
719         ctdb_set_message_handler_send((ctdb), (srvid),                  \
720                                       ctdb_msgcb((handler), (hdata)), (hdata), \
721                                       ctdb_sendcb((cb), (cbdata)), (cbdata))
722
723 #define ctdb_remove_message_handler_send(ctdb, srvid, handler, hdata, cb, cbdata) \
724         ctdb_remove_message_handler_send((ctdb), (srvid),               \
725               ctdb_msgcb((handler), (hdata)), (hdata),                  \
726               ctdb_sendcb((cb), (cbdata)), (cbdata))
727
728 #define ctdb_getpnn_send(ctdb, destnode, cb, cbdata)                    \
729         ctdb_getpnn_send((ctdb), (destnode),                            \
730                          ctdb_sendcb((cb), (cbdata)), (cbdata))
731
732 #define ctdb_getrecmaster_send(ctdb, destnode, cb, cbdata)              \
733         ctdb_getrecmaster_send((ctdb), (destnode),                      \
734                                ctdb_sendcb((cb), (cbdata)), (cbdata))
735
736 #define ctdb_getnodemap_send(ctdb, destnode, cb, cbdata)                \
737         ctdb_getnodemap_send((ctdb), (destnode),                        \
738                          ctdb_sendcb((cb), (cbdata)), (cbdata))
739
740 #define ctdb_getpublicips_send(ctdb, destnode, cb, cbdata)              \
741         ctdb_getpublicips_send((ctdb), (destnode),                      \
742                          ctdb_sendcb((cb), (cbdata)), (cbdata))
743
744 #endif