[SCM] CTDB repository - branch master updated -
fe6ddf7992ca3e72a26dbac6666e0f6270da611f
Andrew Tridgell
tridge at samba.org
Thu Nov 20 21:06:36 GMT 2008
The branch, master has been updated
via fe6ddf7992ca3e72a26dbac6666e0f6270da611f (commit)
via 0a6f9326cb99f14b5c9edd0d8854d8229df49910 (commit)
via 7a18f33ec7512100dd067c65f0470889ff8fd591 (commit)
via a9a1156ea4e10483a4bf4265b8e9203f0af033aa (commit)
via 1f25958dc739677a487fa496fbeffcda7a0f2204 (commit)
via b75e2263c565c21ecbbd98fbd2c10787e467bf5c (commit)
via aba984f1b85f5a2d370b093061cf15843ee53758 (commit)
via 8c6a02fb423a8cbcbfc706767e3d353cd48073c3 (commit)
via 1d581dcd507e8e13d7ae085ff4d6a9f3e2aaeba5 (commit)
via 1a7ff4577d33f0dd470f7465c7d0e875c962f54e (commit)
via 403c68f96e1380dd07217c688de2730464f77ea0 (commit)
via 59a879626a6a55fb6a43cadf5338c1aa6afe96d1 (commit)
via e25ea88ea4f270ba65ed5fdacd693f1248f343c0 (commit)
via 4b0f32047e8bece0a052bdbe2209afe91b7e8ce3 (commit)
via 82fd2b6b5cd8e988c38fa6b74121a048757bdeef (commit)
via 06097b88709ced09d1f9f869eed9a54e6d2fedbf (commit)
via cdc79d4f22f1a6aec5c34115969421f93663932a (commit)
via 49431e799ba7f7c78f596fdf896316a2e22c745e (commit)
via 8313dfb6fc5404cd2d065af6620412f8664ada11 (commit)
via 5403ed6dcfdfc101b05b43f83002e720d81b4e38 (commit)
via 0098efd4443038f2d902e3a7c3640e63f06be7d1 (commit)
via 3b8d49bf58f4145cdca08565f06cd43fd36991e1 (commit)
via f9779d3a237db59d7fdad92185ac7e42715466e6 (commit)
via 6fb2f8a36239e5902e27cf10213f85faf216d6f1 (commit)
via 9b1d089c99413f3681440f3cf33c293d118c9108 (commit)
via c0b3bd8a3fa580dca5afa97c8012fccb25231373 (commit)
via 77ed0d71b1fb8d06d70d01a8e8f9eb04ffe7f02f (commit)
via 5747dd2d80af29d6252afb6aeb3e66328ee20de5 (commit)
via d13da2e8fe2fab619540525d98a5502a23ab7d20 (commit)
via 8e912abc2c68f5fe7b06c600ba6fec1a6900127c (commit)
via 6b76c520f97127099bd9fbaa0fa7af1c61947fb7 (commit)
via dc9cd4779db4a89697731e4cf415be51067a07c1 (commit)
via 07dd4c7d2e8ba10f53d4cf2644fc4b7b8647e286 (commit)
via a5d5aa455c7f7eb93d3fa6f403d5b8e0b795109d (commit)
via dc108adada33bb713f71a2859eda3b439ed0cd1a (commit)
via 5f96b33a379c80ed8a39de1ee41f254cf48733f9 (commit)
via 8e504fc8c01f750d1cb5d2289ef12c423daf1ad4 (commit)
via 4237bd3753dcb024c17461e974414bef1b609416 (commit)
via e701a531868149f16561011e65794a4a46ee6596 (commit)
via d9779c310e98c9d4eab71a8d1705849ac90deb10 (commit)
via 000018f2f4fb9f2452f56731b027dd6a7beda111 (commit)
from 85f6032cbdb197f3a003d86f086afa2cee898a4d (commit)
http://gitweb.samba.org/?p=tridge/ctdb.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit fe6ddf7992ca3e72a26dbac6666e0f6270da611f
Merge: 5403ed6dcfdfc101b05b43f83002e720d81b4e38 0a6f9326cb99f14b5c9edd0d8854d8229df49910
Author: Andrew Tridgell <tridge at samba.org>
Date: Thu Nov 20 21:23:26 2008 +1100
Merge commit 'ronnie/master'
commit 0a6f9326cb99f14b5c9edd0d8854d8229df49910
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Thu Nov 20 16:39:56 2008 +1100
dont override/change CTDB_BASE if it is already set by the shell
commit 7a18f33ec7512100dd067c65f0470889ff8fd591
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Thu Nov 20 13:35:08 2008 +1100
Keepalive packets were only sent every KeepaliveInterval if the socket
had been completely idle during that interval.
If we had been sending other packets such as Messages, Calls or Controls
there wouldnt be any need for an explicit keepalive and thus we didnt
send one.
This does make it somewhat awkward when analyzing traces since it is
non-intuitive when keepalives are sent and when they are not sent.
Change the keepalive logic to always send a keepalive regardless of
whether the link is idle or not.
commit a9a1156ea4e10483a4bf4265b8e9203f0af033aa
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Nov 19 14:43:46 2008 +1100
reqrite the handling of flag updates across the cluster to eliminate a
race between the ctdb tool and the recovery daemon both at once
trying to push flag changes across the cluster.
commit 1f25958dc739677a487fa496fbeffcda7a0f2204
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Thu Nov 13 10:55:20 2008 +1100
new version 1.0.65
update the example sysconfig file. the default log level is 2, not 0
commit b75e2263c565c21ecbbd98fbd2c10787e467bf5c
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Nov 11 14:49:30 2008 +1100
add a CTDB_SOCKET variable that can be used to override the default
/tmp/ctdb.socket
commit aba984f1b85f5a2d370b093061cf15843ee53758
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Nov 3 21:54:52 2008 +1100
we actually need a ctdb_db variable
commit 8c6a02fb423a8cbcbfc706767e3d353cd48073c3
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Thu Oct 30 13:34:10 2008 +1100
latency is measured in us, not ms
use an explicit ctdb_db variable instead of dereferencing state
commit 1d581dcd507e8e13d7ae085ff4d6a9f3e2aaeba5
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Thu Oct 30 12:49:53 2008 +1100
add control and logging of very high latencies.
log the type of operation and the database name for all latencies higher
than a treshold
commit 1a7ff4577d33f0dd470f7465c7d0e875c962f54e
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 22 11:06:18 2008 +1100
new version 1.0.64
commit 403c68f96e1380dd07217c688de2730464f77ea0
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 22 11:04:41 2008 +1100
add a context and a timed event so that once we have been in recovery
mode for too long we drop all public ip addresses
commit 59a879626a6a55fb6a43cadf5338c1aa6afe96d1
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Oct 20 09:47:54 2008 +1100
new version 1.0.63
commit e25ea88ea4f270ba65ed5fdacd693f1248f343c0
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Oct 20 09:45:15 2008 +1100
dont log "running periodic cleanup" ...
commit 4b0f32047e8bece0a052bdbe2209afe91b7e8ce3
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Fri Oct 17 21:38:42 2008 +1100
null out the pointer before we reload the nodes file
commit 82fd2b6b5cd8e988c38fa6b74121a048757bdeef
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Fri Oct 17 21:18:06 2008 +1100
when we reload the nodes file, we may need to reload the nodes file
inside the recovery daemon as well.
commit 06097b88709ced09d1f9f869eed9a54e6d2fedbf
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Fri Oct 17 09:02:03 2008 +1100
make it possible to set the script log level in CTDB sysconfig
commit cdc79d4f22f1a6aec5c34115969421f93663932a
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Fri Oct 17 07:56:12 2008 +1100
specify a "script log level" on the commandline to set under which log
level any/all output from eventscripts will be logged as
commit 49431e799ba7f7c78f596fdf896316a2e22c745e
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Thu Oct 16 17:59:55 2008 +1100
new version 1.0.62
commit 8313dfb6fc5404cd2d065af6620412f8664ada11
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Thu Oct 16 17:57:50 2008 +1100
allow multiple eventscripts using the same prefix.
this eases the pain for users that use out of tree eventscripts
commit 5403ed6dcfdfc101b05b43f83002e720d81b4e38
Merge: a5d5aa455c7f7eb93d3fa6f403d5b8e0b795109d 6fb2f8a36239e5902e27cf10213f85faf216d6f1
Author: Andrew Tridgell <tridge at samba.org>
Date: Thu Oct 16 12:58:25 2008 +1100
Merge commit 'ronnie/master'
commit 0098efd4443038f2d902e3a7c3640e63f06be7d1
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 16:40:44 2008 +1100
new version 1.0.61
commit 3b8d49bf58f4145cdca08565f06cd43fd36991e1
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 16:29:09 2008 +1100
install the new multipath monitoring event script
commit f9779d3a237db59d7fdad92185ac7e42715466e6
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 16:27:33 2008 +1100
add an eventscript to monitor that the multipath devices are healthy
commit 6fb2f8a36239e5902e27cf10213f85faf216d6f1
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 08:33:37 2008 +1100
we must also check the status returned from the get tickles control to
determine whether it was successful or not
commit 9b1d089c99413f3681440f3cf33c293d118c9108
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 03:02:09 2008 +1100
lower the loglevel for the informational message that a TCP_ADD opeation
described an ip address not known to be a public address.
This could happen if someone for genuine reasons accesses a share
through a static ip address.
It can also happen if non homogenous public address configurations are
used and when a tcp description is pushed out to a different node that
does not server/know the specific ip address.
commit c0b3bd8a3fa580dca5afa97c8012fccb25231373
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 01:49:19 2008 +1100
change ip route add to route add -net since this works more reliably
update the makefile and rpm to install 99.routing
commit 77ed0d71b1fb8d06d70d01a8e8f9eb04ffe7f02f
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 01:32:46 2008 +1100
new version 1.0.60
commit 5747dd2d80af29d6252afb6aeb3e66328ee20de5
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 01:23:57 2008 +1100
verify that the nodes we try to ban/unban are operational and print an
error to the user othervise.
commit d13da2e8fe2fab619540525d98a5502a23ab7d20
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 01:08:29 2008 +1100
Revert "from Mathieu Parent <math.parent at gmail.com>"
This reverts commit dc9cd4779db4a89697731e4cf415be51067a07c1.
Conflicts:
commit 8e912abc2c68f5fe7b06c600ba6fec1a6900127c
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed Oct 15 00:24:44 2008 +1100
update the client side of getnodemap and getpublicips controls to
fallback to the old-style ipv4-only controls if the new-style ipv4/ipv6
control fails.
this allows a 1.0.59+ (ipv4/ipv6) ctdb daemon being recmaster to be
compatible with
pre-1.0.59 versions of ctdb that are ipv4 only.
commit 6b76c520f97127099bd9fbaa0fa7af1c61947fb7
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 14 10:40:29 2008 +1100
update TAKEIP/RELEASEIP/GETPUBLICIP/GETNODEMAP controls so we retain an
older ipv4-only version of these controls.
We need this so that we are backwardcompatible with old versions of ctdb
and so that we can interoperate with a ipv4-only recmaster during a
rolling upgrade.
commit dc9cd4779db4a89697731e4cf415be51067a07c1
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Oct 13 08:27:33 2008 +1100
from Mathieu Parent <math.parent at gmail.com>
Hi,
I have attached a patch necessary as debian log dir (/var/log) is not
a subdir of VARDIR (/var/lib on rpm systems, /var/lib/ctdb on debian).
As I don't know much about autotools and friends, this patch may be
hacky.
This is part of the process to minimize diff between distributions.
commit 07dd4c7d2e8ba10f53d4cf2644fc4b7b8647e286
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Oct 13 08:21:20 2008 +1100
From Mathieu Parent
patch to make debian systems log the package versions in
ctdb_diagnostics
commit a5d5aa455c7f7eb93d3fa6f403d5b8e0b795109d
Author: Andrew Tridgell <tridge at samba.org>
Date: Thu Oct 9 18:45:12 2008 +1100
added some more gpfs commands per-filesystem
commit dc108adada33bb713f71a2859eda3b439ed0cd1a
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 7 19:34:34 2008 +1100
skip empty lines in the public addresses file, not skip all non-empty
lines
commit 5f96b33a379c80ed8a39de1ee41f254cf48733f9
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 7 19:25:10 2008 +1100
from Michael Adams : allow #-style comments in the nodes and public
addresses file
commit 8e504fc8c01f750d1cb5d2289ef12c423daf1ad4
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 7 18:23:12 2008 +1100
new version 1.0.59
commit 4237bd3753dcb024c17461e974414bef1b609416
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 7 18:14:44 2008 +1100
remove an unused variable
commit e701a531868149f16561011e65794a4a46ee6596
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 7 18:12:54 2008 +1100
When we reload the nodes file
instead of shutting down/restarting the entire tcp layer
just bounce all outgoing connections and reconnect
commit d9779c310e98c9d4eab71a8d1705849ac90deb10
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Oct 7 11:03:30 2008 +1100
add a new eventscript : 99.routing that is used to add static routes to
interfaces when they are activated (an ip address is added during
takeip)
commit 000018f2f4fb9f2452f56731b027dd6a7beda111
Author: Andrew Tridgell <tridge at samba.org>
Date: Tue Sep 30 07:16:17 2008 -0700
The author of the upstream code asked for this code to be GPLv2+ not GPLv3
-----------------------------------------------------------------------
Summary of changes:
Makefile.in | 2 +
client/ctdb_client.c | 218 ++++++++++++++--
common/cmdline.c | 31 ++-
common/ctdb_util.c | 22 +-
config/ctdb.init | 3 +
config/ctdb.sysconfig | 4 +-
config/events.d/20.multipathd | 99 +++++++
config/events.d/50.samba | 2 +-
config/events.d/99.routing | 37 +++
doc/ctdbd.1 | 562 +++++++++++++++++++++++++++++++----------
include/ctdb.h | 19 ++-
include/ctdb_private.h | 62 ++++-
lib/util/idtree.c | 2 +-
packaging/RPM/ctdb.spec | 47 ++++-
server/ctdb_control.c | 25 ++-
server/ctdb_daemon.c | 45 +---
server/ctdb_keepalive.c | 6 +-
server/ctdb_lockwait.c | 2 +-
server/ctdb_logging.c | 12 +-
server/ctdb_monitor.c | 46 ++--
server/ctdb_persistent.c | 2 +-
server/ctdb_recover.c | 99 ++++++--
server/ctdb_recoverd.c | 133 +++++-----
server/ctdb_server.c | 15 +-
server/ctdb_takeover.c | 162 ++++++++++--
server/ctdb_tunables.c | 1 +
server/ctdbd.c | 14 +-
server/eventscript.c | 18 +-
tcp/tcp_init.c | 6 +-
tests/nodes.txt | 3 +
tools/ctdb.c | 17 +-
tools/ctdb_diagnostics | 13 +
32 files changed, 1328 insertions(+), 401 deletions(-)
create mode 100644 config/events.d/20.multipathd
create mode 100755 config/events.d/99.routing
Changeset truncated at 500 lines:
diff --git a/Makefile.in b/Makefile.in
index cf1240b..779bd8b 100755
--- a/Makefile.in
+++ b/Makefile.in
@@ -189,6 +189,7 @@ install: all
${INSTALLCMD} -m 644 config/events.d/README $(DESTDIR)/$(docdir)/ctdb/README.eventscripts
${INSTALLCMD} -m 755 config/events.d/00.ctdb $(DESTDIR)$(etcdir)/ctdb/events.d
${INSTALLCMD} -m 755 config/events.d/10.interface $(DESTDIR)$(etcdir)/ctdb/events.d
+ ${INSTALLCMD} -m 755 config/events.d/20.multipathd $(DESTDIR)$(etcdir)/ctdb/events.d
${INSTALLCMD} -m 755 config/events.d/40.vsftpd $(DESTDIR)$(etcdir)/ctdb/events.d
${INSTALLCMD} -m 755 config/events.d/41.httpd $(DESTDIR)$(etcdir)/ctdb/events.d
${INSTALLCMD} -m 755 config/events.d/50.samba $(DESTDIR)$(etcdir)/ctdb/events.d
@@ -197,6 +198,7 @@ install: all
${INSTALLCMD} -m 755 config/events.d/70.iscsi $(DESTDIR)$(etcdir)/ctdb/events.d
${INSTALLCMD} -m 755 config/events.d/90.ipmux $(DESTDIR)$(etcdir)/ctdb/events.d
${INSTALLCMD} -m 755 config/events.d/91.lvs $(DESTDIR)$(etcdir)/ctdb/events.d
+ ${INSTALLCMD} -m 755 config/events.d/99.routing $(DESTDIR)$(etcdir)/ctdb/events.d
${INSTALLCMD} -m 755 tools/ctdb_diagnostics $(DESTDIR)$(bindir)
${INSTALLCMD} -m 755 tools/onnode $(DESTDIR)$(bindir)
if [ -f doc/ctdb.1 ];then ${INSTALLCMD} -d $(DESTDIR)$(mandir)/man1; fi
diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index 6d80efc..16fc03b 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -26,6 +26,7 @@
#include "system/network.h"
#include "system/filesys.h"
#include "system/locale.h"
+#include <stdlib.h>
#include "../include/ctdb_private.h"
#include "lib/util/dlinklist.h"
@@ -1221,7 +1222,7 @@ int ctdb_ctrl_getdbmap(struct ctdb_context *ctdb, struct timeval timeout, uint32
CTDB_CONTROL_GET_DBMAP, 0, tdb_null,
mem_ctx, &outdata, &res, &timeout, NULL);
if (ret != 0 || res != 0) {
- DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getdbmap failed\n"));
+ DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getdbmap failed ret:%d res:%d\n", ret, res));
return -1;
}
@@ -1245,8 +1246,12 @@ int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb,
ret = ctdb_control(ctdb, destnode, 0,
CTDB_CONTROL_GET_NODEMAP, 0, tdb_null,
mem_ctx, &outdata, &res, &timeout, NULL);
+ if (ret == 0 && res == -1 && outdata.dsize == 0) {
+ DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getnodes failed, falling back to ipv4-only control\n"));
+ return ctdb_ctrl_getnodemapv4(ctdb, timeout, destnode, mem_ctx, nodemap);
+ }
if (ret != 0 || res != 0 || outdata.dsize == 0) {
- DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getnodes failed\n"));
+ DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getnodes failed ret:%d res:%d\n", ret, res));
return -1;
}
@@ -1257,6 +1262,45 @@ int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb,
}
/*
+ old style ipv4-only get a list of nodes (vnn and flags ) from a remote node
+ */
+int ctdb_ctrl_getnodemapv4(struct ctdb_context *ctdb,
+ struct timeval timeout, uint32_t destnode,
+ TALLOC_CTX *mem_ctx, struct ctdb_node_map **nodemap)
+{
+ int ret, i, len;
+ TDB_DATA outdata;
+ struct ctdb_node_mapv4 *nodemapv4;
+ int32_t res;
+
+ ret = ctdb_control(ctdb, destnode, 0,
+ CTDB_CONTROL_GET_NODEMAPv4, 0, tdb_null,
+ mem_ctx, &outdata, &res, &timeout, NULL);
+ if (ret != 0 || res != 0 || outdata.dsize == 0) {
+ DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getnodesv4 failed ret:%d res:%d\n", ret, res));
+ return -1;
+ }
+
+ nodemapv4 = (struct ctdb_node_mapv4 *)outdata.dptr;
+
+ len = offsetof(struct ctdb_node_map, nodes) + nodemapv4->num*sizeof(struct ctdb_node_and_flags);
+ (*nodemap) = talloc_zero_size(mem_ctx, len);
+ CTDB_NO_MEMORY(ctdb, (*nodemap));
+
+ (*nodemap)->num = nodemapv4->num;
+ for (i=0; i<nodemapv4->num; i++) {
+ (*nodemap)->nodes[i].pnn = nodemapv4->nodes[i].pnn;
+ (*nodemap)->nodes[i].flags = nodemapv4->nodes[i].flags;
+ (*nodemap)->nodes[i].addr.ip = nodemapv4->nodes[i].sin;
+ (*nodemap)->nodes[i].addr.sa.sa_family = AF_INET;
+ }
+
+ talloc_free(outdata.dptr);
+
+ return 0;
+}
+
+/*
drop the transport, reload the nodes file and restart the transport
*/
int ctdb_ctrl_reload_nodes_file(struct ctdb_context *ctdb,
@@ -2050,14 +2094,26 @@ int ctdb_ctrl_takeover_ip(struct ctdb_context *ctdb, struct timeval timeout,
uint32_t destnode, struct ctdb_public_ip *ip)
{
TDB_DATA data;
+ struct ctdb_public_ipv4 ipv4;
int ret;
int32_t res;
- data.dsize = sizeof(*ip);
- data.dptr = (uint8_t *)ip;
+ if (ip->addr.sa.sa_family == AF_INET) {
+ ipv4.pnn = ip->pnn;
+ ipv4.sin = ip->addr.ip;
- ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_TAKEOVER_IP, 0, data, NULL,
+ data.dsize = sizeof(ipv4);
+ data.dptr = (uint8_t *)&ipv4;
+
+ ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_TAKEOVER_IPv4, 0, data, NULL,
NULL, &res, &timeout, NULL);
+ } else {
+ data.dsize = sizeof(*ip);
+ data.dptr = (uint8_t *)ip;
+
+ ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_TAKEOVER_IP, 0, data, NULL,
+ NULL, &res, &timeout, NULL);
+ }
if (ret != 0 || res != 0) {
DEBUG(DEBUG_ERR,(__location__ " ctdb_control for takeover_ip failed\n"));
@@ -2075,14 +2131,26 @@ int ctdb_ctrl_release_ip(struct ctdb_context *ctdb, struct timeval timeout,
uint32_t destnode, struct ctdb_public_ip *ip)
{
TDB_DATA data;
+ struct ctdb_public_ipv4 ipv4;
int ret;
int32_t res;
- data.dsize = sizeof(*ip);
- data.dptr = (uint8_t *)ip;
+ if (ip->addr.sa.sa_family == AF_INET) {
+ ipv4.pnn = ip->pnn;
+ ipv4.sin = ip->addr.ip;
- ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_RELEASE_IP, 0, data, NULL,
- NULL, &res, &timeout, NULL);
+ data.dsize = sizeof(ipv4);
+ data.dptr = (uint8_t *)&ipv4;
+
+ ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_RELEASE_IPv4, 0, data, NULL,
+ NULL, &res, &timeout, NULL);
+ } else {
+ data.dsize = sizeof(*ip);
+ data.dptr = (uint8_t *)ip;
+
+ ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_RELEASE_IP, 0, data, NULL,
+ NULL, &res, &timeout, NULL);
+ }
if (ret != 0 || res != 0) {
DEBUG(DEBUG_ERR,(__location__ " ctdb_control for release_ip failed\n"));
@@ -2230,8 +2298,12 @@ int ctdb_ctrl_get_public_ips(struct ctdb_context *ctdb,
ret = ctdb_control(ctdb, destnode, 0,
CTDB_CONTROL_GET_PUBLIC_IPS, 0, tdb_null,
mem_ctx, &outdata, &res, &timeout, NULL);
+ if (ret == 0 && res == -1) {
+ DEBUG(DEBUG_ERR,(__location__ " ctdb_control to get public ips failed, falling back to ipv4-only version\n"));
+ return ctdb_ctrl_get_public_ipsv4(ctdb, timeout, destnode, mem_ctx, ips);
+ }
if (ret != 0 || res != 0) {
- DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getpublicips failed\n"));
+ DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getpublicips failed ret:%d res:%d\n", ret, res));
return -1;
}
@@ -2241,6 +2313,38 @@ int ctdb_ctrl_get_public_ips(struct ctdb_context *ctdb,
return 0;
}
+int ctdb_ctrl_get_public_ipsv4(struct ctdb_context *ctdb,
+ struct timeval timeout, uint32_t destnode,
+ TALLOC_CTX *mem_ctx, struct ctdb_all_public_ips **ips)
+{
+ int ret, i, len;
+ TDB_DATA outdata;
+ int32_t res;
+ struct ctdb_all_public_ipsv4 *ipsv4;
+
+ ret = ctdb_control(ctdb, destnode, 0,
+ CTDB_CONTROL_GET_PUBLIC_IPSv4, 0, tdb_null,
+ mem_ctx, &outdata, &res, &timeout, NULL);
+ if (ret != 0 || res != 0) {
+ DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getpublicips failed\n"));
+ return -1;
+ }
+
+ ipsv4 = (struct ctdb_all_public_ipsv4 *)outdata.dptr;
+ len = offsetof(struct ctdb_all_public_ips, ips) +
+ ipsv4->num*sizeof(struct ctdb_public_ip);
+ *ips = talloc_zero_size(mem_ctx, len);
+ (*ips)->num = ipsv4->num;
+ for (i=0; i<ipsv4->num; i++) {
+ (*ips)->ips[i].pnn = ipsv4->ips[i].pnn;
+ (*ips)->ips[i].addr.ip = ipsv4->ips[i].sin;
+ }
+
+ talloc_free(outdata.dptr);
+
+ return 0;
+}
+
/*
set/clear the permanent disabled bit on a remote node
*/
@@ -2249,23 +2353,59 @@ int ctdb_ctrl_modflags(struct ctdb_context *ctdb, struct timeval timeout, uint32
{
int ret;
TDB_DATA data;
- struct ctdb_node_modflags m;
- int32_t res;
+ struct ctdb_node_map *nodemap=NULL;
+ struct ctdb_node_flag_change c;
+ TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
+ uint32_t recmaster;
+ uint32_t *nodes;
- m.set = set;
- m.clear = clear;
- data.dsize = sizeof(m);
- data.dptr = (unsigned char *)&m;
+ /* find the recovery master */
+ ret = ctdb_ctrl_getrecmaster(ctdb, tmp_ctx, timeout, CTDB_CURRENT_NODE, &recmaster);
+ if (ret != 0) {
+ DEBUG(DEBUG_ERR, (__location__ " Unable to get recmaster from local node\n"));
+ talloc_free(tmp_ctx);
+ return ret;
+ }
- ret = ctdb_control(ctdb, destnode, 0,
- CTDB_CONTROL_MODIFY_FLAGS, 0, data,
- NULL, NULL, &res, &timeout, NULL);
- if (ret != 0 || res != 0) {
- DEBUG(DEBUG_ERR,(__location__ " ctdb_control for modflags failed\n"));
+
+ /* read the node flags from the recmaster */
+ ret = ctdb_ctrl_getnodemap(ctdb, timeout, recmaster, tmp_ctx, &nodemap);
+ if (ret != 0) {
+ DEBUG(DEBUG_ERR, (__location__ " Unable to get nodemap from node %u\n", destnode));
+ talloc_free(tmp_ctx);
return -1;
}
+ if (destnode >= nodemap->num) {
+ DEBUG(DEBUG_ERR,(__location__ " Nodemap from recmaster does not contain node %d\n", destnode));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ c.pnn = destnode;
+ c.old_flags = nodemap->nodes[destnode].flags;
+ c.new_flags = c.old_flags;
+ c.new_flags |= set;
+ c.new_flags &= ~clear;
+ data.dsize = sizeof(c);
+ data.dptr = (unsigned char *)&c;
+
+ /* send the flags update to all connected nodes */
+ nodes = list_of_connected_nodes(ctdb, nodemap, tmp_ctx, true);
+
+ if (ctdb_client_async_control(ctdb, CTDB_CONTROL_MODIFY_FLAGS,
+ nodes,
+ timeout, false, data,
+ NULL, NULL,
+ NULL) != 0) {
+ DEBUG(DEBUG_ERR, (__location__ " ctdb_control to disable node failed\n"));
+
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ talloc_free(tmp_ctx);
return 0;
}
@@ -2435,7 +2575,7 @@ int ctdb_ctrl_get_tcp_tickles(struct ctdb_context *ctdb,
ret = ctdb_control(ctdb, destnode, 0,
CTDB_CONTROL_GET_TCP_TICKLE_LIST, 0, data,
mem_ctx, &outdata, &status, NULL, NULL);
- if (ret != 0) {
+ if (ret != 0 || status != 0) {
DEBUG(DEBUG_ERR,(__location__ " ctdb_control for get tcp tickles failed\n"));
return -1;
}
@@ -2855,6 +2995,40 @@ uint32_t *list_of_active_nodes(struct ctdb_context *ctdb,
return nodes;
}
+uint32_t *list_of_connected_nodes(struct ctdb_context *ctdb,
+ struct ctdb_node_map *node_map,
+ TALLOC_CTX *mem_ctx,
+ bool include_self)
+{
+ int i, j, num_nodes;
+ uint32_t *nodes;
+
+ for (i=num_nodes=0;i<node_map->num;i++) {
+ if (node_map->nodes[i].flags & NODE_FLAGS_DISCONNECTED) {
+ continue;
+ }
+ if (node_map->nodes[i].pnn == ctdb->pnn && !include_self) {
+ continue;
+ }
+ num_nodes++;
+ }
+
+ nodes = talloc_array(mem_ctx, uint32_t, num_nodes);
+ CTDB_NO_MEMORY_FATAL(ctdb, nodes);
+
+ for (i=j=0;i<node_map->num;i++) {
+ if (node_map->nodes[i].flags & NODE_FLAGS_DISCONNECTED) {
+ continue;
+ }
+ if (node_map->nodes[i].pnn == ctdb->pnn && !include_self) {
+ continue;
+ }
+ nodes[j++] = node_map->nodes[i].pnn;
+ }
+
+ return nodes;
+}
+
/*
this is used to test if a pnn lock exists and if it exists will return
the number of connections that pnn has reported or -1 if that recovery
diff --git a/common/cmdline.c b/common/cmdline.c
index b6e3541..ea81faf 100644
--- a/common/cmdline.c
+++ b/common/cmdline.c
@@ -33,7 +33,6 @@ static struct {
int torture;
const char *events;
} ctdb_cmdline = {
- .socketname = CTDB_PATH,
.torture = 0,
};
@@ -81,11 +80,14 @@ struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
ctdb_set_flags(ctdb, CTDB_FLAG_TORTURE);
}
- /* tell ctdb the socket address */
- ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
- if (ret == -1) {
- printf("ctdb_set_socketname failed - %s\n", ctdb_errstr(ctdb));
- exit(1);
+ /* command line specified a socket name */
+ if (ctdb_cmdline.socketname != NULL) {
+ ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
+ if (ret == -1) {
+ printf("ctdb_set_socketname failed - %s\n",
+ ctdb_errstr(ctdb));
+ exit(1);
+ }
}
/* set up the tree to store server ids */
@@ -101,6 +103,7 @@ struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
struct ctdb_context *ctdb_cmdline_client(struct event_context *ev)
{
struct ctdb_context *ctdb;
+ char *socket_name;
int ret;
/* initialise ctdb */
@@ -111,10 +114,18 @@ struct ctdb_context *ctdb_cmdline_client(struct event_context *ev)
}
/* tell ctdb the socket address */
- ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
- if (ret == -1) {
- fprintf(stderr, "ctdb_set_socketname failed - %s\n", ctdb_errstr(ctdb));
- exit(1);
+ socket_name = getenv("CTDB_SOCKET");
+ if (socket_name != NULL) {
+ ctdb_set_socketname(ctdb, socket_name);
+ }
+
+ if (ctdb_cmdline.socketname != NULL) {
+ ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
+ if (ret == -1) {
+ fprintf(stderr, "ctdb_set_socketname failed - %s\n",
+ ctdb_errstr(ctdb));
+ exit(1);
+ }
}
ret = ctdb_socket_connect(ctdb);
diff --git a/common/ctdb_util.c b/common/ctdb_util.c
index cc68291..b5a3508 100644
--- a/common/ctdb_util.c
+++ b/common/ctdb_util.c
@@ -124,12 +124,18 @@ static void *_idr_find_type(struct idr_context *idp, int id, const char *type, c
/*
update a max latency number
*/
-void ctdb_latency(double *latency, struct timeval t)
+void ctdb_latency(struct ctdb_db_context *ctdb_db, const char *name, double *latency, struct timeval t)
{
double l = timeval_elapsed(&t);
if (l > *latency) {
*latency = l;
}
+
+ if (ctdb_db->ctdb->tunable.log_latency_ms !=0) {
+ if (l*1000 > ctdb_db->ctdb->tunable.log_latency_ms) {
+ DEBUG(DEBUG_WARNING, ("High latency %fs for operation %s on database %s\n", l*1000000, name, ctdb_db->db_name));
+ }
+ }
}
uint32_t ctdb_reqid_new(struct ctdb_context *ctdb, void *state)
@@ -362,12 +368,12 @@ void set_close_on_exec(int fd)
}
-static bool parse_ipv4(const char *s, unsigned port, ctdb_sock_addr *saddr)
+bool parse_ipv4(const char *s, unsigned port, struct sockaddr_in *sin)
{
- saddr->ip.sin_family = AF_INET;
- saddr->ip.sin_port = htons(port);
+ sin->sin_family = AF_INET;
+ sin->sin_port = htons(port);
- if (inet_pton(AF_INET, s, &saddr->ip.sin_addr) != 1) {
+ if (inet_pton(AF_INET, s, &sin->sin_addr) != 1) {
DEBUG(DEBUG_ERR, (__location__ " Failed to translate %s into sin_addr\n", s));
return false;
}
@@ -427,7 +433,7 @@ bool parse_ip_port(const char *addr, ctdb_sock_addr *saddr)
/* now is this a ipv4 or ipv6 address ?*/
p = index(s, ':');
if (p == NULL) {
- ret = parse_ipv4(s, port, saddr);
+ ret = parse_ipv4(s, port, &saddr->ip);
} else {
ret = parse_ipv6(s, port, saddr);
}
@@ -447,7 +453,7 @@ bool parse_ip(const char *addr, ctdb_sock_addr *saddr)
/* now is this a ipv4 or ipv6 address ?*/
p = index(addr, ':');
if (p == NULL) {
- ret = parse_ipv4(addr, 0, saddr);
+ ret = parse_ipv4(addr, 0, &saddr->ip);
} else {
ret = parse_ipv6(addr, 0, saddr);
}
@@ -493,7 +499,7 @@ bool parse_ip_mask(const char *str, ctdb_sock_addr *addr, unsigned *mask)
/* now is this a ipv4 or ipv6 address ?*/
p = index(s, ':');
if (p == NULL) {
- ret = parse_ipv4(s, 0, addr);
+ ret = parse_ipv4(s, 0, &addr->ip);
} else {
ret = parse_ipv6(s, 0, addr);
}
diff --git a/config/ctdb.init b/config/ctdb.init
index eb56ef6..9e06c24 100755
--- a/config/ctdb.init
+++ b/config/ctdb.init
@@ -75,6 +75,9 @@ CTDB_OPTIONS="$CTDB_OPTIONS --reclock=$CTDB_RECOVERY_LOCK"
[ -z "$CTDB_LVS_PUBLIC_IP" ] || {
CTDB_OPTIONS="$CTDB_OPTIONS --lvs"
}
+[ -z "$CTDB_SCRIPT_LOG_LEVEL" ] || {
+ CTDB_OPTIONS="$CTDB_OPTIONS --script-log-level=$CTDB_SCRIPT_LOG_LEVEL"
+}
if [ "$CTDB_VALGRIND" = "yes" ]; then
init_style="valgrind"
diff --git a/config/ctdb.sysconfig b/config/ctdb.sysconfig
index 84a90d0..35a9819 100644
--- a/config/ctdb.sysconfig
+++ b/config/ctdb.sysconfig
@@ -135,8 +135,8 @@
# CTDB_LOGFILE=/var/log/log.ctdb
# what debug level to run at. Higher means more verbose
-# the default is 0
-# CTDB_DEBUGLEVEL=0
+# the default is 2
+CTDB_DEBUGLEVEL=2
# set any default tuning options for ctdb
# use CTDB_SET_XXXX=value where XXXX is the name of the tuning
diff --git a/config/events.d/20.multipathd b/config/events.d/20.multipathd
new file mode 100644
index 0000000..93a58ab
--- /dev/null
--
CTDB repository
More information about the samba-cvs
mailing list