mirror of
https://github.com/samba-team/samba.git
synced 2025-01-10 01:18:15 +03:00
ctdb-daemon: Replace ctdb_message with srvid abstraction
Signed-off-by: Amitay Isaacs <amitay@gmail.com> Reviewed-by: Martin Schwenke <martin@meltin.net>
This commit is contained in:
parent
6272ef0d09
commit
62f1e2579a
@ -178,6 +178,22 @@ static void ctdb_client_reply_call(struct ctdb_context *ctdb, struct ctdb_req_he
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ctdb_request_message(struct ctdb_context *ctdb,
|
||||||
|
struct ctdb_req_header *hdr)
|
||||||
|
{
|
||||||
|
struct ctdb_req_message *c = (struct ctdb_req_message *)hdr;
|
||||||
|
TDB_DATA data;
|
||||||
|
|
||||||
|
data.dsize = c->datalen;
|
||||||
|
data.dptr = talloc_memdup(c, &c->data[0], c->datalen);
|
||||||
|
if (data.dptr == NULL) {
|
||||||
|
DEBUG(DEBUG_ERR, (__location__ " Memory allocation failure\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
srvid_dispatch(ctdb->srv, c->srvid, CTDB_SRVID_ALL, data);
|
||||||
|
}
|
||||||
|
|
||||||
static void ctdb_client_reply_control(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
|
static void ctdb_client_reply_control(struct ctdb_context *ctdb, struct ctdb_req_header *hdr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -472,7 +488,7 @@ int ctdb_call(struct ctdb_db_context *ctdb_db, struct ctdb_call *call)
|
|||||||
handler function in the client
|
handler function in the client
|
||||||
*/
|
*/
|
||||||
int ctdb_client_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
int ctdb_client_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
||||||
ctdb_msg_fn_t handler,
|
srvid_handler_fn handler,
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
@ -486,7 +502,7 @@ int ctdb_client_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* also need to register the handler with our own ctdb structure */
|
/* also need to register the handler with our own ctdb structure */
|
||||||
return ctdb_register_message_handler(ctdb, ctdb, srvid, handler, private_data);
|
return srvid_register(ctdb->srv, ctdb, srvid, handler, private_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -505,7 +521,7 @@ int ctdb_client_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* also need to register the handler with our own ctdb structure */
|
/* also need to register the handler with our own ctdb structure */
|
||||||
ctdb_deregister_message_handler(ctdb, srvid, private_data);
|
srvid_deregister(ctdb->srv, srvid, private_data);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2182,7 +2198,7 @@ struct traverse_state {
|
|||||||
/*
|
/*
|
||||||
called on each key during a ctdb_traverse
|
called on each key during a ctdb_traverse
|
||||||
*/
|
*/
|
||||||
static void traverse_handler(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA data, void *p)
|
static void traverse_handler(uint64_t srvid, TDB_DATA data, void *p)
|
||||||
{
|
{
|
||||||
struct traverse_state *state = (struct traverse_state *)p;
|
struct traverse_state *state = (struct traverse_state *)p;
|
||||||
struct ctdb_rec_data *d = (struct ctdb_rec_data *)data.dptr;
|
struct ctdb_rec_data *d = (struct ctdb_rec_data *)data.dptr;
|
||||||
@ -3295,6 +3311,13 @@ struct ctdb_context *ctdb_init(struct event_context *ev)
|
|||||||
ctdb->lastid = INT_MAX-200;
|
ctdb->lastid = INT_MAX-200;
|
||||||
CTDB_NO_MEMORY_NULL(ctdb, ctdb->idr);
|
CTDB_NO_MEMORY_NULL(ctdb, ctdb->idr);
|
||||||
|
|
||||||
|
ret = srvid_init(ctdb, &ctdb->srv);
|
||||||
|
if (ret != 0) {
|
||||||
|
DEBUG(DEBUG_ERR, ("srvid_init failed (%s)\n", strerror(ret)));
|
||||||
|
talloc_free(ctdb);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = ctdb_set_socketname(ctdb, CTDB_SOCKET);
|
ret = ctdb_set_socketname(ctdb, CTDB_SOCKET);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
DEBUG(DEBUG_ERR,(__location__ " ctdb_set_socketname failed.\n"));
|
DEBUG(DEBUG_ERR,(__location__ " ctdb_set_socketname failed.\n"));
|
||||||
|
@ -1,286 +0,0 @@
|
|||||||
/*
|
|
||||||
ctdb_message protocol code
|
|
||||||
|
|
||||||
Copyright (C) Andrew Tridgell 2007
|
|
||||||
Copyright (C) Amitay Isaacs 2013
|
|
||||||
|
|
||||||
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/>.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
see http://wiki.samba.org/index.php/Samba_%26_Clustering for
|
|
||||||
protocol design and packet details
|
|
||||||
*/
|
|
||||||
#include "includes.h"
|
|
||||||
#include "tdb.h"
|
|
||||||
#include "system/network.h"
|
|
||||||
#include "system/filesys.h"
|
|
||||||
#include "../include/ctdb_private.h"
|
|
||||||
#include "lib/util/dlinklist.h"
|
|
||||||
|
|
||||||
static int message_list_db_init(struct ctdb_context *ctdb)
|
|
||||||
{
|
|
||||||
ctdb->message_list_indexdb = tdb_open("messagedb", 8192,
|
|
||||||
TDB_INTERNAL|
|
|
||||||
TDB_INCOMPATIBLE_HASH|
|
|
||||||
TDB_DISALLOW_NESTING,
|
|
||||||
O_RDWR|O_CREAT, 0);
|
|
||||||
if (ctdb->message_list_indexdb == NULL) {
|
|
||||||
DEBUG(DEBUG_ERR, ("Failed to create message list indexdb\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int message_list_db_add(struct ctdb_context *ctdb, uint64_t srvid,
|
|
||||||
struct ctdb_message_list_header *h)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
TDB_DATA key, data;
|
|
||||||
|
|
||||||
if (ctdb->message_list_indexdb == NULL) {
|
|
||||||
ret = message_list_db_init(ctdb);
|
|
||||||
if (ret < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
key.dptr = (uint8_t *)&srvid;
|
|
||||||
key.dsize = sizeof(uint64_t);
|
|
||||||
|
|
||||||
data.dptr = (uint8_t *)&h;
|
|
||||||
data.dsize = sizeof(struct ctdb_message_list_header *);
|
|
||||||
|
|
||||||
ret = tdb_store(ctdb->message_list_indexdb, key, data, TDB_INSERT);
|
|
||||||
if (ret < 0) {
|
|
||||||
DEBUG(DEBUG_ERR, ("Failed to add message list handler (%s)\n",
|
|
||||||
tdb_errorstr(ctdb->message_list_indexdb)));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int message_list_db_delete(struct ctdb_context *ctdb, uint64_t srvid)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
TDB_DATA key;
|
|
||||||
|
|
||||||
if (ctdb->message_list_indexdb == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
key.dptr = (uint8_t *)&srvid;
|
|
||||||
key.dsize = sizeof(uint64_t);
|
|
||||||
|
|
||||||
ret = tdb_delete(ctdb->message_list_indexdb, key);
|
|
||||||
if (ret < 0) {
|
|
||||||
DEBUG(DEBUG_ERR, ("Failed to delete message list handler (%s)\n",
|
|
||||||
tdb_errorstr(ctdb->message_list_indexdb)));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int message_list_db_fetch_parser(TDB_DATA key, TDB_DATA data,
|
|
||||||
void *private_data)
|
|
||||||
{
|
|
||||||
struct ctdb_message_list_header **h =
|
|
||||||
(struct ctdb_message_list_header **)private_data;
|
|
||||||
|
|
||||||
if (data.dsize != sizeof(struct ctdb_message_list_header *)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*h = *(struct ctdb_message_list_header **)data.dptr;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int message_list_db_fetch(struct ctdb_context *ctdb, uint64_t srvid,
|
|
||||||
struct ctdb_message_list_header **h)
|
|
||||||
{
|
|
||||||
TDB_DATA key;
|
|
||||||
|
|
||||||
if (ctdb->message_list_indexdb == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
key.dptr = (uint8_t *)&srvid;
|
|
||||||
key.dsize = sizeof(uint64_t);
|
|
||||||
|
|
||||||
return tdb_parse_record(ctdb->message_list_indexdb, key,
|
|
||||||
message_list_db_fetch_parser, h);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
this dispatches the messages to the registered ctdb message handler
|
|
||||||
*/
|
|
||||||
int ctdb_dispatch_message(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA data)
|
|
||||||
{
|
|
||||||
struct ctdb_message_list_header *h;
|
|
||||||
struct ctdb_message_list *m;
|
|
||||||
uint64_t srvid_all = CTDB_SRVID_ALL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = message_list_db_fetch(ctdb, srvid, &h);
|
|
||||||
if (ret == 0) {
|
|
||||||
for (m=h->m; m; m=m->next) {
|
|
||||||
m->message_handler(ctdb, srvid, data, m->message_private);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = message_list_db_fetch(ctdb, srvid_all, &h);
|
|
||||||
if (ret == 0) {
|
|
||||||
for(m=h->m; m; m=m->next) {
|
|
||||||
m->message_handler(ctdb, srvid, data, m->message_private);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
called when a CTDB_REQ_MESSAGE packet comes in
|
|
||||||
*/
|
|
||||||
void ctdb_request_message(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
|
|
||||||
{
|
|
||||||
struct ctdb_req_message *c = (struct ctdb_req_message *)hdr;
|
|
||||||
TDB_DATA data;
|
|
||||||
|
|
||||||
data.dsize = c->datalen;
|
|
||||||
data.dptr = talloc_memdup(c, &c->data[0], c->datalen);
|
|
||||||
|
|
||||||
ctdb_dispatch_message(ctdb, c->srvid, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When header is freed, remove all the srvid handlers
|
|
||||||
*/
|
|
||||||
static int message_header_destructor(struct ctdb_message_list_header *h)
|
|
||||||
{
|
|
||||||
struct ctdb_message_list *m;
|
|
||||||
|
|
||||||
while (h->m != NULL) {
|
|
||||||
m = h->m;
|
|
||||||
DLIST_REMOVE(h->m, m);
|
|
||||||
TALLOC_FREE(m);
|
|
||||||
}
|
|
||||||
|
|
||||||
message_list_db_delete(h->ctdb, h->srvid);
|
|
||||||
DLIST_REMOVE(h->ctdb->message_list_header, h);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
when a client goes away, we need to remove its srvid handler from the list
|
|
||||||
*/
|
|
||||||
static int message_handler_destructor(struct ctdb_message_list *m)
|
|
||||||
{
|
|
||||||
struct ctdb_message_list_header *h = m->h;
|
|
||||||
|
|
||||||
DLIST_REMOVE(h->m, m);
|
|
||||||
if (h->m == NULL) {
|
|
||||||
talloc_free(h);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
setup handler for receipt of ctdb messages from ctdb_send_message()
|
|
||||||
*/
|
|
||||||
int ctdb_register_message_handler(struct ctdb_context *ctdb,
|
|
||||||
TALLOC_CTX *mem_ctx,
|
|
||||||
uint64_t srvid,
|
|
||||||
ctdb_msg_fn_t handler,
|
|
||||||
void *private_data)
|
|
||||||
{
|
|
||||||
struct ctdb_message_list_header *h;
|
|
||||||
struct ctdb_message_list *m;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
m = talloc_zero(mem_ctx, struct ctdb_message_list);
|
|
||||||
CTDB_NO_MEMORY(ctdb, m);
|
|
||||||
|
|
||||||
m->message_handler = handler;
|
|
||||||
m->message_private = private_data;
|
|
||||||
|
|
||||||
ret = message_list_db_fetch(ctdb, srvid, &h);
|
|
||||||
if (ret != 0) {
|
|
||||||
/* srvid not registered yet */
|
|
||||||
h = talloc_zero(ctdb, struct ctdb_message_list_header);
|
|
||||||
CTDB_NO_MEMORY(ctdb, h);
|
|
||||||
|
|
||||||
h->ctdb = ctdb;
|
|
||||||
h->srvid = srvid;
|
|
||||||
|
|
||||||
ret = message_list_db_add(ctdb, srvid, h);
|
|
||||||
if (ret < 0) {
|
|
||||||
talloc_free(m);
|
|
||||||
talloc_free(h);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
DLIST_ADD(ctdb->message_list_header, h);
|
|
||||||
talloc_set_destructor(h, message_header_destructor);
|
|
||||||
}
|
|
||||||
|
|
||||||
m->h = h;
|
|
||||||
DLIST_ADD(h->m, m);
|
|
||||||
talloc_set_destructor(m, message_handler_destructor);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
setup handler for receipt of ctdb messages from ctdb_send_message()
|
|
||||||
*/
|
|
||||||
int ctdb_deregister_message_handler(struct ctdb_context *ctdb, uint64_t srvid, void *private_data)
|
|
||||||
{
|
|
||||||
struct ctdb_message_list_header *h;
|
|
||||||
struct ctdb_message_list *m;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = message_list_db_fetch(ctdb, srvid, &h);
|
|
||||||
if (ret != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (m=h->m; m; m=m->next) {
|
|
||||||
if (m->message_private == private_data) {
|
|
||||||
talloc_free(m);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* check if the given srvid exists
|
|
||||||
*/
|
|
||||||
bool ctdb_check_message_handler(struct ctdb_context *ctdb, uint64_t srvid)
|
|
||||||
{
|
|
||||||
struct ctdb_message_list_header *h;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = message_list_db_fetch(ctdb, srvid, &h);
|
|
||||||
if (ret != 0 || h->m == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
1
ctdb/include/common/srvid.h
Symbolic link
1
ctdb/include/common/srvid.h
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../common/srvid.h
|
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#ifndef _CTDB_CLIENT_H
|
#ifndef _CTDB_CLIENT_H
|
||||||
#define _CTDB_CLIENT_H
|
#define _CTDB_CLIENT_H
|
||||||
|
|
||||||
|
#include "common/srvid.h"
|
||||||
#include "ctdb_protocol.h"
|
#include "ctdb_protocol.h"
|
||||||
|
|
||||||
enum control_state {CTDB_CONTROL_WAIT, CTDB_CONTROL_DONE, CTDB_CONTROL_ERROR, CTDB_CONTROL_TIMEOUT};
|
enum control_state {CTDB_CONTROL_WAIT, CTDB_CONTROL_DONE, CTDB_CONTROL_ERROR, CTDB_CONTROL_TIMEOUT};
|
||||||
@ -127,8 +129,8 @@ uint32_t ctdb_get_pnn(struct ctdb_context *ctdb);
|
|||||||
typedef void (*ctdb_msg_fn_t)(struct ctdb_context *, uint64_t srvid,
|
typedef void (*ctdb_msg_fn_t)(struct ctdb_context *, uint64_t srvid,
|
||||||
TDB_DATA data, void *);
|
TDB_DATA data, void *);
|
||||||
int ctdb_client_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
int ctdb_client_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
||||||
ctdb_msg_fn_t handler,
|
srvid_handler_fn handler,
|
||||||
void *private_data);
|
void *private_data);
|
||||||
int ctdb_client_remove_message_handler(struct ctdb_context *ctdb,
|
int ctdb_client_remove_message_handler(struct ctdb_context *ctdb,
|
||||||
uint64_t srvid, void *private_data);
|
uint64_t srvid, void *private_data);
|
||||||
int ctdb_client_check_message_handlers(struct ctdb_context *ctdb,
|
int ctdb_client_check_message_handlers(struct ctdb_context *ctdb,
|
||||||
@ -159,12 +161,6 @@ int ctdb_record_store(struct ctdb_record_handle *h, TDB_DATA data);
|
|||||||
int ctdb_fetch(struct ctdb_db_context *ctdb_db, TALLOC_CTX *mem_ctx,
|
int ctdb_fetch(struct ctdb_db_context *ctdb_db, TALLOC_CTX *mem_ctx,
|
||||||
TDB_DATA key, TDB_DATA *data);
|
TDB_DATA key, TDB_DATA *data);
|
||||||
|
|
||||||
int ctdb_register_message_handler(struct ctdb_context *ctdb,
|
|
||||||
TALLOC_CTX *mem_ctx,
|
|
||||||
uint64_t srvid,
|
|
||||||
ctdb_msg_fn_t handler,
|
|
||||||
void *private_data);
|
|
||||||
|
|
||||||
struct ctdb_db_context *find_ctdb_db(struct ctdb_context *ctdb, uint32_t id);
|
struct ctdb_db_context *find_ctdb_db(struct ctdb_context *ctdb, uint32_t id);
|
||||||
|
|
||||||
|
|
||||||
|
@ -264,21 +264,6 @@ struct ctdb_upcalls {
|
|||||||
void (*node_connected)(struct ctdb_node *);
|
void (*node_connected)(struct ctdb_node *);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* list of message handlers - needs to be changed to a more efficient data
|
|
||||||
structure so we can find a message handler given a srvid quickly */
|
|
||||||
struct ctdb_message_list_header {
|
|
||||||
struct ctdb_message_list_header *next, *prev;
|
|
||||||
struct ctdb_context *ctdb;
|
|
||||||
uint64_t srvid;
|
|
||||||
struct ctdb_message_list *m;
|
|
||||||
};
|
|
||||||
struct ctdb_message_list {
|
|
||||||
struct ctdb_message_list *next, *prev;
|
|
||||||
struct ctdb_message_list_header *h;
|
|
||||||
ctdb_msg_fn_t message_handler;
|
|
||||||
void *message_private;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* additional data required for the daemon mode */
|
/* additional data required for the daemon mode */
|
||||||
struct ctdb_daemon_data {
|
struct ctdb_daemon_data {
|
||||||
int sd;
|
int sd;
|
||||||
@ -479,8 +464,7 @@ struct ctdb_context {
|
|||||||
const struct ctdb_upcalls *upcalls; /* transport upcalls */
|
const struct ctdb_upcalls *upcalls; /* transport upcalls */
|
||||||
void *private_data; /* private to transport */
|
void *private_data; /* private to transport */
|
||||||
struct ctdb_db_context *db_list;
|
struct ctdb_db_context *db_list;
|
||||||
struct ctdb_message_list_header *message_list_header;
|
struct srvid_context *srv;
|
||||||
struct tdb_context *message_list_indexdb;
|
|
||||||
struct ctdb_daemon_data daemon;
|
struct ctdb_daemon_data daemon;
|
||||||
struct ctdb_statistics statistics;
|
struct ctdb_statistics statistics;
|
||||||
struct ctdb_statistics statistics_current;
|
struct ctdb_statistics statistics_current;
|
||||||
@ -970,11 +954,7 @@ int32_t ctdb_control_traverse_data(struct ctdb_context *ctdb, TDB_DATA data, TDB
|
|||||||
int32_t ctdb_control_traverse_kill(struct ctdb_context *ctdb, TDB_DATA indata,
|
int32_t ctdb_control_traverse_kill(struct ctdb_context *ctdb, TDB_DATA indata,
|
||||||
TDB_DATA *outdata, uint32_t srcnode);
|
TDB_DATA *outdata, uint32_t srcnode);
|
||||||
|
|
||||||
int ctdb_dispatch_message(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA data);
|
|
||||||
bool ctdb_check_message_handler(struct ctdb_context *ctdb, uint64_t srvid);
|
|
||||||
|
|
||||||
int daemon_register_message_handler(struct ctdb_context *ctdb, uint32_t client_id, uint64_t srvid);
|
int daemon_register_message_handler(struct ctdb_context *ctdb, uint32_t client_id, uint64_t srvid);
|
||||||
int ctdb_deregister_message_handler(struct ctdb_context *ctdb, uint64_t srvid, void *private_data);
|
|
||||||
int daemon_deregister_message_handler(struct ctdb_context *ctdb, uint32_t client_id, uint64_t srvid);
|
int daemon_deregister_message_handler(struct ctdb_context *ctdb, uint32_t client_id, uint64_t srvid);
|
||||||
int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata,
|
int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata,
|
||||||
TDB_DATA *outdata);
|
TDB_DATA *outdata);
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "lib/util/debug.h"
|
#include "lib/util/debug.h"
|
||||||
#include "lib/util/samba_util.h"
|
#include "lib/util/samba_util.h"
|
||||||
|
|
||||||
|
#include "common/srvid.h"
|
||||||
#include "ctdb_client.h"
|
#include "ctdb_client.h"
|
||||||
#include "ctdb_logging.h"
|
#include "ctdb_logging.h"
|
||||||
|
|
||||||
|
@ -127,8 +127,8 @@ static int daemon_queue_send(struct ctdb_client *client, struct ctdb_req_header
|
|||||||
message handler for when we are in daemon mode. This redirects the message
|
message handler for when we are in daemon mode. This redirects the message
|
||||||
to the right client
|
to the right client
|
||||||
*/
|
*/
|
||||||
static void daemon_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void daemon_message_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_client *client = talloc_get_type(private_data, struct ctdb_client);
|
struct ctdb_client *client = talloc_get_type(private_data, struct ctdb_client);
|
||||||
struct ctdb_req_message *r;
|
struct ctdb_req_message *r;
|
||||||
@ -136,9 +136,9 @@ static void daemon_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
|||||||
|
|
||||||
/* construct a message to send to the client containing the data */
|
/* construct a message to send to the client containing the data */
|
||||||
len = offsetof(struct ctdb_req_message, data) + data.dsize;
|
len = offsetof(struct ctdb_req_message, data) + data.dsize;
|
||||||
r = ctdbd_allocate_pkt(ctdb, ctdb, CTDB_REQ_MESSAGE,
|
r = ctdbd_allocate_pkt(client->ctdb, client->ctdb, CTDB_REQ_MESSAGE,
|
||||||
len, struct ctdb_req_message);
|
len, struct ctdb_req_message);
|
||||||
CTDB_NO_MEMORY_VOID(ctdb, r);
|
CTDB_NO_MEMORY_VOID(client->ctdb, r);
|
||||||
|
|
||||||
talloc_set_name_const(r, "req_message packet");
|
talloc_set_name_const(r, "req_message packet");
|
||||||
|
|
||||||
@ -163,7 +163,8 @@ int daemon_register_message_handler(struct ctdb_context *ctdb, uint32_t client_i
|
|||||||
DEBUG(DEBUG_ERR,("Bad client_id in daemon_request_register_message_handler\n"));
|
DEBUG(DEBUG_ERR,("Bad client_id in daemon_request_register_message_handler\n"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
res = ctdb_register_message_handler(ctdb, client, srvid, daemon_message_handler, client);
|
res = srvid_register(ctdb->srv, client, srvid, daemon_message_handler,
|
||||||
|
client);
|
||||||
if (res != 0) {
|
if (res != 0) {
|
||||||
DEBUG(DEBUG_ERR,(__location__ " Failed to register handler %llu in daemon\n",
|
DEBUG(DEBUG_ERR,(__location__ " Failed to register handler %llu in daemon\n",
|
||||||
(unsigned long long)srvid));
|
(unsigned long long)srvid));
|
||||||
@ -186,7 +187,7 @@ int daemon_deregister_message_handler(struct ctdb_context *ctdb, uint32_t client
|
|||||||
DEBUG(DEBUG_ERR,("Bad client_id in daemon_request_deregister_message_handler\n"));
|
DEBUG(DEBUG_ERR,("Bad client_id in daemon_request_deregister_message_handler\n"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return ctdb_deregister_message_handler(ctdb, srvid, client);
|
return srvid_deregister(ctdb->srv, srvid, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata,
|
int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata,
|
||||||
@ -211,7 +212,7 @@ int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (i=0; i<num_ids; i++) {
|
for (i=0; i<num_ids; i++) {
|
||||||
if (ctdb_check_message_handler(ctdb, ids[i])) {
|
if (srvid_exists(ctdb->srv, ids[i]) == 0) {
|
||||||
results[i/8] |= (1 << (i%8));
|
results[i/8] |= (1 << (i%8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1257,6 +1258,11 @@ int ctdb_start_daemon(struct ctdb_context *ctdb, bool do_fork)
|
|||||||
|
|
||||||
ctdb_set_child_logging(ctdb);
|
ctdb_set_child_logging(ctdb);
|
||||||
|
|
||||||
|
if (srvid_init(ctdb, &ctdb->srv) != 0) {
|
||||||
|
DEBUG(DEBUG_CRIT,("Failed to setup message srvid context\n"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* initialize statistics collection */
|
/* initialize statistics collection */
|
||||||
ctdb_statistics_init(ctdb);
|
ctdb_statistics_init(ctdb);
|
||||||
|
|
||||||
@ -1558,15 +1564,10 @@ struct ctdb_local_message {
|
|||||||
static void ctdb_local_message_trigger(struct event_context *ev, struct timed_event *te,
|
static void ctdb_local_message_trigger(struct event_context *ev, struct timed_event *te,
|
||||||
struct timeval t, void *private_data)
|
struct timeval t, void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_local_message *m = talloc_get_type(private_data,
|
struct ctdb_local_message *m = talloc_get_type(
|
||||||
struct ctdb_local_message);
|
private_data, struct ctdb_local_message);
|
||||||
int res;
|
|
||||||
|
|
||||||
res = ctdb_dispatch_message(m->ctdb, m->srvid, m->data);
|
srvid_dispatch(m->ctdb->srv, m->srvid, CTDB_SRVID_ALL, m->data);
|
||||||
if (res != 0) {
|
|
||||||
DEBUG(DEBUG_ERR, (__location__ " Failed to dispatch message for srvid=%llu\n",
|
|
||||||
(unsigned long long)m->srvid));
|
|
||||||
}
|
|
||||||
talloc_free(m);
|
talloc_free(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1063,10 +1063,12 @@ static bool vacuum_fetch_process_one(struct ctdb_db_context *ctdb_db,
|
|||||||
/*
|
/*
|
||||||
handler for vacuum fetch
|
handler for vacuum fetch
|
||||||
*/
|
*/
|
||||||
static void vacuum_fetch_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void vacuum_fetch_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data, struct ctdb_recoverd);
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
struct ctdb_context *ctdb = rec->ctdb;
|
||||||
struct ctdb_marshall_buffer *recs;
|
struct ctdb_marshall_buffer *recs;
|
||||||
int ret, i;
|
int ret, i;
|
||||||
TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
|
TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
|
||||||
@ -1134,9 +1136,12 @@ done:
|
|||||||
/*
|
/*
|
||||||
* handler for database detach
|
* handler for database detach
|
||||||
*/
|
*/
|
||||||
static void detach_database_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void detach_database_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
struct ctdb_context *ctdb = rec->ctdb;
|
||||||
uint32_t db_id;
|
uint32_t db_id;
|
||||||
struct ctdb_db_context *ctdb_db;
|
struct ctdb_db_context *ctdb_db;
|
||||||
|
|
||||||
@ -2339,9 +2344,11 @@ static void election_send_request(struct event_context *ev, struct timed_event *
|
|||||||
/*
|
/*
|
||||||
handler for memory dumps
|
handler for memory dumps
|
||||||
*/
|
*/
|
||||||
static void mem_dump_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void mem_dump_handler(uint64_t srvid, TDB_DATA data, void *private_data)
|
||||||
TDB_DATA data, void *private_data)
|
|
||||||
{
|
{
|
||||||
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
struct ctdb_context *ctdb = rec->ctdb;
|
||||||
TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
|
TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
|
||||||
TDB_DATA *dump;
|
TDB_DATA *dump;
|
||||||
int ret;
|
int ret;
|
||||||
@ -2382,10 +2389,11 @@ DEBUG(DEBUG_ERR, ("recovery master memory dump\n"));
|
|||||||
/*
|
/*
|
||||||
handler for reload_nodes
|
handler for reload_nodes
|
||||||
*/
|
*/
|
||||||
static void reload_nodes_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void reload_nodes_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data, struct ctdb_recoverd);
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
|
||||||
DEBUG(DEBUG_ERR, (__location__ " Reload nodes file from recovery daemon\n"));
|
DEBUG(DEBUG_ERR, (__location__ " Reload nodes file from recovery daemon\n"));
|
||||||
|
|
||||||
@ -2410,16 +2418,17 @@ static void ctdb_rebalance_timeout(struct event_context *ev,
|
|||||||
do_takeover_run(rec, rec->nodemap, false);
|
do_takeover_run(rec, rec->nodemap, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void recd_node_rebalance_handler(struct ctdb_context *ctdb,
|
static void recd_node_rebalance_handler(uint64_t srvid, TDB_DATA data,
|
||||||
uint64_t srvid,
|
void *private_data)
|
||||||
TDB_DATA data, void *private_data)
|
|
||||||
{
|
{
|
||||||
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
struct ctdb_context *ctdb = rec->ctdb;
|
||||||
uint32_t pnn;
|
uint32_t pnn;
|
||||||
uint32_t *t;
|
uint32_t *t;
|
||||||
int len;
|
int len;
|
||||||
uint32_t deferred_rebalance;
|
uint32_t deferred_rebalance;
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data, struct ctdb_recoverd);
|
|
||||||
|
|
||||||
if (rec->recmaster != ctdb_get_pnn(ctdb)) {
|
if (rec->recmaster != ctdb_get_pnn(ctdb)) {
|
||||||
return;
|
return;
|
||||||
@ -2475,10 +2484,11 @@ static void recd_node_rebalance_handler(struct ctdb_context *ctdb,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void recd_update_ip_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void recd_update_ip_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data, struct ctdb_recoverd);
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
struct ctdb_public_ip *ip;
|
struct ctdb_public_ip *ip;
|
||||||
|
|
||||||
if (rec->recmaster != rec->ctdb->pnn) {
|
if (rec->recmaster != rec->ctdb->pnn) {
|
||||||
@ -2533,22 +2543,21 @@ done:
|
|||||||
srvid_request_reply(ctdb, (struct srvid_request *)r, result);
|
srvid_request_reply(ctdb, (struct srvid_request *)r, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disable_takeover_runs_handler(struct ctdb_context *ctdb,
|
static void disable_takeover_runs_handler(uint64_t srvid, TDB_DATA data,
|
||||||
uint64_t srvid, TDB_DATA data,
|
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data,
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
struct ctdb_recoverd);
|
private_data, struct ctdb_recoverd);
|
||||||
|
|
||||||
srvid_disable_and_reply(ctdb, data, rec->takeover_run);
|
srvid_disable_and_reply(rec->ctdb, data, rec->takeover_run);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Backward compatibility for this SRVID */
|
/* Backward compatibility for this SRVID */
|
||||||
static void disable_ip_check_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void disable_ip_check_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data,
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
struct ctdb_recoverd);
|
private_data, struct ctdb_recoverd);
|
||||||
uint32_t timeout;
|
uint32_t timeout;
|
||||||
|
|
||||||
if (data.dsize != sizeof(uint32_t)) {
|
if (data.dsize != sizeof(uint32_t)) {
|
||||||
@ -2564,17 +2573,16 @@ static void disable_ip_check_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
|||||||
|
|
||||||
timeout = *((uint32_t *)data.dptr);
|
timeout = *((uint32_t *)data.dptr);
|
||||||
|
|
||||||
ctdb_op_disable(rec->takeover_run, ctdb->ev, timeout);
|
ctdb_op_disable(rec->takeover_run, rec->ctdb->ev, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disable_recoveries_handler(struct ctdb_context *ctdb,
|
static void disable_recoveries_handler(uint64_t srvid, TDB_DATA data,
|
||||||
uint64_t srvid, TDB_DATA data,
|
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data,
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
struct ctdb_recoverd);
|
private_data, struct ctdb_recoverd);
|
||||||
|
|
||||||
srvid_disable_and_reply(ctdb, data, rec->recovery);
|
srvid_disable_and_reply(rec->ctdb, data, rec->recovery);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2582,12 +2590,12 @@ static void disable_recoveries_handler(struct ctdb_context *ctdb,
|
|||||||
handle this later in the monitor_cluster loop so we do not recurse
|
handle this later in the monitor_cluster loop so we do not recurse
|
||||||
with other requests to takeover_run()
|
with other requests to takeover_run()
|
||||||
*/
|
*/
|
||||||
static void ip_reallocate_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void ip_reallocate_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct srvid_request *request;
|
struct srvid_request *request;
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data,
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
struct ctdb_recoverd);
|
private_data, struct ctdb_recoverd);
|
||||||
|
|
||||||
if (data.dsize != sizeof(struct srvid_request)) {
|
if (data.dsize != sizeof(struct srvid_request)) {
|
||||||
DEBUG(DEBUG_ERR, (__location__ " Wrong size of return address.\n"));
|
DEBUG(DEBUG_ERR, (__location__ " Wrong size of return address.\n"));
|
||||||
@ -2596,7 +2604,7 @@ static void ip_reallocate_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
|||||||
|
|
||||||
request = (struct srvid_request *)data.dptr;
|
request = (struct srvid_request *)data.dptr;
|
||||||
|
|
||||||
srvid_request_add(ctdb, &rec->reallocate_requests, request);
|
srvid_request_add(rec->ctdb, &rec->reallocate_requests, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_ipreallocate_requests(struct ctdb_context *ctdb,
|
static void process_ipreallocate_requests(struct ctdb_context *ctdb,
|
||||||
@ -2644,10 +2652,11 @@ static void process_ipreallocate_requests(struct ctdb_context *ctdb,
|
|||||||
/*
|
/*
|
||||||
handler for recovery master elections
|
handler for recovery master elections
|
||||||
*/
|
*/
|
||||||
static void election_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void election_handler(uint64_t srvid, TDB_DATA data, void *private_data)
|
||||||
TDB_DATA data, void *private_data)
|
|
||||||
{
|
{
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data, struct ctdb_recoverd);
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
struct ctdb_context *ctdb = rec->ctdb;
|
||||||
int ret;
|
int ret;
|
||||||
struct election_message *em = (struct election_message *)data.dptr;
|
struct election_message *em = (struct election_message *)data.dptr;
|
||||||
|
|
||||||
@ -2740,15 +2749,16 @@ static void force_election(struct ctdb_recoverd *rec, uint32_t pnn,
|
|||||||
/*
|
/*
|
||||||
handler for when a node changes its flags
|
handler for when a node changes its flags
|
||||||
*/
|
*/
|
||||||
static void monitor_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void monitor_handler(uint64_t srvid, TDB_DATA data, void *private_data)
|
||||||
TDB_DATA data, void *private_data)
|
|
||||||
{
|
{
|
||||||
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
struct ctdb_context *ctdb = rec->ctdb;
|
||||||
int ret;
|
int ret;
|
||||||
struct ctdb_node_flag_change *c = (struct ctdb_node_flag_change *)data.dptr;
|
struct ctdb_node_flag_change *c = (struct ctdb_node_flag_change *)data.dptr;
|
||||||
struct ctdb_node_map *nodemap=NULL;
|
struct ctdb_node_map *nodemap=NULL;
|
||||||
TALLOC_CTX *tmp_ctx;
|
TALLOC_CTX *tmp_ctx;
|
||||||
int i;
|
int i;
|
||||||
struct ctdb_recoverd *rec = talloc_get_type(private_data, struct ctdb_recoverd);
|
|
||||||
int disabled_flag_changed;
|
int disabled_flag_changed;
|
||||||
|
|
||||||
if (data.dsize != sizeof(*c)) {
|
if (data.dsize != sizeof(*c)) {
|
||||||
@ -2814,9 +2824,12 @@ static void monitor_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
|||||||
/*
|
/*
|
||||||
handler for when we need to push out flag changes ot all other nodes
|
handler for when we need to push out flag changes ot all other nodes
|
||||||
*/
|
*/
|
||||||
static void push_flags_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void push_flags_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
|
struct ctdb_recoverd *rec = talloc_get_type(
|
||||||
|
private_data, struct ctdb_recoverd);
|
||||||
|
struct ctdb_context *ctdb = rec->ctdb;
|
||||||
int ret;
|
int ret;
|
||||||
struct ctdb_node_flag_change *c = (struct ctdb_node_flag_change *)data.dptr;
|
struct ctdb_node_flag_change *c = (struct ctdb_node_flag_change *)data.dptr;
|
||||||
struct ctdb_node_map *nodemap=NULL;
|
struct ctdb_node_map *nodemap=NULL;
|
||||||
|
@ -674,7 +674,7 @@ static void traverse_start_callback(void *p, TDB_DATA key, TDB_DATA data)
|
|||||||
cdata.dptr = (uint8_t *)d;
|
cdata.dptr = (uint8_t *)d;
|
||||||
cdata.dsize = d->length;
|
cdata.dsize = d->length;
|
||||||
|
|
||||||
ctdb_dispatch_message(state->ctdb, state->srvid, cdata);
|
srvid_dispatch(state->ctdb->srv, state->srvid, 0, cdata);
|
||||||
if (key.dsize == 0 && data.dsize == 0) {
|
if (key.dsize == 0 && data.dsize == 0) {
|
||||||
DEBUG(DEBUG_NOTICE, ("Ending traverse on DB %s (id %d), records %d\n",
|
DEBUG(DEBUG_NOTICE, ("Ending traverse on DB %s (id %d), records %d\n",
|
||||||
state->h->ctdb_db->db_name, state->h->reqid,
|
state->h->ctdb_db->db_name, state->h->reqid,
|
||||||
|
@ -78,26 +78,31 @@ static int fetch_func(struct ctdb_call_info *call)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int msg_count;
|
struct bench_data {
|
||||||
static int msg_plus, msg_minus;
|
struct ctdb_context *ctdb;
|
||||||
|
struct tevent_context *ev;
|
||||||
|
int msg_count;
|
||||||
|
int msg_plus, msg_minus;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
handler for messages in bench_ring()
|
handler for messages in bench_ring()
|
||||||
*/
|
*/
|
||||||
static void ring_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void ring_message_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
|
struct bench_data *bdata = talloc_get_type_abort(
|
||||||
|
private_data, struct bench_data);
|
||||||
int incr = *(int *)data.dptr;
|
int incr = *(int *)data.dptr;
|
||||||
int *count = (int *)private_data;
|
|
||||||
int dest;
|
int dest;
|
||||||
|
|
||||||
(*count)++;
|
bdata->msg_count++;
|
||||||
dest = (ctdb_get_pnn(ctdb) + num_nodes + incr) % num_nodes;
|
dest = (ctdb_get_pnn(bdata->ctdb) + num_nodes + incr) % num_nodes;
|
||||||
ctdb_client_send_message(ctdb, dest, srvid, data);
|
ctdb_client_send_message(bdata->ctdb, dest, srvid, data);
|
||||||
if (incr == 1) {
|
if (incr == 1) {
|
||||||
msg_plus++;
|
bdata->msg_plus++;
|
||||||
} else {
|
} else {
|
||||||
msg_minus++;
|
bdata->msg_minus++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,10 +121,11 @@ static void send_start_messages(struct ctdb_context *ctdb, int incr)
|
|||||||
ctdb_client_send_message(ctdb, dest, 0, data);
|
ctdb_client_send_message(ctdb, dest, 0, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void each_second(struct event_context *ev, struct timed_event *te,
|
static void each_second(struct event_context *ev, struct timed_event *te,
|
||||||
struct timeval t, void *private_data)
|
struct timeval t, void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_context *ctdb = talloc_get_type(private_data, struct ctdb_context);
|
struct bench_data *bdata = talloc_get_type_abort(
|
||||||
|
private_data, struct bench_data);
|
||||||
|
|
||||||
/* we kickstart the ring into action by inserting messages from node
|
/* we kickstart the ring into action by inserting messages from node
|
||||||
with pnn 0.
|
with pnn 0.
|
||||||
@ -127,49 +133,57 @@ static void each_second(struct event_context *ev, struct timed_event *te,
|
|||||||
running in which case the ring is broken and the messages are lost.
|
running in which case the ring is broken and the messages are lost.
|
||||||
if so, once every second try again to restart the ring
|
if so, once every second try again to restart the ring
|
||||||
*/
|
*/
|
||||||
if (msg_plus == 0) {
|
if (bdata->msg_plus == 0) {
|
||||||
// printf("no messages recevied, try again to kickstart the ring in forward direction...\n");
|
// printf("no messages recevied, try again to kickstart the ring in forward direction...\n");
|
||||||
send_start_messages(ctdb, 1);
|
send_start_messages(bdata->ctdb, 1);
|
||||||
}
|
}
|
||||||
if (msg_minus == 0) {
|
if (bdata->msg_minus == 0) {
|
||||||
// printf("no messages recevied, try again to kickstart the ring in reverse direction...\n");
|
// printf("no messages recevied, try again to kickstart the ring in reverse direction...\n");
|
||||||
send_start_messages(ctdb, -1);
|
send_start_messages(bdata->ctdb, -1);
|
||||||
}
|
}
|
||||||
event_add_timed(ctdb->ev, ctdb, timeval_current_ofs(1, 0), each_second, ctdb);
|
event_add_timed(bdata->ev, bdata, timeval_current_ofs(1, 0),
|
||||||
|
each_second, bdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dummy_event(struct event_context *ev, struct timed_event *te,
|
static void dummy_event(struct event_context *ev, struct timed_event *te,
|
||||||
struct timeval t, void *private_data)
|
struct timeval t, void *private_data)
|
||||||
{
|
{
|
||||||
struct ctdb_context *ctdb = talloc_get_type(private_data, struct ctdb_context);
|
struct bench_data *bdata = talloc_get_type_abort(
|
||||||
event_add_timed(ctdb->ev, ctdb, timeval_current_ofs(1, 0), dummy_event, ctdb);
|
private_data, struct bench_data);
|
||||||
|
|
||||||
|
event_add_timed(bdata->ev, bdata, timeval_current_ofs(1, 0),
|
||||||
|
dummy_event, bdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
benchmark sending messages in a ring around the nodes
|
benchmark sending messages in a ring around the nodes
|
||||||
*/
|
*/
|
||||||
static void bench_ring(struct ctdb_context *ctdb, struct event_context *ev)
|
static void bench_ring(struct bench_data *bdata)
|
||||||
{
|
{
|
||||||
int pnn=ctdb_get_pnn(ctdb);
|
int pnn = ctdb_get_pnn(bdata->ctdb);
|
||||||
|
|
||||||
if (pnn == 0) {
|
if (pnn == 0) {
|
||||||
event_add_timed(ctdb->ev, ctdb, timeval_current_ofs(1, 0), each_second, ctdb);
|
event_add_timed(bdata->ev, bdata, timeval_current_ofs(1, 0),
|
||||||
|
each_second, bdata);
|
||||||
} else {
|
} else {
|
||||||
event_add_timed(ctdb->ev, ctdb, timeval_current_ofs(1, 0), dummy_event, ctdb);
|
event_add_timed(bdata->ev, bdata, timeval_current_ofs(1, 0),
|
||||||
|
dummy_event, bdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
start_timer();
|
start_timer();
|
||||||
while (end_timer() < timelimit) {
|
while (end_timer() < timelimit) {
|
||||||
if (pnn == 0 && msg_count % 10000 == 0 && end_timer() > 0) {
|
if (pnn == 0 && bdata->msg_count % 10000 == 0 && end_timer() > 0) {
|
||||||
printf("Ring: %.2f msgs/sec (+ve=%d -ve=%d)\r",
|
printf("Ring: %.2f msgs/sec (+ve=%d -ve=%d)\r",
|
||||||
msg_count/end_timer(), msg_plus, msg_minus);
|
bdata->msg_count/end_timer(),
|
||||||
|
bdata->msg_plus, bdata->msg_minus);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
event_loop_once(ev);
|
event_loop_once(bdata->ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Ring: %.2f msgs/sec (+ve=%d -ve=%d)\n",
|
printf("Ring: %.2f msgs/sec (+ve=%d -ve=%d)\n",
|
||||||
msg_count/end_timer(), msg_plus, msg_minus);
|
bdata->msg_count/end_timer(),
|
||||||
|
bdata->msg_plus, bdata->msg_minus);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -194,6 +208,7 @@ int main(int argc, const char *argv[])
|
|||||||
int ret;
|
int ret;
|
||||||
poptContext pc;
|
poptContext pc;
|
||||||
struct event_context *ev;
|
struct event_context *ev;
|
||||||
|
struct bench_data *bdata;
|
||||||
|
|
||||||
pc = poptGetContext(argv[0], argc, argv, popt_options, POPT_CONTEXT_KEEP_FIRST);
|
pc = poptGetContext(argv[0], argc, argv, popt_options, POPT_CONTEXT_KEEP_FIRST);
|
||||||
|
|
||||||
@ -244,7 +259,14 @@ int main(int argc, const char *argv[])
|
|||||||
DEBUG(DEBUG_DEBUG,("ctdb_set_call() failed, ignoring return code %d\n", ret));
|
DEBUG(DEBUG_DEBUG,("ctdb_set_call() failed, ignoring return code %d\n", ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctdb_client_set_message_handler(ctdb, 0, ring_message_handler,&msg_count))
|
bdata = talloc_zero(ctdb, struct bench_data);
|
||||||
|
if (bdata == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
bdata->ctdb = ctdb;
|
||||||
|
bdata->ev = ev;
|
||||||
|
|
||||||
|
if (ctdb_client_set_message_handler(ctdb, 0, ring_message_handler, bdata))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
printf("Waiting for cluster\n");
|
printf("Waiting for cluster\n");
|
||||||
@ -255,8 +277,8 @@ int main(int argc, const char *argv[])
|
|||||||
event_loop_once(ev);
|
event_loop_once(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
bench_ring(ctdb, ev);
|
bench_ring(bdata);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,12 @@ static double end_timer(void)
|
|||||||
static int timelimit = 10;
|
static int timelimit = 10;
|
||||||
static int num_records = 10;
|
static int num_records = 10;
|
||||||
static int num_nodes;
|
static int num_nodes;
|
||||||
static int msg_count;
|
|
||||||
|
struct bench_data {
|
||||||
|
struct ctdb_context *ctdb;
|
||||||
|
struct tevent_context *ev;
|
||||||
|
int msg_count;
|
||||||
|
};
|
||||||
|
|
||||||
#define TESTKEY "testkey"
|
#define TESTKEY "testkey"
|
||||||
|
|
||||||
@ -52,8 +57,9 @@ static int msg_count;
|
|||||||
store a expanded record
|
store a expanded record
|
||||||
send a message to next node to tell it to do the same
|
send a message to next node to tell it to do the same
|
||||||
*/
|
*/
|
||||||
static void bench_fetch_1node(struct ctdb_context *ctdb)
|
static void bench_fetch_1node(struct bench_data *bdata)
|
||||||
{
|
{
|
||||||
|
struct ctdb_context *ctdb = bdata->ctdb;
|
||||||
TDB_DATA key, data, nulldata;
|
TDB_DATA key, data, nulldata;
|
||||||
struct ctdb_db_context *ctdb_db;
|
struct ctdb_db_context *ctdb_db;
|
||||||
TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
|
TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
|
||||||
@ -82,7 +88,8 @@ static void bench_fetch_1node(struct ctdb_context *ctdb)
|
|||||||
}
|
}
|
||||||
data.dptr = (uint8_t *)talloc_asprintf_append((char *)data.dptr,
|
data.dptr = (uint8_t *)talloc_asprintf_append((char *)data.dptr,
|
||||||
"msg_count=%d on node %d\n",
|
"msg_count=%d on node %d\n",
|
||||||
msg_count, ctdb_get_pnn(ctdb));
|
bdata->msg_count,
|
||||||
|
ctdb_get_pnn(ctdb));
|
||||||
if (data.dptr == NULL) {
|
if (data.dptr == NULL) {
|
||||||
printf("Failed to create record\n");
|
printf("Failed to create record\n");
|
||||||
talloc_free(tmp_ctx);
|
talloc_free(tmp_ctx);
|
||||||
@ -109,11 +116,13 @@ static void bench_fetch_1node(struct ctdb_context *ctdb)
|
|||||||
/*
|
/*
|
||||||
handler for messages in bench_ring()
|
handler for messages in bench_ring()
|
||||||
*/
|
*/
|
||||||
static void message_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void message_handler(uint64_t srvid, TDB_DATA data, void *private_data)
|
||||||
TDB_DATA data, void *private_data)
|
|
||||||
{
|
{
|
||||||
msg_count++;
|
struct bench_data *bdata = talloc_get_type_abort(
|
||||||
bench_fetch_1node(ctdb);
|
private_data, struct bench_data);
|
||||||
|
|
||||||
|
bdata->msg_count++;
|
||||||
|
bench_fetch_1node(bdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -134,36 +143,38 @@ static void timeout_handler(struct event_context *ev, struct timed_event *timer,
|
|||||||
send a message to next node to tell it to do the same
|
send a message to next node to tell it to do the same
|
||||||
|
|
||||||
*/
|
*/
|
||||||
static void bench_fetch(struct ctdb_context *ctdb, struct event_context *ev)
|
static void bench_fetch(struct bench_data *bdata)
|
||||||
{
|
{
|
||||||
|
struct ctdb_context *ctdb = bdata->ctdb;
|
||||||
int pnn=ctdb_get_pnn(ctdb);
|
int pnn=ctdb_get_pnn(ctdb);
|
||||||
|
|
||||||
if (pnn == num_nodes - 1) {
|
if (pnn == num_nodes - 1) {
|
||||||
bench_fetch_1node(ctdb);
|
bench_fetch_1node(bdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
start_timer();
|
start_timer();
|
||||||
event_add_timed(ev, ctdb, timeval_current_ofs(timelimit,0), timeout_handler, NULL);
|
event_add_timed(bdata->ev, bdata, timeval_current_ofs(timelimit,0),
|
||||||
|
timeout_handler, NULL);
|
||||||
|
|
||||||
while (end_timer() < timelimit) {
|
while (end_timer() < timelimit) {
|
||||||
if (pnn == 0 && msg_count % 100 == 0 && end_timer() > 0) {
|
if (pnn == 0 && bdata->msg_count % 100 == 0 && end_timer() > 0) {
|
||||||
printf("Fetch: %.2f msgs/sec\r", msg_count/end_timer());
|
printf("Fetch: %.2f msgs/sec\r", bdata->msg_count/end_timer());
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
if (event_loop_once(ev) != 0) {
|
if (event_loop_once(bdata->ev) != 0) {
|
||||||
printf("Event loop failed!\n");
|
printf("Event loop failed!\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Fetch: %.2f msgs/sec\n", msg_count/end_timer());
|
printf("Fetch: %.2f msgs/sec\n", bdata->msg_count/end_timer());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
handler for reconfigure message
|
handler for reconfigure message
|
||||||
*/
|
*/
|
||||||
static void reconfigure_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void reconfigure_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
int *ready = (int *)private_data;
|
int *ready = (int *)private_data;
|
||||||
*ready = 1;
|
*ready = 1;
|
||||||
@ -193,6 +204,7 @@ int main(int argc, const char *argv[])
|
|||||||
TDB_DATA key, data;
|
TDB_DATA key, data;
|
||||||
struct ctdb_record_handle *h;
|
struct ctdb_record_handle *h;
|
||||||
int cluster_ready=0;
|
int cluster_ready=0;
|
||||||
|
struct bench_data *bdata;
|
||||||
|
|
||||||
pc = poptGetContext(argv[0], argc, argv, popt_options, POPT_CONTEXT_KEEP_FIRST);
|
pc = poptGetContext(argv[0], argc, argv, popt_options, POPT_CONTEXT_KEEP_FIRST);
|
||||||
|
|
||||||
@ -240,7 +252,16 @@ int main(int argc, const char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctdb_client_set_message_handler(ctdb, 0, message_handler, &msg_count);
|
bdata = talloc_zero(ctdb, struct bench_data);
|
||||||
|
if (bdata == NULL) {
|
||||||
|
printf("memory allocation error\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bdata->ctdb = ctdb;
|
||||||
|
bdata->ev = ev;
|
||||||
|
|
||||||
|
ctdb_client_set_message_handler(ctdb, 0, message_handler, bdata);
|
||||||
|
|
||||||
printf("Waiting for cluster\n");
|
printf("Waiting for cluster\n");
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -257,7 +278,7 @@ int main(int argc, const char *argv[])
|
|||||||
*/
|
*/
|
||||||
printf("Sleeping for %d seconds\n", num_nodes);
|
printf("Sleeping for %d seconds\n", num_nodes);
|
||||||
sleep(num_nodes);
|
sleep(num_nodes);
|
||||||
bench_fetch(ctdb, ev);
|
bench_fetch(bdata);
|
||||||
|
|
||||||
key.dptr = discard_const(TESTKEY);
|
key.dptr = discard_const(TESTKEY);
|
||||||
key.dsize = strlen(TESTKEY);
|
key.dsize = strlen(TESTKEY);
|
||||||
|
@ -132,7 +132,7 @@ int ctdb_ctrl_getdbseqnum(struct ctdb_context *ctdb, struct timeval timeout,
|
|||||||
uint32_t destnode, uint32_t dbid, uint64_t *seqnum);
|
uint32_t destnode, uint32_t dbid, uint64_t *seqnum);
|
||||||
int ctdb_client_set_message_handler(struct ctdb_context *ctdb,
|
int ctdb_client_set_message_handler(struct ctdb_context *ctdb,
|
||||||
uint64_t srvid,
|
uint64_t srvid,
|
||||||
ctdb_msg_fn_t handler,
|
srvid_handler_fn handler,
|
||||||
void *private_data);
|
void *private_data);
|
||||||
int ctdb_client_remove_message_handler(struct ctdb_context *ctdb,
|
int ctdb_client_remove_message_handler(struct ctdb_context *ctdb,
|
||||||
uint64_t srvid,
|
uint64_t srvid,
|
||||||
@ -173,7 +173,8 @@ ctdb_get_capabilities(struct ctdb_context *ctdb,
|
|||||||
#include "common/ctdb_io.c"
|
#include "common/ctdb_io.c"
|
||||||
#include "common/ctdb_util.c"
|
#include "common/ctdb_util.c"
|
||||||
#include "common/ctdb_ltdb.c"
|
#include "common/ctdb_ltdb.c"
|
||||||
#include "common/ctdb_message.c"
|
#include "common/db_hash.c"
|
||||||
|
#include "common/srvid.c"
|
||||||
#include "common/rb_tree.c"
|
#include "common/rb_tree.c"
|
||||||
#include "common/ctdb_logging.c"
|
#include "common/ctdb_logging.c"
|
||||||
#include "common/ctdb_fork.c"
|
#include "common/ctdb_fork.c"
|
||||||
|
@ -610,7 +610,7 @@ ctdb_ctrl_get_ifaces_stub(struct ctdb_context *ctdb,
|
|||||||
* the ctdb tool only registers one at a time so keep this simple. */
|
* the ctdb tool only registers one at a time so keep this simple. */
|
||||||
static struct {
|
static struct {
|
||||||
uint64_t srvid;
|
uint64_t srvid;
|
||||||
ctdb_msg_fn_t message_handler;
|
srvid_handler_fn message_handler;
|
||||||
void *message_private;
|
void *message_private;
|
||||||
} ctdb_message_list_fake = {
|
} ctdb_message_list_fake = {
|
||||||
.srvid = 0,
|
.srvid = 0,
|
||||||
@ -620,7 +620,7 @@ static struct {
|
|||||||
|
|
||||||
int ctdb_client_set_message_handler_stub(struct ctdb_context *ctdb,
|
int ctdb_client_set_message_handler_stub(struct ctdb_context *ctdb,
|
||||||
uint64_t srvid,
|
uint64_t srvid,
|
||||||
ctdb_msg_fn_t handler,
|
srvid_handler_fn handler,
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
ctdb_message_list_fake.srvid = srvid;
|
ctdb_message_list_fake.srvid = srvid;
|
||||||
@ -649,7 +649,6 @@ static void ctdb_fake_handler_pnn_reply(struct ctdb_context *ctdb,
|
|||||||
reply_data.dsize = sizeof(pnn);
|
reply_data.dsize = sizeof(pnn);
|
||||||
reply_data.dptr = (uint8_t *)&pnn;
|
reply_data.dptr = (uint8_t *)&pnn;
|
||||||
ctdb_message_list_fake.message_handler(
|
ctdb_message_list_fake.message_handler(
|
||||||
ctdb,
|
|
||||||
ctdb_message_list_fake.srvid,
|
ctdb_message_list_fake.srvid,
|
||||||
reply_data,
|
reply_data,
|
||||||
ctdb_message_list_fake.message_private);
|
ctdb_message_list_fake.message_private);
|
||||||
|
@ -35,7 +35,8 @@ bool fast_start;
|
|||||||
#include "common/ctdb_io.c"
|
#include "common/ctdb_io.c"
|
||||||
#include "common/ctdb_util.c"
|
#include "common/ctdb_util.c"
|
||||||
#include "common/ctdb_ltdb.c"
|
#include "common/ctdb_ltdb.c"
|
||||||
#include "common/ctdb_message.c"
|
#include "common/db_hash.c"
|
||||||
|
#include "common/srvid.c"
|
||||||
#include "common/cmdline.c"
|
#include "common/cmdline.c"
|
||||||
#include "common/rb_tree.c"
|
#include "common/rb_tree.c"
|
||||||
#include "common/ctdb_logging.c"
|
#include "common/ctdb_logging.c"
|
||||||
|
@ -2189,9 +2189,7 @@ struct srvid_reply_handler_data {
|
|||||||
const char *srvid_str;
|
const char *srvid_str;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void srvid_broadcast_reply_handler(struct ctdb_context *ctdb,
|
static void srvid_broadcast_reply_handler(uint64_t srvid, TDB_DATA data,
|
||||||
uint64_t srvid,
|
|
||||||
TDB_DATA data,
|
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
struct srvid_reply_handler_data *d =
|
struct srvid_reply_handler_data *d =
|
||||||
@ -6036,8 +6034,7 @@ static int control_dumpmemory(struct ctdb_context *ctdb, int argc, const char **
|
|||||||
/*
|
/*
|
||||||
handler for memory dumps
|
handler for memory dumps
|
||||||
*/
|
*/
|
||||||
static void mem_dump_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void mem_dump_handler(uint64_t srvid, TDB_DATA data, void *private_data)
|
||||||
TDB_DATA data, void *private_data)
|
|
||||||
{
|
{
|
||||||
sys_write(1, data.dptr, data.dsize);
|
sys_write(1, data.dptr, data.dsize);
|
||||||
exit(0);
|
exit(0);
|
||||||
@ -6108,8 +6105,8 @@ static int control_msgsend(struct ctdb_context *ctdb, int argc, const char **arg
|
|||||||
/*
|
/*
|
||||||
handler for msglisten
|
handler for msglisten
|
||||||
*/
|
*/
|
||||||
static void msglisten_handler(struct ctdb_context *ctdb, uint64_t srvid,
|
static void msglisten_handler(uint64_t srvid, TDB_DATA data,
|
||||||
TDB_DATA data, void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
12
ctdb/wscript
12
ctdb/wscript
@ -320,7 +320,7 @@ def build(bld):
|
|||||||
bld.SAMBA_SUBSYSTEM('ctdb-common',
|
bld.SAMBA_SUBSYSTEM('ctdb-common',
|
||||||
source=bld.SUBDIR('common',
|
source=bld.SUBDIR('common',
|
||||||
'''ctdb_io.c ctdb_util.c ctdb_ltdb.c
|
'''ctdb_io.c ctdb_util.c ctdb_ltdb.c
|
||||||
ctdb_message.c cmdline.c rb_tree.c
|
cmdline.c rb_tree.c
|
||||||
ctdb_fork.c'''),
|
ctdb_fork.c'''),
|
||||||
includes='include include/internal common .',
|
includes='include include/internal common .',
|
||||||
deps='replace popt talloc tevent tdb popt ctdb-system')
|
deps='replace popt talloc tevent tdb popt ctdb-system')
|
||||||
@ -340,7 +340,7 @@ def build(bld):
|
|||||||
source=bld.SUBDIR('client', 'ctdb_client.c'),
|
source=bld.SUBDIR('client', 'ctdb_client.c'),
|
||||||
includes='include include/internal',
|
includes='include include/internal',
|
||||||
deps='''replace popt talloc tevent tdb
|
deps='''replace popt talloc tevent tdb
|
||||||
samba-util tdb-wrap''')
|
samba-util tdb-wrap ctdb-util''')
|
||||||
|
|
||||||
bld.SAMBA_SUBSYSTEM('ctdb-server',
|
bld.SAMBA_SUBSYSTEM('ctdb-server',
|
||||||
source='server/ctdbd.c ' +
|
source='server/ctdbd.c ' +
|
||||||
@ -367,14 +367,15 @@ def build(bld):
|
|||||||
bld.SAMBA_BINARY('ctdbd',
|
bld.SAMBA_BINARY('ctdbd',
|
||||||
source='',
|
source='',
|
||||||
deps='''ctdb-server ctdb-client ctdb-common
|
deps='''ctdb-server ctdb-client ctdb-common
|
||||||
ctdb-common-util ctdb-tcp''' +
|
ctdb-common-util ctdb-tcp ctdb-util''' +
|
||||||
ib_deps,
|
ib_deps,
|
||||||
install_path='${SBINDIR}',
|
install_path='${SBINDIR}',
|
||||||
manpages='ctdbd.1')
|
manpages='ctdbd.1')
|
||||||
|
|
||||||
bld.SAMBA_BINARY('ctdb',
|
bld.SAMBA_BINARY('ctdb',
|
||||||
source='tools/ctdb.c tools/ctdb_vacuum.c',
|
source='tools/ctdb.c tools/ctdb_vacuum.c',
|
||||||
deps='ctdb-client ctdb-common ctdb-common-util',
|
deps='''ctdb-client ctdb-common ctdb-common-util
|
||||||
|
ctdb-util''',
|
||||||
includes='include include/internal',
|
includes='include include/internal',
|
||||||
install_path='${BINDIR}',
|
install_path='${BINDIR}',
|
||||||
manpages='ctdb.1')
|
manpages='ctdb.1')
|
||||||
@ -610,7 +611,8 @@ def build(bld):
|
|||||||
bld.SAMBA_BINARY(target,
|
bld.SAMBA_BINARY(target,
|
||||||
source=src,
|
source=src,
|
||||||
includes='include include/internal',
|
includes='include include/internal',
|
||||||
deps='ctdb-client ctdb-common ctdb-common-util',
|
deps='''ctdb-client ctdb-common ctdb-common-util
|
||||||
|
ctdb-util''',
|
||||||
install_path='${CTDB_TEST_LIBDIR}')
|
install_path='${CTDB_TEST_LIBDIR}')
|
||||||
|
|
||||||
bld.SAMBA_BINARY('ctdb_takeover_tests',
|
bld.SAMBA_BINARY('ctdb_takeover_tests',
|
||||||
|
Loading…
Reference in New Issue
Block a user