This is going to help for logging, since we want it there.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
struct ctdb_request;
-void ctdb_request_free(struct ctdb_request *req);
+void ctdb_request_free(struct ctdb_connection *ctdb, struct ctdb_request *req);
/*
* Callback for completed requests: it would normally unpack the request
const char *name, int persistent, uint32_t tdb_flags,
ctdb_callback_t callback, void *private_data);
-struct ctdb_db *ctdb_attachdb_recv(struct ctdb_request *req);
+struct ctdb_db *ctdb_attachdb_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req);
struct ctdb_db *ctdb_attachdb(struct ctdb_connection *ctdb,
const char *name, int persistent,
uint32_t destnode,
ctdb_callback_t callback,
void *private_data);
-int ctdb_getpnn_recv(struct ctdb_request *req, uint32_t *pnn);
+int ctdb_getpnn_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req, uint32_t *pnn);
int ctdb_getpnn(struct ctdb_connection *ctdb,
uint32_t destnode,
uint32_t destnode,
ctdb_callback_t callback,
void *private_data);
-int ctdb_getrecmaster_recv(struct ctdb_request *handle,
+int ctdb_getrecmaster_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *handle,
uint32_t *recmaster);
int ctdb_getrecmaster(struct ctdb_connection *ctdb,
uint32_t destnode,
/*
* cancel a request
*/
-int ctdb_cancel(struct ctdb_request *);
+int ctdb_cancel(struct ctdb_connection *ctdb, struct ctdb_request *req);
/* These ugly macro wrappers make the callbacks typesafe. */
#undef ctdb_getrecmaster_send
#undef ctdb_getpnn_send
-int ctdb_getrecmaster_recv(struct ctdb_request *req, uint32_t *recmaster)
+int ctdb_getrecmaster_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req, uint32_t *recmaster)
{
struct ctdb_reply_control *reply;
- reply = unpack_reply_control(req, CTDB_CONTROL_GET_RECMASTER);
+ reply = unpack_reply_control(ctdb, req, CTDB_CONTROL_GET_RECMASTER);
if (!reply || reply->status == -1)
return -1;
*recmaster = reply->status;
callback, private_data);
}
-int ctdb_getpnn_recv(struct ctdb_request *req, uint32_t *pnn)
+int ctdb_getpnn_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req, uint32_t *pnn)
{
struct ctdb_reply_control *reply;
- reply = unpack_reply_control(req, CTDB_CONTROL_GET_PNN);
+ reply = unpack_reply_control(ctdb, req, CTDB_CONTROL_GET_PNN);
if (!reply || reply->status == -1)
return -1;
*pnn = reply->status;
struct ctdb_request *req,
void *unused)
{
- if (ctdb_getpnn_recv(req, &ctdb->pnn) != 0) {
+ if (ctdb_getpnn_recv(ctdb, req, &ctdb->pnn) != 0) {
/* FIXME: Report error. */
ctdb->broken = true;
}
- ctdb_request_free(req);
+ ctdb_request_free(ctdb, req);
}
struct ctdb_connection *ctdb_connect(const char *addr)
return req;
}
-void ctdb_request_free(struct ctdb_request *req)
+void ctdb_request_free(struct ctdb_connection *ctdb, struct ctdb_request *req)
{
if (req->extra_destructor) {
- req->extra_destructor(req);
+ req->extra_destructor(ctdb, req);
}
if (req->reply) {
free_io_elem(req->reply);
/* Sanity-checking wrapper for reply.
* FIXME: logging! */
-static struct ctdb_reply_call *unpack_reply_call(struct ctdb_request *req,
+static struct ctdb_reply_call *unpack_reply_call(struct ctdb_connection *ctdb,
+ struct ctdb_request *req,
uint32_t callid)
{
size_t len;
/* Sanity-checking wrapper for reply.
* FIXME: logging! */
-struct ctdb_reply_control *unpack_reply_control(struct ctdb_request *req,
+struct ctdb_reply_control *unpack_reply_control(struct ctdb_connection *ctdb,
+ struct ctdb_request *req,
enum ctdb_controls control)
{
size_t len;
struct ctdb_request *req,
void *unused)
{
- ctdb_request_free(req);
+ ctdb_request_free(ctdb, req);
}
-int ctdb_cancel(struct ctdb_request *req)
+int ctdb_cancel(struct ctdb_connection *ctdb, struct ctdb_request *req)
{
/* FIXME: If it's not sent, we could just free it right now. */
req->callback = ctdb_cancel_callback;
db->callback(ctdb, req->extra, db->private_data);
}
-struct ctdb_db *ctdb_attachdb_recv(struct ctdb_request *req)
+struct ctdb_db *ctdb_attachdb_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req)
{
struct ctdb_request *dbpath_req = req->extra;
struct ctdb_reply_control *reply;
return NULL;
}
- reply = unpack_reply_control(dbpath_req, CTDB_CONTROL_GETDBPATH);
+ reply = unpack_reply_control(ctdb, dbpath_req, CTDB_CONTROL_GETDBPATH);
if (!reply || reply->status != 0) {
return NULL;
}
control = CTDB_CONTROL_DB_ATTACH_PERSISTENT;
}
- reply = unpack_reply_control(req, control);
+ reply = unpack_reply_control(ctdb, req, control);
if (!reply || reply->status != 0) {
/* We failed. Hand request to user and have them discover it
* via ctdb_attachdb_recv. */
req2->extra = req;
}
-static void destroy_req_db(struct ctdb_request *req)
+static void destroy_req_db(struct ctdb_connection *ctdb,
+ struct ctdb_request *req)
{
/* Incomplete db is in priv_data. */
free(req->priv_data);
/* second request is chained off this one. */
if (req->extra) {
- ctdb_request_free(req->extra);
+ ctdb_request_free(ctdb, req->extra);
}
}
}
/* If they shutdown before we hand them the lock, we free it here. */
-static void destroy_lock(struct ctdb_request *req)
+static void destroy_lock(struct ctdb_connection *ctdb,
+ struct ctdb_request *req)
{
ctdb_release_lock(req->extra);
ctdb_free_lock(req->extra);
TDB_DATA data;
/* OK, we've received reply to noop migration */
- reply = unpack_reply_call(req, CTDB_NULL_FUNC);
+ reply = unpack_reply_call(ctdb, req, CTDB_NULL_FUNC);
if (!reply || reply->status != 0) {
lock->callback(lock->ctdb_db, NULL, tdb_null, private);
- ctdb_request_free(req); /* Also frees lock. */
+ ctdb_request_free(ctdb, req); /* Also frees lock. */
ctdb_free_lock(lock);
return;
}
void *priv_data;
/* Extra per-request info. */
- void (*extra_destructor)(struct ctdb_request *);
+ void (*extra_destructor)(struct ctdb_connection *,
+ struct ctdb_request *);
void *extra;
};
ctdb_callback_t, void *);
uint32_t new_reqid(struct ctdb_connection *ctdb);
-struct ctdb_reply_control *unpack_reply_control(struct ctdb_request *req,
+struct ctdb_reply_control *unpack_reply_control(struct ctdb_connection *ctdb,
+ struct ctdb_request *req,
enum ctdb_controls control);
void ctdb_cancel_callback(struct ctdb_connection *ctdb,
struct ctdb_request *req,
struct message_handler_info *info = req->extra;
struct ctdb_reply_control *reply;
- reply = unpack_reply_control(req, CTDB_CONTROL_REGISTER_SRVID);
+ reply = unpack_reply_control(ctdb, req, CTDB_CONTROL_REGISTER_SRVID);
if (!reply || reply->status != 0) {
return -1;
}
return 0;
}
-static void free_info(struct ctdb_request *req)
+static void free_info(struct ctdb_connection *ctdb, struct ctdb_request *req)
{
free(req->extra);
}
#include <poll.h>
#include <errno.h>
#include <stdlib.h>
+#include "libctdb_private.h"
/* On failure, frees req and returns NULL. */
-static struct ctdb_request *wait_for(struct ctdb_connection *ctdb,
- struct ctdb_request *req,
- bool *done)
+static struct ctdb_request *synchronous(struct ctdb_connection *ctdb,
+ struct ctdb_request *req,
+ bool *done)
{
struct pollfd fds;
/* Signalled is OK, other error is bad. */
if (errno == EINTR)
continue;
- ctdb_request_free(req);
+ ctdb_request_free(ctdb, req);
return NULL;
}
if (ctdb_service(ctdb, fds.revents) < 0) {
- ctdb_request_free(req);
+ ctdb_request_free(ctdb, req);
return NULL;
}
}
bool done = false;
int ret = -1;
- req = wait_for(ctdb,
- ctdb_getrecmaster_send(ctdb, destnode, set, &done),
- &done);
+ req = synchronous(ctdb,
+ ctdb_getrecmaster_send(ctdb, destnode, set, &done),
+ &done);
if (req != NULL) {
- ret = ctdb_getrecmaster_recv(req, recmaster);
- ctdb_request_free(req);
+ ret = ctdb_getrecmaster_recv(ctdb, req, recmaster);
+ ctdb_request_free(ctdb, req);
}
return ret;
}
bool done = false;
struct ctdb_db *ret = NULL;
- req = wait_for(ctdb,
- ctdb_attachdb_send(ctdb, name, persistent, tdb_flags,
- set, &done),
- &done);
+ req = synchronous(ctdb,
+ ctdb_attachdb_send(ctdb, name, persistent, tdb_flags,
+ set, &done),
+ &done);
if (req != NULL) {
- ret = ctdb_attachdb_recv(req);
- ctdb_request_free(req);
+ ret = ctdb_attachdb_recv(ctdb, req);
+ ctdb_request_free(ctdb, req);
}
return ret;
}
bool done = false;
int ret = -1;
- req = wait_for(ctdb,
- ctdb_getpnn_send(ctdb, destnode, set, &done),
- &done);
+ req = synchronous(ctdb,
+ ctdb_getpnn_send(ctdb, destnode, set, &done),
+ &done);
if (req != NULL) {
- ret = ctdb_getpnn_recv(req, pnn);
- ctdb_request_free(req);
+ ret = ctdb_getpnn_recv(ctdb, req, pnn);
+ ctdb_request_free(ctdb, req);
}
return ret;
}
int status;
uint32_t pnn;
- status = ctdb_getpnn_recv(req, &pnn);
- ctdb_request_free(req);
+ status = ctdb_getpnn_recv(ctdb, req, &pnn);
+ ctdb_request_free(ctdb, req);
if (status != 0) {
printf("Error reading PNN\n");
return;
int status;
uint32_t rm;
- status = ctdb_getrecmaster_recv(req, &rm);
- ctdb_request_free(req);
+ status = ctdb_getrecmaster_recv(ctdb, req, &rm);
+ ctdb_request_free(ctdb, req);
if (status != 0) {
printf("Error reading RECMASTER\n");
return;
if (ctdb_set_message_handler_recv(ctdb, req) != 0) {
err(1, "registering message");
}
- ctdb_request_free(req);
+ ctdb_request_free(ctdb, req);
printf("Message handler registered\n");
registered = true;
}