2 common commandline code to ctdb test tools
4 Copyright (C) Andrew Tridgell 2007
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "lib/events/events.h"
23 #include "system/filesys.h"
25 #include "../include/ctdb.h"
26 #include "../include/ctdb_private.h"
28 /* Handle common command line options for ctdb test progs
33 const char *transport;
34 const char *myaddress;
35 const char *socketname;
43 .socketname = CTDB_PATH,
50 struct poptOption popt_ctdb_cmdline[] = {
51 { "nlist", 0, POPT_ARG_STRING, &ctdb_cmdline.nlist, 0, "node list file", "filename" },
52 { "listen", 0, POPT_ARG_STRING, &ctdb_cmdline.myaddress, 0, "address to listen on", "address" },
53 { "socket", 0, POPT_ARG_STRING, &ctdb_cmdline.socketname, 0, "local socket name", "filename" },
54 { "transport", 0, POPT_ARG_STRING, &ctdb_cmdline.transport, 0, "protocol transport", NULL },
55 { "self-connect", 0, POPT_ARG_NONE, &ctdb_cmdline.self_connect, 0, "enable self connect", "boolean" },
56 { "debug", 'd', POPT_ARG_INT, &LogLevel, 0, "debug level"},
57 { "dbdir", 0, POPT_ARG_STRING, &ctdb_cmdline.db_dir, 0, "directory for the tdb files", NULL },
58 { "torture", 0, POPT_ARG_NONE, &ctdb_cmdline.torture, 0, "enable nastiness in library", NULL },
64 startup daemon side of ctdb according to command line options
66 struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
68 struct ctdb_context *ctdb;
71 if (ctdb_cmdline.nlist == NULL || ctdb_cmdline.myaddress == NULL) {
72 printf("You must provide a node list with --nlist and an address with --listen\n");
79 printf("Failed to init ctdb\n");
83 if (ctdb_cmdline.self_connect) {
84 ctdb_set_flags(ctdb, CTDB_FLAG_SELF_CONNECT);
86 if (ctdb_cmdline.torture) {
87 ctdb_set_flags(ctdb, CTDB_FLAG_TORTURE);
90 ret = ctdb_set_transport(ctdb, ctdb_cmdline.transport);
92 printf("ctdb_set_transport failed - %s\n", ctdb_errstr(ctdb));
96 /* tell ctdb what address to listen on */
97 ret = ctdb_set_address(ctdb, ctdb_cmdline.myaddress);
99 printf("ctdb_set_address failed - %s\n", ctdb_errstr(ctdb));
103 /* tell ctdb the socket address */
104 ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
106 printf("ctdb_set_socketname failed - %s\n", ctdb_errstr(ctdb));
110 /* tell ctdb what nodes are available */
111 ret = ctdb_set_nlist(ctdb, ctdb_cmdline.nlist);
113 printf("ctdb_set_nlist failed - %s\n", ctdb_errstr(ctdb));
117 ret = ctdb_set_tdb_dir(ctdb, ctdb_cmdline.db_dir);
119 printf("ctdb_set_tdb_dir failed - %s\n", ctdb_errstr(ctdb));
123 /* initialize the vnn mapping table */
125 XXX we currently initialize it to the maximum number of nodes to
126 XXX make it behave the same way as previously.
127 XXX Once we have recovery working we should initialize this always to
128 XXX generation==0 (==invalid) and let the recovery tool populate this
129 XXX table for the daemons.
131 ctdb->vnn_map = talloc_zero(ctdb, struct ctdb_vnn_map);
132 if (ctdb->vnn_map == NULL) {
133 DEBUG(0,(__location__ " Unable to allocate vnn_map structure\n"));
136 ctdb->vnn_map->generation = 1;
137 ctdb->vnn_map->size = ctdb->num_nodes;
138 ctdb->vnn_map->map = talloc_array(ctdb->vnn_map, uint32_t, ctdb->vnn_map->size);
139 if (ctdb->vnn_map->map == NULL) {
140 DEBUG(0,(__location__ " Unable to allocate vnn_map->map structure\n"));
143 for(i=0;i<ctdb->vnn_map->size;i++){
144 ctdb->vnn_map->map[i] = i%ctdb->num_nodes;
153 startup a client only ctdb context
155 struct ctdb_context *ctdb_cmdline_client(struct event_context *ev)
157 struct ctdb_context *ctdb;
160 /* initialise ctdb */
161 ctdb = ctdb_init(ev);
163 printf("Failed to init ctdb\n");
167 /* tell ctdb the socket address */
168 ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
170 printf("ctdb_set_socketname failed - %s\n", ctdb_errstr(ctdb));
174 ret = ctdb_socket_connect(ctdb);
176 DEBUG(0,(__location__ " Failed to connect to daemon\n"));
182 ret = ctdb_get_config(ctdb);
184 DEBUG(0,(__location__ " Failed to get ctdb config\n"));