1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-08 21:18:16 +03:00

wrap the packet queue call

(This used to be ctdb commit 4dd8ffd5752aedcaf0b8ad1941a5f84ec1ca2868)
This commit is contained in:
Andrew Tridgell 2006-12-18 16:26:57 +11:00
parent 1f44ccb569
commit ee547a0f9a
2 changed files with 30 additions and 32 deletions

View File

@ -28,6 +28,19 @@
#include "ctdb_private.h"
/*
queue a packet or die
*/
static void ctdb_queue_packet(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
{
struct ctdb_node *node;
node = ctdb->nodes[hdr->destnode];
if (ctdb->methods->queue_pkt(node, (uint8_t *)hdr, hdr->length) != 0) {
ctdb_fatal(ctdb, "Unable to queue packet\n");
}
}
/*
local version of ctdb_call
*/
@ -108,19 +121,17 @@ static void ctdb_send_error(struct ctdb_context *ctdb,
struct ctdb_reply_error *r;
char *msg;
int len;
struct ctdb_node *node;
va_start(ap, fmt);
msg = talloc_vasprintf(ctdb, fmt, ap);
if (msg == NULL) {
/* can't send an error message, need to rely on call
timeouts instead */
return;
ctdb_fatal(ctdb, "Unable to allocate error in ctdb_send_error\n");
}
va_end(ap);
len = strlen(msg)+1;
r = talloc_size(ctdb, sizeof(*r) + len);
CTDB_NO_MEMORY_FATAL(ctdb, r);
r->hdr.length = sizeof(*r) + len;
r->hdr.operation = CTDB_REPLY_ERROR;
r->hdr.destnode = hdr->srcnode;
@ -132,9 +143,7 @@ static void ctdb_send_error(struct ctdb_context *ctdb,
talloc_free(msg);
node = ctdb->nodes[hdr->srcnode];
ctdb->methods->queue_pkt(node, (uint8_t *)r, r->hdr.length);
ctdb_queue_packet(ctdb, &r->hdr);
talloc_free(r);
}
@ -148,9 +157,9 @@ static void ctdb_call_send_redirect(struct ctdb_context *ctdb,
struct ctdb_ltdb_header *header)
{
struct ctdb_reply_redirect *r;
struct ctdb_node *node;
r = talloc_size(ctdb, sizeof(*r));
CTDB_NO_MEMORY_FATAL(ctdb, r);
r->hdr.length = sizeof(*r);
r->hdr.operation = CTDB_REPLY_REDIRECT;
r->hdr.destnode = c->hdr.srcnode;
@ -158,9 +167,7 @@ static void ctdb_call_send_redirect(struct ctdb_context *ctdb,
r->hdr.reqid = c->hdr.reqid;
r->dmaster = header->dmaster;
node = ctdb->nodes[r->hdr.destnode];
ctdb->methods->queue_pkt(node, (uint8_t *)r, r->hdr.length);
ctdb_queue_packet(ctdb, &r->hdr);
talloc_free(r);
}
@ -178,11 +185,11 @@ static void ctdb_call_send_dmaster(struct ctdb_context *ctdb,
TDB_DATA *key, TDB_DATA *data)
{
struct ctdb_req_dmaster *r;
struct ctdb_node *node;
int len;
len = sizeof(*r) + key->dsize + data->dsize;
r = talloc_size(ctdb, len);
CTDB_NO_MEMORY_FATAL(ctdb, r);
r->hdr.length = len;
r->hdr.operation = CTDB_REQ_DMASTER;
r->hdr.destnode = ctdb_lmaster(ctdb, key);
@ -194,13 +201,11 @@ static void ctdb_call_send_dmaster(struct ctdb_context *ctdb,
memcpy(&r->data[0], key->dptr, key->dsize);
memcpy(&r->data[key->dsize], data->dptr, data->dsize);
node = ctdb->nodes[r->hdr.destnode];
if (r->hdr.destnode == ctdb->vnn && !(ctdb->flags & CTDB_FLAG_SELF_CONNECT)) {
/* we are the lmaster - don't send to ourselves */
ctdb_request_dmaster(ctdb, &r->hdr);
} else {
ctdb->methods->queue_pkt(node, (uint8_t *)r, r->hdr.length);
ctdb_queue_packet(ctdb, &r->hdr);
/* update the ltdb to record the new dmaster */
header->dmaster = r->hdr.destnode;
@ -224,7 +229,6 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
TDB_DATA key, data;
struct ctdb_ltdb_header header;
int ret;
struct ctdb_node *node;
key.dptr = c->data;
key.dsize = c->keylen;
@ -252,6 +256,7 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
/* send the CTDB_REPLY_DMASTER */
r = talloc_size(ctdb, sizeof(*r) + data.dsize);
CTDB_NO_MEMORY_FATAL(ctdb, r);
r->hdr.length = sizeof(*r) + data.dsize;
r->hdr.operation = CTDB_REPLY_DMASTER;
r->hdr.destnode = c->dmaster;
@ -260,9 +265,7 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
r->datalen = data.dsize;
memcpy(&r->data[0], data.dptr, data.dsize);
node = ctdb->nodes[r->hdr.destnode];
ctdb->methods->queue_pkt(node, (uint8_t *)r, r->hdr.length);
ctdb_queue_packet(ctdb, &r->hdr);
talloc_free(r);
}
@ -276,7 +279,6 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
struct ctdb_req_call *c = (struct ctdb_req_call *)hdr;
TDB_DATA key, data, call_data, reply_data;
struct ctdb_reply_call *r;
struct ctdb_node *node;
int ret;
struct ctdb_ltdb_header header;
@ -316,6 +318,7 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
&reply_data, c->hdr.srcnode);
r = talloc_size(ctdb, sizeof(*r) + reply_data.dsize);
CTDB_NO_MEMORY_FATAL(ctdb, r);
r->hdr.length = sizeof(*r) + reply_data.dsize;
r->hdr.operation = CTDB_REPLY_CALL;
r->hdr.destnode = hdr->srcnode;
@ -324,9 +327,7 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
r->datalen = reply_data.dsize;
memcpy(&r->data[0], reply_data.dptr, reply_data.dsize);
node = ctdb->nodes[hdr->srcnode];
ctdb->methods->queue_pkt(node, (uint8_t *)r, r->hdr.length);
ctdb_queue_packet(ctdb, &r->hdr);
talloc_free(reply_data.dptr);
talloc_free(r);
@ -452,11 +453,7 @@ void ctdb_reply_redirect(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
/* send it off again */
state->node = ctdb->nodes[c->dmaster];
if (ctdb->methods->queue_pkt(state->node, (uint8_t *)state->c,
state->c->hdr.length) != 0) {
state->state = CTDB_CALL_ERROR;
state->errmsg = "unable to queue in ctdb_reply_redirect";
}
ctdb_queue_packet(ctdb, &state->c->hdr);
}
/*
@ -569,10 +566,7 @@ struct ctdb_call_state *ctdb_call_send(struct ctdb_context *ctdb,
talloc_set_destructor(state, ctdb_call_destructor);
if (ctdb->methods->queue_pkt(state->node, (uint8_t *)state->c, len) != 0) {
talloc_free(state);
return NULL;
}
ctdb_queue_packet(ctdb, &state->c->hdr);
event_add_timed(ctdb->ev, state, timeval_current_ofs(CTDB_REQ_TIMEOUT, 0),
ctdb_call_timeout, state);

View File

@ -98,6 +98,10 @@ struct ctdb_context {
ctdb_set_error(ctdb, "Out of memory at %s:%d", __FILE__, __LINE__); \
return NULL; }} while (0)
#define CTDB_NO_MEMORY_FATAL(ctdb, p) do { if (!(p)) { \
ctdb_fatal(ctdb, "Out of memory in " __location__ ); \
}} while (0)
/* arbitrary maximum timeout for ctdb operations */
#define CTDB_REQ_TIMEOUT 10