2010-05-20 10:31:28 +04:00
/*
ctdb database library
Copyright ( C ) Ronnie sahlberg 2010
2010-05-20 10:37:30 +04:00
Copyright ( C ) Rusty Russell 2010
2010-05-20 10:31:28 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , see < http : //www.gnu.org/licenses/>.
*/
# ifndef _CTDB_H
# define _CTDB_H
2010-05-20 10:37:30 +04:00
# include <sys/types.h>
# include <stdint.h>
2010-05-24 08:22:17 +04:00
# include <stdbool.h>
2010-06-04 14:57:03 +04:00
# include <stdarg.h>
# include <stdio.h>
2010-05-20 10:37:30 +04:00
# include <tdb.h>
2010-09-13 08:28:11 +04:00
# include <netinet/in.h>
2010-06-04 14:52:03 +04:00
# include <ctdb_protocol.h>
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb - a library for accessing tdbs controlled by ctdbd
*
* ctdbd ( clustered tdb daemon ) is a daemon designed to syncronize TDB
* databases across a cluster . Using this library , you can communicate with
* the daemon to access the databases , pass messages across the cluster , and
* control the daemon itself .
*
* The general API is event - driven and asynchronous : you call the
* * _send functions , supplying callbacks , then when the ctdbd file
* descriptor is usable , call ctdb_service ( ) to perform read from it
* and call your callbacks , which use the * _recv functions to unpack
* the replies from ctdbd .
*
* There is also a synchronous wrapper for each function for trivial
* programs ; these can be found in the section marked " Synchronous API " .
*/
2010-06-08 11:23:17 +04:00
/**
* ctdb_log_fn_t - logging function for ctdbd
* @ log_priv : private ( typesafe ) arg via ctdb_connect
* @ severity : syslog - style severity
* @ format : printf - style format string .
* @ ap : arguments for formatting .
*
* The severity passed to log ( ) are as per syslog ( 3 ) . In particular ,
* LOG_DEBUG is used for tracing , LOG_WARNING is used for unusual
* conditions which don ' t necessarily return an error through the API ,
* LOG_ERR is used for errors such as lost communication with ctdbd or
* out - of - memory , LOG_ALERT is used for library usage bugs , LOG_CRIT is
* used for libctdb internal consistency checks .
*
* The log ( ) function can be typesafe : the @ log_priv arg to
* ctdb_donnect and signature of log ( ) should match .
*/
2010-06-04 14:57:03 +04:00
typedef void ( * ctdb_log_fn_t ) ( void * log_priv ,
int severity , const char * format , va_list ap ) ;
2010-06-04 15:00:08 +04:00
/**
* ctdb_connect - connect to ctdb using the specified domain socket .
* @ addr : the socket address , or NULL for default
* @ log : the logging function
* @ log_priv : the private argument to the logging function .
*
2010-06-18 10:05:52 +04:00
* Returns a ctdb context if successful or NULL . Use ctdb_disconnect ( ) to
2010-06-04 15:00:08 +04:00
* release the returned ctdb_connection when finished .
*
* See Also :
2010-06-08 11:23:17 +04:00
* ctdb_log_fn_t , ctdb_log_file ( )
2010-06-04 15:00:08 +04:00
*/
struct ctdb_connection * ctdb_connect ( const char * addr ,
ctdb_log_fn_t log_fn , void * log_priv ) ;
2010-06-04 14:57:03 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_log_file - example logging function
*
* Logs everything at priority LOG_WARNING or above to the file given ( via
* the log_priv argument , usually stderr ) .
2010-06-02 07:49:34 +04:00
*/
2010-06-04 15:00:08 +04:00
void ctdb_log_file ( FILE * , int , const char * , va_list ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_log_level - level at which to call logging function
2010-05-20 10:31:28 +04:00
*
2010-06-04 15:00:08 +04:00
* This variable globally controls filtering on the logging function .
* It is initialized to LOG_WARNING , meaning that strange but nonfatal
* events , as well as errors and API misuses are reported .
*
* Set it to LOG_DEBUG to receive all messages .
2010-05-20 10:31:28 +04:00
*/
2010-06-04 15:00:08 +04:00
extern int ctdb_log_level ;
2010-06-18 10:05:52 +04:00
/**
* ctdb_disconnect - close down a connection to ctdbd .
* @ ctdb : the ctdb connectio returned from ctdb_connect .
*
* The @ ctdb arg will be freed by this call , and must not be used again .
*/
void ctdb_disconnect ( struct ctdb_connection * ctdb ) ;
2010-06-04 15:00:08 +04:00
/***
*
* Asynchronous API
*
* * */
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_get_fd - get the filedescriptor to select / poll on
* @ ctdb : the ctdb_connection from ctdb_connect .
*
* By using poll or select on this file descriptor , you will know when to call
* ctdb_service ( ) .
*
* See Also :
* ctdb_which_events ( ) , ctdb_service ( )
*/
2010-05-20 10:37:30 +04:00
int ctdb_get_fd ( struct ctdb_connection * ctdb ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_which_events - determine which events ctdb_service wants to see
* @ ctdb : the ctdb_connection from ctdb_connect .
*
* This returns POLLIN , possibly or ' d with POLLOUT if there are writes
* pending . You can set this straight into poll . events .
*
* See Also :
* ctdb_service ( )
*/
2010-05-20 10:37:30 +04:00
int ctdb_which_events ( struct ctdb_connection * ctdb ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_service - service any I / O and callbacks from ctdbd communication
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ revents : which events are available .
*
* This is the core of the library : it read and writes to the ctdbd
* socket . It may call callbacks registered with the various _send
* functions .
*
* revents is a bitset : POLLIN and / or POLLOUT may be set to indicate
* it is worth attempting to read / write the ( nonblocking )
* filedescriptor respectively .
*
* Note that the synchronous functions call this internally .
* Returns false on catastrophic failure .
*/
2010-06-04 14:49:25 +04:00
bool ctdb_service ( struct ctdb_connection * ctdb , int revents ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* struct ctdb_request - handle for an outstanding request
*
* This opaque structure returned from various * _send functions gives
* you a handle by which you can cancel a request . You can ' t do
* anything else with it until the request is completed and it is
* handed to your callback function .
*/
2010-05-24 07:47:36 +04:00
struct ctdb_request ;
2010-06-04 15:00:08 +04:00
/**
* ctdb_request_free - free a completed request
*
* This frees a request : you should only call it once it has been
* handed to your callback . For incomplete requests , see ctdb_cancel ( ) .
*/
2010-06-04 11:24:08 +04:00
void ctdb_request_free ( struct ctdb_connection * ctdb , struct ctdb_request * req ) ;
2010-05-24 07:47:36 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_callback_t - callback for completed requests .
2010-05-24 07:47:36 +04:00
*
2010-06-04 15:00:08 +04:00
* This would normally unpack the request using ctdb_ * _recv ( ) . You
* must free the request using ctdb_request_free ( ) .
*
* Note that due to macro magic , actual your callback can be typesafe :
* instead of taking a void * , it can take a type which matches the
* actual private parameter .
2010-05-24 07:47:36 +04:00
*/
typedef void ( * ctdb_callback_t ) ( struct ctdb_connection * ctdb ,
2010-07-29 06:48:46 +04:00
struct ctdb_request * req , void * private_data ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* struct ctdb_db - connection to a particular open TDB
*
* This represents a particular open database : you receive it from
* ctdb_attachdb or ctdb_attachdb_recv to manipulate a database .
2010-05-20 10:31:28 +04:00
*
2010-06-18 10:05:52 +04:00
* You have to free the handle with ctdb_detachdb ( ) when finished with it .
2010-05-20 10:31:28 +04:00
*/
2010-05-20 10:37:30 +04:00
struct ctdb_db ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_attachdb_send - open a clustered TDB
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ name : the filename of the database ( no / ) .
* @ persistent : whether the database is persistent across ctdbd ' s life
* @ tdb_flags : the flags to pass to tdb_open .
* @ callback : the callback when we ' re attached or failed ( typesafe )
* @ cbdata : the argument to callback ( )
*
* This function connects to a TDB controlled by ctdbd . It can create
* a new TDB if it does not exist , depending on tdb_flags . Returns
* the pending request , or NULL on error .
*/
2010-05-20 10:37:30 +04:00
struct ctdb_request *
ctdb_attachdb_send ( struct ctdb_connection * ctdb ,
2010-06-08 11:41:40 +04:00
const char * name , bool persistent , uint32_t tdb_flags ,
2010-06-04 15:00:08 +04:00
ctdb_callback_t callback , void * cbdata ) ;
2010-05-24 07:47:36 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_attachdb_recv - read an ctdb_attach reply from ctdbd
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ req : the completed request .
*
* This returns NULL if something went wrong , or otherwise the open database .
*/
2010-06-04 11:24:08 +04:00
struct ctdb_db * ctdb_attachdb_recv ( struct ctdb_connection * ctdb ,
struct ctdb_request * req ) ;
2010-05-24 07:47:36 +04:00
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* struct ctdb_lock - a record lock on a clustered TDB database
*
* This locks a subset of the database across the entire cluster ; it
* is the fundamental sychronization element for ctdb . You cannot have
* more than one lock at once .
*
* You MUST NOT block during holding this lock and MUST release it
* quickly by performing ctdb_release_lock ( lock ) .
2010-06-05 09:38:11 +04:00
* Do NOT make any system calls that may block while holding the lock .
*
* Try to release the lock as quickly as possible .
2010-06-04 15:00:08 +04:00
*/
2010-05-20 10:37:30 +04:00
struct ctdb_lock ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_rrl_callback_t - callback for ctdb_readrecordlock_async
2010-05-20 10:31:28 +04:00
*
2010-06-04 15:00:08 +04:00
* This is not the standard ctdb_callback_t , because there is often no
* request required to access a database record ( ie . if it is local already ) .
* So the callback is handed the lock directly : it might be NULL if there
* was an error obtaining the lock .
2010-05-24 08:22:17 +04:00
*
2010-06-04 15:00:08 +04:00
* See Also :
* ctdb_readrecordlock_async ( ) , ctdb_readrecordlock ( )
2010-05-20 10:31:28 +04:00
*/
2010-06-04 08:03:08 +04:00
typedef void ( * ctdb_rrl_callback_t ) ( struct ctdb_db * ctdb_db ,
struct ctdb_lock * lock ,
TDB_DATA data ,
2010-07-29 06:48:46 +04:00
void * private_data ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_readrecordlock_async - read and lock a record
* @ ctdb_db : the database handle from ctdb_attachdb / ctdb_attachdb_recv .
* @ key : the key of the record to lock .
* @ callback : the callback once the record is locked ( typesafe ) .
* @ cbdata : the argument to callback ( )
*
* This returns true on success . Commonly , we can obtain the record
* immediately and so the callback will be invoked . Otherwise a request
* will be queued to ctdbd for the record .
*
* If failure is immediate , false is returned . Otherwise , the callback
* may receive a NULL lock arg to indicate asynchronous failure .
*/
bool ctdb_readrecordlock_async ( struct ctdb_db * ctdb_db , TDB_DATA key ,
ctdb_rrl_callback_t callback , void * cbdata ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_writerecord - write a locked record in a TDB
2010-06-08 11:41:40 +04:00
* @ ctdb_db : the database handle from ctdb_attachdb / ctdb_attachdb_recv .
2010-06-04 15:00:08 +04:00
* @ lock : the lock from ctdb_readrecordlock / ctdb_readrecordlock_recv
* @ data : the new data to place in the record .
2010-05-20 10:31:28 +04:00
*/
2010-06-08 11:41:40 +04:00
bool ctdb_writerecord ( struct ctdb_db * ctdb_db ,
struct ctdb_lock * lock , TDB_DATA data ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_release_lock - release a record lock on a TDB
2010-06-08 11:41:40 +04:00
* @ ctdb_db : the database handle from ctdb_attachdb / ctdb_attachdb_recv .
2010-06-04 15:00:08 +04:00
* @ lock : the lock from ctdb_readrecordlock / ctdb_readrecordlock_async
*/
2010-06-08 11:41:40 +04:00
void ctdb_release_lock ( struct ctdb_db * ctdb_db , struct ctdb_lock * lock ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_message_fn_t - messaging callback for ctdb messages
*
* ctdbd provides a simple messaging API ; you can register for a particular
* 64 - bit id on which you want to send messages , and send to other ids .
*
* See Also :
* ctdb_set_message_handler_send ( )
*/
typedef void ( * ctdb_message_fn_t ) ( struct ctdb_connection * ,
uint64_t srvid , TDB_DATA data , void * ) ;
/**
* ctdb_set_message_handler_send - register for messages to a srvid
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ srvid : the 64 bit identifier for our messages .
* @ handler : the callback when we receive such a message ( typesafe )
2010-08-09 10:11:32 +04:00
* @ handler_data : the argument to handler ( )
2010-06-04 15:00:08 +04:00
* @ callback : the callback when ctdb replies to our message ( typesafe )
2010-08-09 10:11:32 +04:00
* @ cbdata : the argument to callback ( )
2010-06-04 15:00:08 +04:00
*
* Note : our callback will always be called before handler .
*
* See Also :
* ctdb_set_message_handler_recv ( ) , ctdb_remove_message_handler_send ( )
2010-05-20 10:31:28 +04:00
*/
2010-05-20 10:37:30 +04:00
struct ctdb_request *
ctdb_set_message_handler_send ( struct ctdb_connection * ctdb , uint64_t srvid ,
2010-05-24 07:47:36 +04:00
ctdb_message_fn_t handler ,
2010-08-09 10:11:32 +04:00
void * handler_data ,
2010-05-24 07:47:36 +04:00
ctdb_callback_t callback ,
2010-06-04 15:00:08 +04:00
void * cbdata ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_set_message_handler_recv - read a set_message_handler result
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ req : the completed request
*
* If this returns true , the registered handler may be called from the next
* ctdb_service ( ) . If this returns false , the registration failed .
*/
2010-06-04 14:49:25 +04:00
bool ctdb_set_message_handler_recv ( struct ctdb_connection * ctdb ,
struct ctdb_request * handle ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_remove_message_handler_send - unregister for messages to a srvid
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ srvid : the 64 bit identifier for our messages .
2010-08-09 10:11:32 +04:00
* @ handler : the callback when we receive such a message ( typesafe )
* @ handler_data : the argument to handler ( )
2010-06-04 15:00:08 +04:00
* @ callback : the callback when ctdb replies to our message ( typesafe )
* @ cbdata : the argument to callback ( )
*
* This undoes a successful ctdb_set_message_handler or
* ctdb_set_message_handler_recv .
2010-05-20 10:31:28 +04:00
*/
2010-05-20 10:37:30 +04:00
struct ctdb_request *
ctdb_remove_message_handler_send ( struct ctdb_connection * ctdb , uint64_t srvid ,
2010-08-09 10:11:32 +04:00
ctdb_message_fn_t handler , void * handler_data ,
2010-06-04 15:00:08 +04:00
ctdb_callback_t callback , void * cbdata ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_remove_message_handler_recv - read a remove_message_handler result
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ req : the completed request
*
* After this returns true , the registered handler will no longer be called .
* If this returns false , the de - registration failed .
*/
2010-08-09 10:11:32 +04:00
bool ctdb_remove_message_handler_recv ( struct ctdb_connection * ctdb ,
struct ctdb_request * req ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_send_message - send a message via ctdbd
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ pnn : the physical node number to send to
* @ srvid : the 64 bit identifier for this message type .
* @ data : the data to send
*
* This allows arbitrary messages to be sent across the cluster to those
* listening ( via ctdb_set_message_handler et al ) .
*
* This queues a message to be sent : you will need to call
* ctdb_service ( ) to actually send the message . There is no callback
* because there is no acknowledgement .
*
* See Also :
* ctdb_getpnn_send ( ) , ctdb_getpnn ( )
2010-05-20 10:31:28 +04:00
*/
2010-06-04 14:49:25 +04:00
bool ctdb_send_message ( struct ctdb_connection * ctdb , uint32_t pnn , uint64_t srvid , TDB_DATA data ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_getpnn_send - read the pnn number of a node .
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ destnode : the destination node ( see below )
* @ callback : the callback when ctdb replies to our message ( typesafe )
* @ cbdata : the argument to callback ( )
*
* There are several special values for destnode , detailed in
* ctdb_protocol . h , particularly CTDB_CURRENT_NODE which means the
* local ctdbd .
2010-05-20 10:31:28 +04:00
*/
2010-05-20 10:37:30 +04:00
struct ctdb_request *
ctdb_getpnn_send ( struct ctdb_connection * ctdb ,
2010-05-20 10:31:28 +04:00
uint32_t destnode ,
2010-05-24 07:47:36 +04:00
ctdb_callback_t callback ,
2010-06-04 15:00:08 +04:00
void * cbdata ) ;
/**
* ctdb_getpnn_recv - read an ctdb_getpnn reply from ctdbd
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ req : the completed request .
* @ pnn : a pointer to the pnn to fill in
*
* This returns false if something went wrong , or otherwise fills in pnn .
*/
2010-06-04 14:49:25 +04:00
bool ctdb_getpnn_recv ( struct ctdb_connection * ctdb ,
struct ctdb_request * req , uint32_t * pnn ) ;
2010-05-24 07:47:36 +04:00
2010-05-20 10:31:28 +04:00
2010-09-13 08:28:11 +04:00
/**
* ctdb_getnodemap_send - read the nodemap number from a node .
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ destnode : the destination node ( see below )
* @ callback : the callback when ctdb replies to our message ( typesafe )
* @ cbdata : the argument to callback ( )
*
* There are several special values for destnode , detailed in
* ctdb_protocol . h , particularly CTDB_CURRENT_NODE which means the
* local ctdbd .
*/
struct ctdb_request *
ctdb_getnodemap_send ( struct ctdb_connection * ctdb ,
uint32_t destnode ,
ctdb_callback_t callback ,
void * cbdata ) ;
/**
* ctdb_getnodemap_recv - read an ctdb_getnodemap reply from ctdbd
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ req : the completed request .
* @ nodemap : a pointer to the returned nodemap structure
*
* This returns false if something went wrong .
* If the command failed , it guarantees to set nodemap to NULL .
* A non - NULL value for nodemap means the command was successful .
*
* A non - NULL value of the nodemap must be release released / freed
* by ctdb_free_nodemap ( ) .
*/
bool ctdb_getnodemap_recv ( struct ctdb_connection * ctdb ,
struct ctdb_request * req , struct ctdb_node_map * * nodemap ) ;
2010-06-04 15:00:08 +04:00
/**
* ctdb_getrecmaster_send - read the recovery master of a node
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ destnode : the destination node ( see below )
* @ callback : the callback when ctdb replies to our message ( typesafe )
* @ cbdata : the argument to callback ( )
*
* There are several special values for destnode , detailed in
* ctdb_protocol . h , particularly CTDB_CURRENT_NODE which means the
* local ctdbd .
2010-05-20 10:31:28 +04:00
*/
2010-05-20 10:37:30 +04:00
struct ctdb_request *
ctdb_getrecmaster_send ( struct ctdb_connection * ctdb ,
2010-05-20 10:31:28 +04:00
uint32_t destnode ,
2010-09-13 08:28:11 +04:00
ctdb_callback_t callback , void * cbdata ) ;
2010-06-04 15:00:08 +04:00
/**
* ctdb_getrecmaster_recv - read an ctdb_getrecmaster reply from ctdbd
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ req : the completed request .
* @ recmaster : a pointer to the recmaster to fill in
*
* This returns false if something went wrong , or otherwise fills in
* recmaster .
*/
2010-06-04 14:49:25 +04:00
bool ctdb_getrecmaster_recv ( struct ctdb_connection * ctdb ,
struct ctdb_request * handle ,
uint32_t * recmaster ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_cancel - cancel an uncompleted request
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ req : the uncompleted request .
*
* This cancels a request , returning true . You may not cancel a
* request which has already been completed ( ie . once its callback has
* been called ) ; you should simply use ctdb_request_free ( ) in that case .
*/
void ctdb_cancel ( struct ctdb_connection * ctdb , struct ctdb_request * req ) ;
/***
*
* Synchronous API
*
* * */
/**
* ctdb_attachdb - open a clustered TDB ( synchronous )
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ name : the filename of the database ( no / ) .
* @ persistent : whether the database is persistent across ctdbd ' s life
* @ tdb_flags : the flags to pass to tdb_open .
*
* Do a ctdb_attachdb_send and wait for it to complete .
* Returns NULL on failure .
*/
struct ctdb_db * ctdb_attachdb ( struct ctdb_connection * ctdb ,
2010-06-08 11:41:40 +04:00
const char * name , bool persistent ,
2010-06-04 15:00:08 +04:00
uint32_t tdb_flags ) ;
2010-05-20 10:31:28 +04:00
2010-06-18 10:05:52 +04:00
/**
* ctdb_detachdb - close a clustered TDB .
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ db : the database from ctdb_attachdb / ctdb_attachdb_send
*
* Closes a clustered tdb .
*/
void ctdb_detachdb ( struct ctdb_connection * ctdb , struct ctdb_db * db ) ;
2010-06-04 15:00:08 +04:00
/**
* ctdb_readrecordlock - read and lock a record ( synchronous )
2010-06-21 09:17:34 +04:00
* @ ctdb : the ctdb_connection from ctdb_connect .
2010-06-04 15:00:08 +04:00
* @ ctdb_db : the database handle from ctdb_attachdb / ctdb_attachdb_recv .
* @ key : the key of the record to lock .
* @ req : a pointer to the request , if one is needed .
*
* Do a ctdb_readrecordlock_send and wait for it to complete .
* Returns NULL on failure .
*/
2010-06-21 09:17:34 +04:00
struct ctdb_lock * ctdb_readrecordlock ( struct ctdb_connection * ctdb ,
struct ctdb_db * ctdb_db , TDB_DATA key ,
2010-06-04 15:00:08 +04:00
TDB_DATA * data ) ;
2010-05-20 10:31:28 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_set_message_handler - register for messages to a srvid ( synchronous )
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ srvid : the 64 bit identifier for our messages .
* @ handler : the callback when we receive such a message ( typesafe )
* @ cbdata : the argument to handler ( )
*
* If this returns true , the message handler can be called from any
* ctdb_service ( ) ( which is also called indirectly by other
* synchronous functions ) . If this returns false , the registration
* failed .
2010-05-20 10:31:28 +04:00
*/
2010-06-04 15:00:08 +04:00
bool ctdb_set_message_handler ( struct ctdb_connection * ctdb , uint64_t srvid ,
2010-08-09 10:11:32 +04:00
ctdb_message_fn_t handler , void * cbdata ) ;
2010-05-20 10:31:28 +04:00
2010-05-24 07:47:36 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_remove_message_handler - deregister for messages ( synchronous )
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ srvid : the 64 bit identifier for our messages .
2010-08-09 10:11:32 +04:00
* @ handler : the callback when we receive such a message ( typesafe )
* @ handler_data : the argument to handler ( )
2010-06-04 15:00:08 +04:00
*
* If this returns true , the message handler will no longer be called .
* If this returns false , the deregistration failed .
2010-06-04 14:57:03 +04:00
*/
2010-08-09 10:11:32 +04:00
bool ctdb_remove_message_handler ( struct ctdb_connection * ctdb , uint64_t srvid ,
ctdb_message_fn_t handler , void * handler_data ) ;
2010-06-04 14:57:03 +04:00
2010-06-04 15:00:08 +04:00
/**
* ctdb_getpnn - read the pnn number of a node ( synchronous )
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ destnode : the destination node ( see below )
* @ pnn : a pointer to the pnn to fill in
*
* There are several special values for destnode , detailed in
* ctdb_protocol . h , particularly CTDB_CURRENT_NODE which means the
* local ctdbd .
*
* Returns true and fills in * pnn on success .
*/
bool ctdb_getpnn ( struct ctdb_connection * ctdb ,
uint32_t destnode ,
uint32_t * pnn ) ;
/**
* ctdb_getrecmaster - read the recovery master of a node ( synchronous )
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ destnode : the destination node ( see below )
* @ recmaster : a pointer to the recmaster to fill in
*
* There are several special values for destnode , detailed in
* ctdb_protocol . h , particularly CTDB_CURRENT_NODE which means the
* local ctdbd .
*
* Returns true and fills in * recmaster on success .
*/
bool ctdb_getrecmaster ( struct ctdb_connection * ctdb ,
uint32_t destnode ,
uint32_t * recmaster ) ;
2010-06-04 14:57:03 +04:00
2010-09-13 08:28:11 +04:00
/**
* ctdb_getnodemap - read the nodemap from a node ( synchronous )
* @ ctdb : the ctdb_connection from ctdb_connect .
* @ destnode : the destination node ( see below )
* @ nodemap : a pointer to the nodemap to fill in
*
* There are several special values for destnode , detailed in
* ctdb_protocol . h , particularly CTDB_CURRENT_NODE which means the
* local ctdbd .
*
* Returns true and fills in * nodemap on success .
* A non - NULL nodemap must be freed by calling ctdb_free_nodemap .
*/
bool ctdb_getnodemap ( struct ctdb_connection * ctdb ,
uint32_t destnode , struct ctdb_node_map * * nodemap ) ;
/*
* This function is used to release / free the nodemap structure returned
* by ctdb_getnodemap ( ) and ctdb_getnodemap_recv ( )
*/
void ctdb_free_nodemap ( struct ctdb_node_map * nodemap ) ;
2010-05-24 07:47:36 +04:00
/* These ugly macro wrappers make the callbacks typesafe. */
2010-06-02 03:18:48 +04:00
# include <ctdb_typesafe_cb.h>
2010-05-24 07:47:36 +04:00
# define ctdb_sendcb(cb, cbdata) \
typesafe_cb_preargs ( void , ( cb ) , ( cbdata ) , \
struct ctdb_connection * , struct ctdb_request * )
2010-08-09 10:11:32 +04:00
# define ctdb_msgcb(cb, cbdata) \
typesafe_cb_preargs ( void , ( cb ) , ( cbdata ) , \
struct ctdb_connection * , uint64_t , TDB_DATA )
2010-06-04 14:57:03 +04:00
# define ctdb_connect(addr, log, logpriv) \
ctdb_connect ( ( addr ) , \
typesafe_cb_postargs ( void , ( log ) , ( logpriv ) , \
int , const char * , va_list ) , \
( logpriv ) )
2010-08-09 10:11:32 +04:00
# define ctdb_set_message_handler(ctdb, srvid, handler, hdata) \
ctdb_set_message_handler ( ( ctdb ) , ( srvid ) , \
ctdb_msgcb ( ( handler ) , ( hdata ) ) , ( hdata ) )
# define ctdb_remove_message_handler(ctdb, srvid, handler, hdata) \
ctdb_remove_message_handler ( ( ctdb ) , ( srvid ) , \
ctdb_msgcb ( ( handler ) , ( hdata ) ) , ( hdata ) )
2010-06-04 14:57:03 +04:00
2010-05-24 07:47:36 +04:00
# define ctdb_attachdb_send(ctdb, name, persistent, tdb_flags, cb, cbdata) \
ctdb_attachdb_send ( ( ctdb ) , ( name ) , ( persistent ) , ( tdb_flags ) , \
ctdb_sendcb ( ( cb ) , ( cbdata ) ) , ( cbdata ) )
2010-06-04 08:03:08 +04:00
# define ctdb_readrecordlock_async(_ctdb_db, key, cb, cbdata) \
ctdb_readrecordlock_async ( ( _ctdb_db ) , ( key ) , \
typesafe_cb_preargs ( void , ( cb ) , ( cbdata ) , \
struct ctdb_db * , struct ctdb_lock * , \
TDB_DATA ) , ( cbdata ) )
2010-05-24 07:47:36 +04:00
2010-08-09 10:11:32 +04:00
# define ctdb_set_message_handler_send(ctdb, srvid, handler, hdata, cb, cbdata) \
ctdb_set_message_handler_send ( ( ctdb ) , ( srvid ) , \
ctdb_msgcb ( ( handler ) , ( hdata ) ) , ( hdata ) , \
ctdb_sendcb ( ( cb ) , ( cbdata ) ) , ( cbdata ) )
2010-05-24 07:47:36 +04:00
2010-08-09 10:11:32 +04:00
# define ctdb_remove_message_handler_send(ctdb, srvid, handler, hdata, cb, cbdata) \
2010-05-24 07:47:36 +04:00
ctdb_remove_message_handler_send ( ( ctdb ) , ( srvid ) , \
2010-08-09 10:11:32 +04:00
ctdb_msgcb ( ( handler ) , ( hdata ) ) , ( hdata ) , \
2010-05-24 07:47:36 +04:00
ctdb_sendcb ( ( cb ) , ( cbdata ) ) , ( cbdata ) )
# define ctdb_getpnn_send(ctdb, destnode, cb, cbdata) \
ctdb_getpnn_send ( ( ctdb ) , ( destnode ) , \
ctdb_sendcb ( ( cb ) , ( cbdata ) ) , ( cbdata ) )
# define ctdb_getrecmaster_send(ctdb, destnode, cb, cbdata) \
ctdb_getrecmaster_send ( ( ctdb ) , ( destnode ) , \
ctdb_sendcb ( ( cb ) , ( cbdata ) ) , ( cbdata ) )
2010-09-13 08:28:11 +04:00
# define ctdb_getnodemap_send(ctdb, destnode, cb, cbdata) \
ctdb_getnodemap_send ( ( ctdb ) , ( destnode ) , \
ctdb_sendcb ( ( cb ) , ( cbdata ) ) , ( cbdata ) )
2010-05-20 10:31:28 +04:00
# endif