43ab192c0feeffa213046b76db0c3a21016bf4fd
[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_num_active - get the number of active commands
120  * @ctdb: the ctdb_connection from ctdb_connect.
121  *
122  * This command can be used to find the number of active commands we have
123  * issued. An active command is a command we have queued, or sent
124  * to the ctdb daemon but which we have not yet received a reply to.
125  *
126  * See Also:
127  *      ctdb_num_in_flight(), ctdb_num_out_queue()
128  */
129 int ctdb_num_active(struct ctdb_connection *ctdb);
130
131 /**
132  * ctdb_num_in_flight - get the number of commands in flight.
133  * @ctdb: the ctdb_connection from ctdb_connect.
134  *
135  * This command can be used to find the number of commands we have
136  * sent to the ctdb daemon to which we have not yet received/processed
137  * the reply.
138  *
139  * See Also:
140  *      ctdb_num_out_queue(), ctdb_num_active()
141  */
142 int ctdb_num_in_flight(struct ctdb_connection *ctdb);
143
144 /**
145  * ctdb_num_out_queue - get the number of commands in the out queue
146  * @ctdb: the ctdb_connection from ctdb_connect.
147  *
148  * This command can be used to find the number of commands we have
149  * queued for delivery to the ctdb daemon but have not yet been
150  * written to the domain socket.
151  *
152  * See Also:
153  *      ctdb_num_in_flight(), ctdb_num_active()
154  */
155 int ctdb_num_out_queue(struct ctdb_connection *ctdb);
156
157 /**
158  * ctdb_get_fd - get the filedescriptor to select/poll on
159  * @ctdb: the ctdb_connection from ctdb_connect.
160  *
161  * By using poll or select on this file descriptor, you will know when to call
162  * ctdb_service().
163  *
164  * See Also:
165  *      ctdb_which_events(), ctdb_service()
166  */
167 int ctdb_get_fd(struct ctdb_connection *ctdb);
168
169 /**
170  * ctdb_which_events - determine which events ctdb_service wants to see
171  * @ctdb: the ctdb_connection from ctdb_connect.
172  *
173  * This returns POLLIN, possibly or'd with POLLOUT if there are writes
174  * pending.  You can set this straight into poll.events.
175  *
176  * See Also:
177  *      ctdb_service()
178  */
179 int ctdb_which_events(struct ctdb_connection *ctdb);
180
181 /**
182  * ctdb_service - service any I/O and callbacks from ctdbd communication
183  * @ctdb: the ctdb_connection from ctdb_connect.
184  * @revents: which events are available.
185  *
186  * This is the core of the library: it read and writes to the ctdbd
187  * socket.  It may call callbacks registered with the various _send
188  * functions.
189  *
190  * revents is a bitset: POLLIN and/or POLLOUT may be set to indicate
191  * it is worth attempting to read/write the (nonblocking)
192  * filedescriptor respectively.
193  *
194  * Note that the synchronous functions call this internally.
195  * Returns false on catastrophic failure.
196  */
197 bool ctdb_service(struct ctdb_connection *ctdb, int revents);
198
199 /**
200  * struct ctdb_request - handle for an outstanding request
201  *
202  * This opaque structure returned from various *_send functions gives
203  * you a handle by which you can cancel a request.  You can't do
204  * anything else with it until the request is completed and it is
205  * handed to your callback function.
206  */
207 struct ctdb_request;
208
209 /**
210  * ctdb_request_free - free a completed request
211  *
212  * This frees a request: you should only call it once it has been
213  * handed to your callback.  For incomplete requests, see ctdb_cancel().
214  */
215 void ctdb_request_free(struct ctdb_request *req);
216
217 /**
218  * ctdb_callback_t - callback for completed requests.
219  *
220  * This would normally unpack the request using ctdb_*_recv().  You
221  * must free the request using ctdb_request_free().
222  *
223  * Note that due to macro magic, actual your callback can be typesafe:
224  * instead of taking a void *, it can take a type which matches the
225  * actual private parameter.
226  */
227 typedef void (*ctdb_callback_t)(struct ctdb_connection *ctdb,
228                                 struct ctdb_request *req, void *private_data);
229
230 /**
231  * struct ctdb_db - connection to a particular open TDB
232  *
233  * This represents a particular open database: you receive it from
234  * ctdb_attachdb or ctdb_attachdb_recv to manipulate a database.
235  *
236  * You have to free the handle with ctdb_detachdb() when finished with it.
237  */
238 struct ctdb_db;
239
240 /**
241  * ctdb_attachdb_send - open a clustered TDB
242  * @ctdb: the ctdb_connection from ctdb_connect.
243  * @name: the filename of the database (no /).
244  * @persistent: whether the database is persistent across ctdbd's life
245  * @tdb_flags: the flags to pass to tdb_open.
246  * @callback: the callback when we're attached or failed (typesafe)
247  * @cbdata: the argument to callback()
248  *
249  * This function connects to a TDB controlled by ctdbd.  It can create
250  * a new TDB if it does not exist, depending on tdb_flags.  Returns
251  * the pending request, or NULL on error.
252  */
253 struct ctdb_request *
254 ctdb_attachdb_send(struct ctdb_connection *ctdb,
255                    const char *name, bool persistent, uint32_t tdb_flags,
256                    ctdb_callback_t callback, void *cbdata);
257
258 /**
259  * ctdb_attachdb_recv - read an ctdb_attach reply from ctdbd
260  * @ctdb: the ctdb_connection from ctdb_connect.
261  * @req: the completed request.
262  *
263  * This returns NULL if something went wrong, or otherwise the open database.
264  */
265 struct ctdb_db *ctdb_attachdb_recv(struct ctdb_connection *ctdb,
266                                    struct ctdb_request *req);
267
268
269 /**
270  * struct ctdb_lock - a record lock on a clustered TDB database
271  *
272  * This locks a subset of the database across the entire cluster; it
273  * is the fundamental sychronization element for ctdb.  You cannot have
274  * more than one lock at once.
275  *
276  * You MUST NOT block during holding this lock and MUST release it
277  * quickly by performing ctdb_release_lock(lock).
278  * Do NOT make any system calls that may block while holding the lock.
279  *
280  * Try to release the lock as quickly as possible.
281  */
282 struct ctdb_lock;
283
284 /**
285  * ctdb_rrl_callback_t - callback for ctdb_readrecordlock_async
286  *
287  * This is not the standard ctdb_callback_t, because there is often no
288  * request required to access a database record (ie. if it is local already).
289  * So the callback is handed the lock directly: it might be NULL if there
290  * was an error obtaining the lock.
291  *
292  * See Also:
293  *      ctdb_readrecordlock_async(), ctdb_readrecordlock()
294  */
295 typedef void (*ctdb_rrl_callback_t)(struct ctdb_db *ctdb_db,
296                                     struct ctdb_lock *lock,
297                                     TDB_DATA data,
298                                     void *private_data);
299
300 /**
301  * ctdb_readrecordlock_async - read and lock a record
302  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
303  * @key: the key of the record to lock.
304  * @callback: the callback once the record is locked (typesafe).
305  * @cbdata: the argument to callback()
306  *
307  * This returns true on success.  Commonly, we can obtain the record
308  * immediately and so the callback will be invoked.  Otherwise a request
309  * will be queued to ctdbd for the record.
310  *
311  * If failure is immediate, false is returned.  Otherwise, the callback
312  * may receive a NULL lock arg to indicate asynchronous failure.
313  */
314 bool ctdb_readrecordlock_async(struct ctdb_db *ctdb_db, TDB_DATA key,
315                                ctdb_rrl_callback_t callback, void *cbdata);
316
317 /**
318  * ctdb_readonlyrecordlock_async - read and lock a record for read-only access
319  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
320  * @key: the key of the record to lock.
321  * @callback: the callback once the record is locked (typesafe).
322  * @cbdata: the argument to callback()
323  *
324  * This returns true on success.  Commonly, we can obtain the record
325  * immediately and so the callback will be invoked.  Otherwise a request
326  * will be queued to ctdbd for the record.
327  *
328  * If failure is immediate, false is returned.  Otherwise, the callback
329  * may receive a NULL lock arg to indicate asynchronous failure.
330  */
331 bool ctdb_readonlyrecordlock_async(struct ctdb_db *ctdb_db, TDB_DATA key,
332                                ctdb_rrl_callback_t callback, void *cbdata);
333
334
335 /**
336  * ctdb_writerecord - write a locked record in a TDB
337  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
338  * @lock: the lock from ctdb_readrecordlock/ctdb_readrecordlock_recv
339  * @data: the new data to place in the record.
340  */
341 bool ctdb_writerecord(struct ctdb_db *ctdb_db,
342                       struct ctdb_lock *lock, TDB_DATA data);
343
344 /**
345  * ctdb_release_lock - release a record lock on a TDB
346  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
347  * @lock: the lock from ctdb_readrecordlock/ctdb_readrecordlock_async
348  */
349 void ctdb_release_lock(struct ctdb_db *ctdb_db, struct ctdb_lock *lock);
350
351
352
353 /**
354  * ctdb_traverse_callback_t - callback for ctdb_traverse_async.
355  * return 0 - to continue traverse
356  * return 1 - to abort the traverse
357  *
358  * See Also:
359  *      ctdb_traverse_async()
360  */
361 #define TRAVERSE_STATUS_RECORD          0
362 #define TRAVERSE_STATUS_FINISHED        1
363 #define TRAVERSE_STATUS_ERROR           2
364 typedef int (*ctdb_traverse_callback_t)(struct ctdb_connection *ctdb,
365                                     struct ctdb_db *ctdb_db,
366                                     int status,
367                                     TDB_DATA key,
368                                     TDB_DATA data,
369                                     void *private_data);
370
371 /**
372  * ctdb_traverse_async - traverse a database.
373  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
374  * @callback: the callback once the record is locked (typesafe).
375  * @cbdata: the argument to callback()
376  *
377  * This returns true on success.
378  * when successfull, the callback will be invoked for each record
379  * until the traversal is finished.
380  *
381  * status == 
382  * TRAVERSE_STATUS_RECORD         key/data contains a record.
383  * TRAVERSE_STATUS_FINISHED       traverse is finished. key/data is undefined.
384  * TRAVERSE_STATUS_ERROR          an error occured during traverse.
385  *                                key/data is undefined.
386  *
387  * If failure is immediate, false is returned.
388  */
389 bool ctdb_traverse_async(struct ctdb_db *ctdb_db,
390                          ctdb_traverse_callback_t callback, void *cbdata);
391
392 /**
393  * ctdb_message_fn_t - messaging callback for ctdb messages
394  *
395  * ctdbd provides a simple messaging API; you can register for a particular
396  * 64-bit id on which you want to send messages, and send to other ids.
397  *
398  * See Also:
399  *      ctdb_set_message_handler_send()
400  */
401 typedef void (*ctdb_message_fn_t)(struct ctdb_connection *,
402                                   uint64_t srvid, TDB_DATA data, void *);
403
404 /**
405  * ctdb_set_message_handler_send - register for messages to a srvid
406  * @ctdb: the ctdb_connection from ctdb_connect.
407  * @srvid: the 64 bit identifier for our messages.
408  * @handler: the callback when we receive such a message (typesafe)
409  * @handler_data: the argument to handler()
410  * @callback: the callback when ctdb replies to our message (typesafe)
411  * @cbdata: the argument to callback()
412  *
413  * Note: our callback will always be called before handler.
414  *
415  * See Also:
416  *      ctdb_set_message_handler_recv(), ctdb_remove_message_handler_send()
417  */
418 struct ctdb_request *
419 ctdb_set_message_handler_send(struct ctdb_connection *ctdb, uint64_t srvid,
420                               ctdb_message_fn_t handler,
421                               void *handler_data,
422                               ctdb_callback_t callback,
423                               void *cbdata);
424
425 /**
426  * ctdb_set_message_handler_recv - read a set_message_handler result
427  * @ctdb: the ctdb_connection from ctdb_connect.
428  * @req: the completed request
429  *
430  * If this returns true, the registered handler may be called from the next
431  * ctdb_service().  If this returns false, the registration failed.
432  */
433 bool ctdb_set_message_handler_recv(struct ctdb_connection *ctdb,
434                                    struct ctdb_request *handle);
435
436 /**
437  * ctdb_remove_message_handler_send - unregister for messages to a srvid
438  * @ctdb: the ctdb_connection from ctdb_connect.
439  * @srvid: the 64 bit identifier for our messages.
440  * @handler: the callback when we receive such a message (typesafe)
441  * @handler_data: the argument to handler()
442  * @callback: the callback when ctdb replies to our message (typesafe)
443  * @cbdata: the argument to callback()
444  *
445  * This undoes a successful ctdb_set_message_handler or
446  * ctdb_set_message_handler_recv.
447  */
448 struct ctdb_request *
449 ctdb_remove_message_handler_send(struct ctdb_connection *ctdb, uint64_t srvid,
450                                  ctdb_message_fn_t handler, void *handler_data,
451                                  ctdb_callback_t callback, void *cbdata);
452
453 /**
454  * ctdb_remove_message_handler_recv - read a remove_message_handler result
455  * @ctdb: the ctdb_connection from ctdb_connect.
456  * @req: the completed request
457  *
458  * After this returns true, the registered handler will no longer be called.
459  * If this returns false, the de-registration failed.
460  */
461 bool ctdb_remove_message_handler_recv(struct ctdb_connection *ctdb,
462                                       struct ctdb_request *req);
463
464
465 /**
466  * ctdb_send_message - send a message via ctdbd
467  * @ctdb: the ctdb_connection from ctdb_connect.
468  * @pnn: the physical node number to send to
469  * @srvid: the 64 bit identifier for this message type.
470  * @data: the data to send
471  *
472  * This allows arbitrary messages to be sent across the cluster to those
473  * listening (via ctdb_set_message_handler et al).
474  *
475  * This queues a message to be sent: you will need to call
476  * ctdb_service() to actually send the message.  There is no callback
477  * because there is no acknowledgement.
478  *
479  * See Also:
480  *      ctdb_getpnn_send(), ctdb_getpnn()
481  */
482 bool ctdb_send_message(struct ctdb_connection *ctdb, uint32_t pnn, uint64_t srvid, TDB_DATA data);
483
484 /**
485  * ctdb_getpnn_send - read the pnn number of a node.
486  * @ctdb: the ctdb_connection from ctdb_connect.
487  * @destnode: the destination node (see below)
488  * @callback: the callback when ctdb replies to our message (typesafe)
489  * @cbdata: the argument to callback()
490  *
491  * There are several special values for destnode, detailed in
492  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
493  * local ctdbd.
494  */
495 struct ctdb_request *
496 ctdb_getpnn_send(struct ctdb_connection *ctdb,
497                  uint32_t destnode,
498                  ctdb_callback_t callback,
499                  void *cbdata);
500 /**
501  * ctdb_getpnn_recv - read an ctdb_getpnn reply from ctdbd
502  * @ctdb: the ctdb_connection from ctdb_connect.
503  * @req: the completed request.
504  * @pnn: a pointer to the pnn to fill in
505  *
506  * This returns false if something went wrong, or otherwise fills in pnn.
507  */
508 bool ctdb_getpnn_recv(struct ctdb_connection *ctdb,
509                       struct ctdb_request *req, uint32_t *pnn);
510
511
512 /**
513  * ctdb_getdbseqnum_send - read the sequence number off a db
514  * @ctdb: the ctdb_connection from ctdb_connect.
515  * @destnode: the destination node (see below)
516  * @dbid: database id
517  * @callback: the callback when ctdb replies to our message (typesafe)
518  * @cbdata: the argument to callback()
519  *
520  * There are several special values for destnode, detailed in
521  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
522  * local ctdbd.
523  */
524 struct ctdb_request *
525 ctdb_getdbseqnum_send(struct ctdb_connection *ctdb,
526                  uint32_t destnode,
527                  uint32_t dbid,
528                  ctdb_callback_t callback,
529                  void *cbdata);
530 /**
531  * ctdb_getdbseqnum_recv - read the sequence number off a database
532  * @ctdb: the ctdb_connection from ctdb_connect.
533  * @req: the completed request.
534  * @seqnum: a pointer to the seqnum to fill in
535  *
536  * This returns false if something went wrong, or otherwise fills in pnn.
537  */
538 bool ctdb_getdbseqnum_recv(struct ctdb_connection *ctdb,
539                       struct ctdb_request *req, uint64_t *seqnum);
540
541 /**
542  * ctdb_getnodemap_send - read the nodemap number from a node.
543  * @ctdb: the ctdb_connection from ctdb_connect.
544  * @destnode: the destination node (see below)
545  * @callback: the callback when ctdb replies to our message (typesafe)
546  * @cbdata: the argument to callback()
547  *
548  * There are several special values for destnode, detailed in
549  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
550  * local ctdbd.
551  */
552 struct ctdb_request *
553 ctdb_getnodemap_send(struct ctdb_connection *ctdb,
554                  uint32_t destnode,
555                  ctdb_callback_t callback,
556                  void *cbdata);
557 /**
558  * ctdb_getnodemap_recv - read an ctdb_getnodemap reply from ctdbd
559  * @ctdb: the ctdb_connection from ctdb_connect.
560  * @req: the completed request.
561  * @nodemap: a pointer to the returned nodemap structure
562  *
563  * This returns false if something went wrong.
564  * If the command failed, it guarantees to set nodemap to NULL.
565  * A non-NULL value for nodemap means the command was successful.
566  *
567  * A non-NULL value of the nodemap must be release released/freed
568  * by ctdb_free_nodemap().
569  */
570 bool ctdb_getnodemap_recv(struct ctdb_connection *ctdb,
571                       struct ctdb_request *req, struct ctdb_node_map **nodemap);
572
573 /**
574  * ctdb_getpublicips_send - read the public ip list from a node.
575  * @ctdb: the ctdb_connection from ctdb_connect.
576  * @destnode: the destination node (see below)
577  * @callback: the callback when ctdb replies to our message (typesafe)
578  * @cbdata: the argument to callback()
579  *
580  * This control returns the list of public ips known to the local node.
581  * Deamons only know about those ips that are listed in the local
582  * public addresses file, which means the returned list of ips may
583  * be only a subset of all ips across the entire cluster.
584  *
585  * There are several special values for destnode, detailed in
586  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
587  * local ctdbd.
588  */
589 struct ctdb_request *
590 ctdb_getpublicips_send(struct ctdb_connection *ctdb,
591                  uint32_t destnode,
592                  ctdb_callback_t callback,
593                  void *cbdata);
594 /**
595  * ctdb_getpublicips_recv - read the public ip list from a node
596  * @ctdb: the ctdb_connection from ctdb_connect.
597  * @req: the completed request.
598  * @ips: a pointer to the returned public ip list
599  *
600  * This returns false if something went wrong.
601  * If the command failed, it guarantees to set ips to NULL.
602  * A non-NULL value for nodemap means the command was successful.
603  *
604  * A non-NULL value of the nodemap must be release released/freed
605  * by ctdb_free_publicips().
606  */
607 bool ctdb_getpublicips_recv(struct ctdb_connection *ctdb,
608                       struct ctdb_request *req, struct ctdb_all_public_ips **ips);
609
610
611 /**
612  * ctdb_getrecmaster_send - read the recovery master of a node
613  * @ctdb: the ctdb_connection from ctdb_connect.
614  * @destnode: the destination node (see below)
615  * @callback: the callback when ctdb replies to our message (typesafe)
616  * @cbdata: the argument to callback()
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 struct ctdb_request *
623 ctdb_getrecmaster_send(struct ctdb_connection *ctdb,
624                         uint32_t destnode,
625                         ctdb_callback_t callback, void *cbdata);
626
627 /**
628  * ctdb_getrecmaster_recv - read an ctdb_getrecmaster reply from ctdbd
629  * @ctdb: the ctdb_connection from ctdb_connect.
630  * @req: the completed request.
631  * @recmaster: a pointer to the recmaster to fill in
632  *
633  * This returns false if something went wrong, or otherwise fills in
634  * recmaster.
635  */
636 bool ctdb_getrecmaster_recv(struct ctdb_connection *ctdb,
637                             struct ctdb_request *handle,
638                             uint32_t *recmaster);
639
640 /**
641  * ctdb_getrecmode_send - read the recovery mode of a node
642  * @ctdb: the ctdb_connection from ctdb_connect.
643  * @destnode: the destination node (see below)
644  * @callback: the callback when ctdb replies to our message (typesafe)
645  * @cbdata: the argument to callback()
646  *
647  * There are several special values for destnode, detailed in
648  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
649  * local ctdbd.
650  */
651 struct ctdb_request *
652 ctdb_getrecmode_send(struct ctdb_connection *ctdb,
653                      uint32_t destnode,
654                      ctdb_callback_t callback, void *cbdata);
655
656 /**
657  * ctdb_getrecmode_recv - read an ctdb_getrecmode reply from ctdbd
658  * @ctdb: the ctdb_connection from ctdb_connect.
659  * @req: the completed request.
660  * @recmode: a pointer to the recmode to fill in
661  *
662  * This returns false if something went wrong, or otherwise fills in
663  * recmode.
664  */
665 bool ctdb_getrecmode_recv(struct ctdb_connection *ctdb,
666                           struct ctdb_request *handle,
667                           uint32_t *recmode);
668
669 /**
670  * ctdb_cancel - cancel an uncompleted request
671  * @ctdb: the ctdb_connection from ctdb_connect.
672  * @req: the uncompleted request.
673  *
674  * This cancels a request, returning true.  You may not cancel a
675  * request which has already been completed (ie. once its callback has
676  * been called); you should simply use ctdb_request_free() in that case.
677  */
678 void ctdb_cancel(struct ctdb_connection *ctdb, struct ctdb_request *req);
679
680 /***
681  *
682  *  Synchronous API
683  *
684  ***/
685
686 /**
687  * ctdb_attachdb - open a clustered TDB (synchronous)
688  * @ctdb: the ctdb_connection from ctdb_connect.
689  * @name: the filename of the database (no /).
690  * @persistent: whether the database is persistent across ctdbd's life
691  * @tdb_flags: the flags to pass to tdb_open.
692  *
693  * Do a ctdb_attachdb_send and wait for it to complete.
694  * Returns NULL on failure.
695  */
696 struct ctdb_db *ctdb_attachdb(struct ctdb_connection *ctdb,
697                               const char *name, bool persistent,
698                               uint32_t tdb_flags);
699
700 /**
701  * ctdb_detachdb - close a clustered TDB.
702  * @ctdb: the ctdb_connection from ctdb_connect.
703  * @db: the database from ctdb_attachdb/ctdb_attachdb_send
704  *
705  * Closes a clustered tdb.
706  */
707 void ctdb_detachdb(struct ctdb_connection *ctdb, struct ctdb_db *db);
708
709 /**
710  * ctdb_readrecordlock - read and lock a record (synchronous)
711  * @ctdb: the ctdb_connection from ctdb_connect.
712  * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
713  * @key: the key of the record to lock.
714  * @req: a pointer to the request, if one is needed.
715  *
716  * Do a ctdb_readrecordlock_send and wait for it to complete.
717  * Returns NULL on failure.
718  */
719 struct ctdb_lock *ctdb_readrecordlock(struct ctdb_connection *ctdb,
720                                       struct ctdb_db *ctdb_db, TDB_DATA key,
721                                       TDB_DATA *data);
722
723
724 /**
725  * ctdb_set_message_handler - register for messages to a srvid (synchronous)
726  * @ctdb: the ctdb_connection from ctdb_connect.
727  * @srvid: the 64 bit identifier for our messages.
728  * @handler: the callback when we receive such a message (typesafe)
729  * @cbdata: the argument to handler()
730  *
731  * If this returns true, the message handler can be called from any
732  * ctdb_service() (which is also called indirectly by other
733  * synchronous functions).  If this returns false, the registration
734  * failed.
735  */
736 bool ctdb_set_message_handler(struct ctdb_connection *ctdb, uint64_t srvid,
737                               ctdb_message_fn_t handler, void *cbdata);
738
739
740 /**
741  * ctdb_remove_message_handler - deregister for messages (synchronous)
742  * @ctdb: the ctdb_connection from ctdb_connect.
743  * @srvid: the 64 bit identifier for our messages.
744  * @handler: the callback when we receive such a message (typesafe)
745  * @handler_data: the argument to handler()
746  *
747  * If this returns true, the message handler will no longer be called.
748  * If this returns false, the deregistration failed.
749  */
750 bool ctdb_remove_message_handler(struct ctdb_connection *ctdb, uint64_t srvid,
751                                  ctdb_message_fn_t handler, void *handler_data);
752
753 /**
754  * ctdb_getpnn - read the pnn number of a node (synchronous)
755  * @ctdb: the ctdb_connection from ctdb_connect.
756  * @destnode: the destination node (see below)
757  * @pnn: a pointer to the pnn to fill in
758  *
759  * There are several special values for destnode, detailed in
760  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
761  * local ctdbd.
762  *
763  * Returns true and fills in *pnn on success.
764  */
765 bool ctdb_getpnn(struct ctdb_connection *ctdb,
766                  uint32_t destnode,
767                  uint32_t *pnn);
768
769 /**
770  * ctdb_getdbseqnum - read the seqnum of a database
771  * @ctdb: the ctdb_connection from ctdb_connect.
772  * @destnode: the destination node (see below)
773  * @dbid: database id
774  * @seqnum: sequence number for the database
775  *
776  * There are several special values for destnode, detailed in
777  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
778  * local ctdbd.
779  *
780  * Returns true and fills in *pnn on success.
781  */
782 bool
783 ctdb_getdbseqnum(struct ctdb_connection *ctdb,
784                  uint32_t destnode,
785                  uint32_t dbid,
786                  uint64_t *seqnum);
787
788 /**
789  * ctdb_getrecmaster - read the recovery master of a node (synchronous)
790  * @ctdb: the ctdb_connection from ctdb_connect.
791  * @destnode: the destination node (see below)
792  * @recmaster: a pointer to the recmaster to fill in
793  *
794  * There are several special values for destnode, detailed in
795  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
796  * local ctdbd.
797  *
798  * Returns true and fills in *recmaster on success.
799  */
800 bool ctdb_getrecmaster(struct ctdb_connection *ctdb,
801                        uint32_t destnode,
802                        uint32_t *recmaster);
803
804
805 /**
806  * ctdb_getrecmode - read the recovery mode of a node (synchronous)
807  * @ctdb: the ctdb_connection from ctdb_connect.
808  * @destnode: the destination node (see below)
809  * @recmode: a pointer to the recmode to fill in
810  *
811  * There are several special values for destnode, detailed in
812  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
813  * local ctdbd.
814  *
815  * Returns true and fills in *recmode on success.
816  */
817 bool ctdb_getrecmode(struct ctdb_connection *ctdb,
818                      uint32_t destnode,
819                      uint32_t *recmode);
820
821
822 /**
823  * ctdb_getnodemap - read the nodemap from a node (synchronous)
824  * @ctdb: the ctdb_connection from ctdb_connect.
825  * @destnode: the destination node (see below)
826  * @nodemap: a pointer to the nodemap to fill in
827  *
828  * There are several special values for destnode, detailed in
829  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
830  * local ctdbd.
831  *
832  * Returns true and fills in *nodemap on success.
833  * A non-NULL nodemap must be freed by calling ctdb_free_nodemap.
834  */
835 bool ctdb_getnodemap(struct ctdb_connection *ctdb,
836                      uint32_t destnode, struct ctdb_node_map **nodemap);
837
838 /*
839  * This function is used to release/free the nodemap structure returned
840  * by ctdb_getnodemap() and ctdb_getnodemap_recv()
841  */
842 void ctdb_free_nodemap(struct ctdb_node_map *nodemap);
843
844
845 /**
846  * ctdb_getpublicips - read the public ip list from a node.
847  * @ctdb: the ctdb_connection from ctdb_connect.
848  * @destnode: the destination node (see below)
849  * @ips: a pointer to the returned public ip list
850  *
851  * This control returns the list of public ips known to the local node.
852  * Deamons only know about those ips that are listed in the local
853  * public addresses file, which means the returned list of ips may
854  * be only a subset of all ips across the entire cluster.
855  *
856  * There are several special values for destnode, detailed in
857  * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
858  * local ctdbd.
859  *
860  * This returns false if something went wrong.
861  * If the command failed, it guarantees to set ips to NULL.
862  * A non-NULL value for nodemap means the command was successful.
863  *
864  * A non-NULL value of the nodemap must be release released/freed
865  * by ctdb_free_publicips().
866  */
867 bool ctdb_getpublicips(struct ctdb_connection *ctdb,
868                      uint32_t destnode, struct ctdb_all_public_ips **ips);
869
870 /*
871  * This function is used to release/free the public ip structure returned
872  * by ctdb_getpublicips() and ctdb_getpublicips_recv()
873  */
874 void ctdb_free_publicips(struct ctdb_all_public_ips *ips);
875
876
877 /* These ugly macro wrappers make the callbacks typesafe. */
878 #include <ctdb_typesafe_cb.h>
879 #define ctdb_sendcb(cb, cbdata)                                         \
880          typesafe_cb_preargs(void, (cb), (cbdata),                      \
881                              struct ctdb_connection *, struct ctdb_request *)
882
883 #define ctdb_msgcb(cb, cbdata)                                          \
884         typesafe_cb_preargs(void, (cb), (cbdata),                       \
885                             struct ctdb_connection *, uint64_t, TDB_DATA)
886
887 #define ctdb_connect(addr, log, logpriv)                                \
888         ctdb_connect((addr),                                            \
889                      typesafe_cb_postargs(void, (log), (logpriv),       \
890                                           int, const char *, va_list),  \
891                      (logpriv))
892
893 #define ctdb_set_message_handler(ctdb, srvid, handler, hdata)           \
894         ctdb_set_message_handler((ctdb), (srvid),                       \
895                                  ctdb_msgcb((handler), (hdata)), (hdata))
896
897 #define ctdb_remove_message_handler(ctdb, srvid, handler, hdata)        \
898         ctdb_remove_message_handler((ctdb), (srvid),                    \
899                                     ctdb_msgcb((handler), (hdata)), (hdata))
900
901 #define ctdb_attachdb_send(ctdb, name, persistent, tdb_flags, cb, cbdata) \
902         ctdb_attachdb_send((ctdb), (name), (persistent), (tdb_flags),   \
903                            ctdb_sendcb((cb), (cbdata)), (cbdata))
904
905 #define ctdb_readrecordlock_async(_ctdb_db, key, cb, cbdata)            \
906         ctdb_readrecordlock_async((_ctdb_db), (key),                    \
907                 typesafe_cb_preargs(void, (cb), (cbdata),               \
908                                     struct ctdb_db *, struct ctdb_lock *, \
909                                     TDB_DATA), (cbdata))
910
911 #define ctdb_set_message_handler_send(ctdb, srvid, handler, hdata, cb, cbdata) \
912         ctdb_set_message_handler_send((ctdb), (srvid),                  \
913                                       ctdb_msgcb((handler), (hdata)), (hdata), \
914                                       ctdb_sendcb((cb), (cbdata)), (cbdata))
915
916 #define ctdb_remove_message_handler_send(ctdb, srvid, handler, hdata, cb, cbdata) \
917         ctdb_remove_message_handler_send((ctdb), (srvid),               \
918               ctdb_msgcb((handler), (hdata)), (hdata),                  \
919               ctdb_sendcb((cb), (cbdata)), (cbdata))
920
921 #define ctdb_getpnn_send(ctdb, destnode, cb, cbdata)                    \
922         ctdb_getpnn_send((ctdb), (destnode),                            \
923                          ctdb_sendcb((cb), (cbdata)), (cbdata))
924
925 #define ctdb_getrecmaster_send(ctdb, destnode, cb, cbdata)              \
926         ctdb_getrecmaster_send((ctdb), (destnode),                      \
927                                ctdb_sendcb((cb), (cbdata)), (cbdata))
928
929 #define ctdb_getrecmode_send(ctdb, destnode, cb, cbdata)                \
930         ctdb_getrecmode_send((ctdb), (destnode),                        \
931                                ctdb_sendcb((cb), (cbdata)), (cbdata))
932
933 #define ctdb_getnodemap_send(ctdb, destnode, cb, cbdata)                \
934         ctdb_getnodemap_send((ctdb), (destnode),                        \
935                          ctdb_sendcb((cb), (cbdata)), (cbdata))
936
937 #define ctdb_getpublicips_send(ctdb, destnode, cb, cbdata)              \
938         ctdb_getpublicips_send((ctdb), (destnode),                      \
939                          ctdb_sendcb((cb), (cbdata)), (cbdata))
940
941 #define ctdb_getdbseqnum_send(ctdb, destnode, dbid, cb, cbdata)         \
942         ctdb_getdbseqnum_send((ctdb), (destnode), (dbid),               \
943                          ctdb_sendcb((cb), (cbdata)), (cbdata))
944
945 #endif