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;
45 .socketname = CTDB_PATH,
52 enum {OPT_EVENTSYSTEM=1};
54 static void ctdb_cmdline_callback(poptContext con,
55 enum poptCallbackReason reason,
56 const struct poptOption *opt,
57 const char *arg, const void *data)
61 event_set_default_backend(arg);
67 struct poptOption popt_ctdb_cmdline[] = {
68 { NULL, 0, POPT_ARG_CALLBACK, (void *)ctdb_cmdline_callback },
69 { "nlist", 0, POPT_ARG_STRING, &ctdb_cmdline.nlist, 0, "node list file", "filename" },
70 { "listen", 0, POPT_ARG_STRING, &ctdb_cmdline.myaddress, 0, "address to listen on", "address" },
71 { "socket", 0, POPT_ARG_STRING, &ctdb_cmdline.socketname, 0, "local socket name", "filename" },
72 { "transport", 0, POPT_ARG_STRING, &ctdb_cmdline.transport, 0, "protocol transport", NULL },
73 { "self-connect", 0, POPT_ARG_NONE, &ctdb_cmdline.self_connect, 0, "enable self connect", "boolean" },
74 { "debug", 'd', POPT_ARG_INT, &LogLevel, 0, "debug level"},
75 { "dbdir", 0, POPT_ARG_STRING, &ctdb_cmdline.db_dir, 0, "directory for the tdb files", NULL },
76 { "torture", 0, POPT_ARG_NONE, &ctdb_cmdline.torture, 0, "enable nastiness in library", NULL },
77 { "logfile", 0, POPT_ARG_STRING, &ctdb_cmdline.logfile, 0, "log file location", "filename" },
78 { "events", 0, POPT_ARG_STRING, NULL, OPT_EVENTSYSTEM, "event system", NULL },
84 startup daemon side of ctdb according to command line options
86 struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
88 struct ctdb_context *ctdb;
91 if (ctdb_cmdline.nlist == NULL) {
92 printf("You must provide a node list with --nlist\n");
99 printf("Failed to init ctdb\n");
103 ret = ctdb_set_logfile(ctdb, ctdb_cmdline.logfile);
105 printf("ctdb_set_logfile failed - %s\n", ctdb_errstr(ctdb));
109 if (ctdb_cmdline.self_connect) {
110 ctdb_set_flags(ctdb, CTDB_FLAG_SELF_CONNECT);
112 if (ctdb_cmdline.torture) {
113 ctdb_set_flags(ctdb, CTDB_FLAG_TORTURE);
116 ret = ctdb_set_transport(ctdb, ctdb_cmdline.transport);
118 printf("ctdb_set_transport failed - %s\n", ctdb_errstr(ctdb));
122 /* tell ctdb what address to listen on */
123 if (ctdb_cmdline.myaddress) {
124 ret = ctdb_set_address(ctdb, ctdb_cmdline.myaddress);
126 printf("ctdb_set_address failed - %s\n", ctdb_errstr(ctdb));
131 /* tell ctdb the socket address */
132 ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
134 printf("ctdb_set_socketname failed - %s\n", ctdb_errstr(ctdb));
138 /* tell ctdb what nodes are available */
139 ret = ctdb_set_nlist(ctdb, ctdb_cmdline.nlist);
141 printf("ctdb_set_nlist failed - %s\n", ctdb_errstr(ctdb));
145 if (ctdb_cmdline.db_dir) {
146 ret = ctdb_set_tdb_dir(ctdb, ctdb_cmdline.db_dir);
148 printf("ctdb_set_tdb_dir failed - %s\n", ctdb_errstr(ctdb));
153 /* initialize the vnn mapping table */
155 XXX we currently initialize it to the maximum number of nodes to
156 XXX make it behave the same way as previously.
157 XXX Once we have recovery working we should initialize this always to
158 XXX generation==0 (==invalid) and let the recovery tool populate this
159 XXX table for the daemons.
161 ctdb->vnn_map = talloc_zero_size(ctdb, offsetof(struct ctdb_vnn_map, map) + 4*ctdb->num_nodes);
162 if (ctdb->vnn_map == NULL) {
163 DEBUG(0,(__location__ " Unable to allocate vnn_map structure\n"));
166 ctdb->vnn_map->generation = 1;
167 ctdb->vnn_map->size = ctdb->num_nodes;
168 for(i=0;i<ctdb->vnn_map->size;i++){
169 ctdb->vnn_map->map[i] = i%ctdb->num_nodes;
178 startup a client only ctdb context
180 struct ctdb_context *ctdb_cmdline_client(struct event_context *ev)
182 struct ctdb_context *ctdb;
185 /* initialise ctdb */
186 ctdb = ctdb_init(ev);
188 printf("Failed to init ctdb\n");
192 /* tell ctdb the socket address */
193 ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
195 printf("ctdb_set_socketname failed - %s\n", ctdb_errstr(ctdb));
199 ret = ctdb_socket_connect(ctdb);
201 DEBUG(0,(__location__ " Failed to connect to daemon\n"));
207 ret = ctdb_ctrl_get_config(ctdb);
209 DEBUG(0,(__location__ " Failed to get ctdb config\n"));