9 #include "lib/tdb/include/tdb.h"
10 #include "include/ctdb.h"
14 void msg_h(struct ctdb_connection *ctdb, uint64_t srvid, TDB_DATA data, void *private_data)
16 printf("Message received on port %d : %s\n", (int)srvid, data.dptr);
19 void pnn_cb(int32_t status, uint32_t pnn, void *private_data)
22 printf("Error reading PNN\n");
25 printf("status:%d pnn:%d\n", status, pnn);
28 void rm_cb(int status, uint32_t rm, void *private_data)
31 printf("Error reading RECMASTER\n");
35 printf("GETRECMASTER ASYNC: status:%d recmaster:%d\n", status, rm);
40 * example on how to first read(non-existing recortds are implicitely created
41 * on demand) a record and change it in the callback.
42 * This forms the atom for the read-modify-write cycle.
44 * Pure read, or pure write are just special cases of this cycle.
46 void rrl_cb(int32_t status, struct ctdb_lock *lock, TDB_DATA outdata, void *private_data)
52 printf("rrl_cb returned error: status %d\n", status);
56 printf("rrl size:%d data:%.*s\n", outdata.dsize,
57 outdata.dsize, outdata.dptr);
58 if (outdata.dsize == 0) {
61 strcpy(tmp, outdata.dptr);
66 data.dsize = strlen(tmp) + 1;
67 ctdb_writerecord(lock, data);
69 printf("Wrote new record : %s\n", tmp);
71 ctdb_release_lock(lock);
74 static bool registered = false;
75 void message_handler_cb(int status, void *private_data)
77 printf("Message handler registered: %i\n", status);
81 int main(int argc, char *argv[])
83 struct ctdb_connection *ctdb_connection;
84 struct ctdb_request *handle;
85 struct ctdb_db *ctdb_db_context;
91 ctdb_connection = ctdb_connect("/tmp/ctdb.socket");
93 err(1, "Connecting to /tmp/ctdb.socket");
95 pfd.fd = ctdb_get_fd(ctdb_connection);
97 handle = ctdb_set_message_handler_send(ctdb_connection, 55, message_handler_cb, msg_h, NULL);
99 printf("Failed to register message port\n");
103 /* Hack for testing: this makes sure registration goes out. */
104 while (!registered) {
105 ctdb_service(ctdb_connection, POLLIN|POLLOUT);
108 msg.dptr="HelloWorld";
109 msg.dsize = strlen(msg.dptr);
111 ret = ctdb_send_message(ctdb_connection, 0, 55, msg);
113 printf("Failed to send message. Aborting\n");
117 handle = ctdb_getrecmaster_send(ctdb_connection, 0, rm_cb, NULL);
118 if (handle == NULL) {
119 printf("Failed to send get_recmaster control\n");
123 ctdb_db_context = ctdb_attachdb(ctdb_connection, "test_test.tdb", 0, 0);
124 if (!ctdb_db_context) {
125 printf("Failed to attach to database\n");
130 * SYNC call with callback to read the recmaster
131 * calls the blocking sync function.
132 * Avoid this mode for performance critical tasks
134 ret = ctdb_getrecmaster(ctdb_connection, CTDB_CURRENT_NODE, &recmaster);
136 printf("Failed to receive response to getrecmaster\n");
139 printf("GETRECMASTER SYNC: status:%d recmaster:%d\n", ret, recmaster);
142 handle = ctdb_getpnn_send(ctdb_connection, CTDB_CURRENT_NODE,
144 if (handle == NULL) {
145 printf("Failed to send get_pnn control\n");
149 handle = ctdb_readrecordlock_send(ctdb_db_context, key, rrl_cb,
151 if (handle == NULL) {
152 printf("Failed to send READRECORDLOCK\n");
158 pfd.events = ctdb_which_events(ctdb_connection);
159 if (poll(&pfd, 1, -1) < 0) {
160 printf("Poll failed");
163 if (ctdb_service(ctdb_connection, pfd.revents) < 0) {
164 err(1, "Failed to service");