The branch, master has been updated
       via  5d3018c37179966f75183d9a98790eaaaf1d2cfc (commit)
       via  01633d30f764e8da42c4e5c4710b69cd379c9b39 (commit)
      from  aeb09b08e060be6f833d84ba88abfb168cc5f50e (commit)

http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 5d3018c37179966f75183d9a98790eaaaf1d2cfc
Author: root <[EMAIL PROTECTED]>
Date:   Fri Dec 5 10:33:38 2008 +1100

    some platforms are very picky about the third argument passed to bind().
    and would complain if sa.family is AF_INET and the third argument is not 
exactly the size of a sockaddr_in.
    
    We used to pass a union containing both a sockaddr_in and a sockaddr_in6  
which would mean that on those platforms bind() would fail since the passed 
structure for AF_INET would be too big.
    
    Thus we need to set and pass the appropriate size to bind. At the same time 
for thos eplatforms we can also set sin[6]_size to the expected size.
    (bind() on those platforms were isurprisingly perfectly ok with sin_len was 
"too big")

commit 01633d30f764e8da42c4e5c4710b69cd379c9b39
Author: Ronnie Sahlberg <[EMAIL PROTECTED]>
Date:   Thu Dec 4 15:25:03 2008 +1100

    new version 1.0.67

-----------------------------------------------------------------------

Summary of changes:
 packaging/RPM/ctdb.spec |   12 ++++++++++-
 tcp/tcp_connect.c       |   49 +++++++++++++++++++++++++++++++++-------------
 2 files changed, 46 insertions(+), 15 deletions(-)


Changeset truncated at 500 lines:

diff --git a/packaging/RPM/ctdb.spec b/packaging/RPM/ctdb.spec
index b8ec19f..0c3ba05 100644
--- a/packaging/RPM/ctdb.spec
+++ b/packaging/RPM/ctdb.spec
@@ -5,7 +5,7 @@ Vendor: Samba Team
 Packager: Samba Team <[EMAIL PROTECTED]>
 Name: ctdb
 Version: 1.0
-Release: 66
+Release: 67
 Epoch: 0
 License: GNU GPL version 3
 Group: System Environment/Daemons
@@ -121,6 +121,16 @@ fi
 %{_includedir}/ctdb_private.h
 
 %changelog
+* Thu Dec 3 2008 : Version 1.0.67
+ - Add a document describing the recovery process.
+ - Fix a bug in "ctdb setdebug" where it would refuse to set a negative
+   debug level.
+ - Print the list of literals for debug names if an invalid one was given
+   to "ctdb setdebug"
+ - Redesign how "ctdb reloadnodes" works and reduce the amont of tcp teardowns
+   used during this event.
+ - Make it possible to delete a public ip from all nodes at once using
+   "ctdb delip -n all"
 * Mon Nov 24 2008 : Version 1.0.66
  - Allow to change the recmaster even when we are not frozen.
  - Remove two redundant SAMBA_CHECK variables from the sysconf example
diff --git a/tcp/tcp_connect.c b/tcp/tcp_connect.c
index bd8af57..cd0693c 100644
--- a/tcp/tcp_connect.c
+++ b/tcp/tcp_connect.c
@@ -2,6 +2,7 @@
    ctdb over TCP
 
    Copyright (C) Andrew Tridgell  2006
+   Copyright (C) Ronnie Sahlberg  2008
 
    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
@@ -127,6 +128,7 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct 
timed_event *te,
                                                      struct ctdb_tcp_node);
        struct ctdb_context *ctdb = node->ctdb;
         ctdb_sock_addr sock_in;
+       int sockin_size;
         ctdb_sock_addr sock_out;
 
        ctdb_tcp_stop_connection(node);
@@ -151,7 +153,7 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct 
timed_event *te,
                return;
        }
 
-DEBUG(DEBUG_ERR,("create socket...\n"));
+       DEBUG(DEBUG_ERR,("create socket...\n"));
        tnode->fd = socket(sock_out.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
        set_nonblocking(tnode->fd);
        set_close_on_exec(tnode->fd);
@@ -163,13 +165,25 @@ DEBUG(DEBUG_ERR,("create socket...\n"));
         * a dedicated non-routeable network.
         */
        ZERO_STRUCT(sock_in);
-#ifdef HAVE_SOCK_SIN_LEN
-       sock_in.ip.sin_len = sizeof(sock_in);
-#endif
        if (ctdb_tcp_get_address(ctdb, ctdb->address.address, &sock_in) != 0) {
                return;
        }
-       bind(tnode->fd, (struct sockaddr *)&sock_in, sizeof(sock_in));
+       switch (sock_in.sa.sa_family) {
+       case AF_INET:
+               sockin_size = sizeof(sock_in.ip);
+               break;
+       case AF_INET6:
+               sockin_size = sizeof(sock_in.ip6);
+               break;
+       default:
+               DEBUG(DEBUG_ERR, (__location__ " unknown family %u\n",
+                       sock_in.sa.sa_family));
+               return;
+       }
+#ifdef HAVE_SOCK_SIN_LEN
+       sock_in.ip.sin_len = sockin_size;
+#endif
+       bind(tnode->fd, (struct sockaddr *)&sock_in, sockin_size);
 
        if (connect(tnode->fd, (struct sockaddr *)&sock_out, sizeof(sock_out)) 
!= 0 &&
            errno != EINPROGRESS) {
@@ -249,6 +263,7 @@ static int ctdb_tcp_listen_automatic(struct ctdb_context 
*ctdb)
        const char *lock_path = "/tmp/.ctdb_socket_lock";
        struct flock lock;
        int one = 1;
+       int sock_size;
 
        /* in order to ensure that we don't get two nodes with the
           same adddress, we must make the bind() and listen() calls
@@ -283,9 +298,6 @@ static int ctdb_tcp_listen_automatic(struct ctdb_context 
*ctdb)
                }
 
                ZERO_STRUCT(sock);
-#ifdef HAVE_SOCK_SIN_LEN
-               sock.ip.sin_len = sizeof(sock);
-#endif
                if (ctdb_tcp_get_address(ctdb,
                                ctdb->nodes[i]->address.address, 
                                &sock) != 0) {
@@ -295,15 +307,20 @@ static int ctdb_tcp_listen_automatic(struct ctdb_context 
*ctdb)
                switch (sock.sa.sa_family) {
                case AF_INET:
                        sock.ip.sin_port = htons(ctdb->nodes[i]->address.port);
+                       sock_size = sizeof(sock.ip);
                        break;
                case AF_INET6:
                        sock.ip6.sin6_port = 
htons(ctdb->nodes[i]->address.port);
+                       sock_size = sizeof(sock.ip6);
                        break;
                default:
                        DEBUG(DEBUG_ERR, (__location__ " unknown family %u\n",
                                sock.sa.sa_family));
                        continue;
                }
+#ifdef HAVE_SOCK_SIN_LEN
+               sock.ip.sin_len = sock_size;
+#endif
 
                ctcp->listen_fd = socket(sock.sa.sa_family, SOCK_STREAM, 
IPPROTO_TCP);
                if (ctcp->listen_fd == -1) {
@@ -315,8 +332,8 @@ static int ctdb_tcp_listen_automatic(struct ctdb_context 
*ctdb)
 
                setsockopt(ctcp->listen_fd,SOL_SOCKET,SO_REUSEADDR,(char 
*)&one,sizeof(one));
 
-               if (bind(ctcp->listen_fd, (struct sockaddr * )&sock, 
-                        sizeof(sock)) == 0) {
+               if (bind(ctcp->listen_fd, (struct sockaddr * )&sock, sock_size) 
== 0) {
+                       DEBUG(DEBUG_ERR,(__location__ " Failed to bind() to 
socket. %s(%d)\n", strerror(errno), errno));
                        break;
                }
        }
@@ -368,6 +385,7 @@ int ctdb_tcp_listen(struct ctdb_context *ctdb)
        struct ctdb_tcp *ctcp = talloc_get_type(ctdb->private_data,
                                                struct ctdb_tcp);
         ctdb_sock_addr sock;
+       int sock_size;
        int one = 1;
 
        /* we can either auto-bind to the first available address, or we can
@@ -377,9 +395,6 @@ int ctdb_tcp_listen(struct ctdb_context *ctdb)
        }
 
        ZERO_STRUCT(sock);
-#ifdef HAVE_SOCK_SIN_LEN
-       sock.ip.sin_len = sizeof(sock);
-#endif
        if (ctdb_tcp_get_address(ctdb, ctdb->address.address, 
                                 &sock) != 0) {
                goto failed;
@@ -388,15 +403,20 @@ int ctdb_tcp_listen(struct ctdb_context *ctdb)
        switch (sock.sa.sa_family) {
        case AF_INET:
                sock.ip.sin_port = htons(ctdb->address.port);
+               sock_size = sizeof(sock.ip);
                break;
        case AF_INET6:
                sock.ip6.sin6_port = htons(ctdb->address.port);
+               sock_size = sizeof(sock.ip6);
                break;
        default:
                DEBUG(DEBUG_ERR, (__location__ " unknown family %u\n",
                        sock.sa.sa_family));
                goto failed;
        }
+#ifdef HAVE_SOCK_SIN_LEN
+       sock.ip.sin_len = sock_size;
+#endif
 
        ctcp->listen_fd = socket(sock.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
        if (ctcp->listen_fd == -1) {
@@ -408,7 +428,8 @@ int ctdb_tcp_listen(struct ctdb_context *ctdb)
 
         setsockopt(ctcp->listen_fd,SOL_SOCKET,SO_REUSEADDR,(char 
*)&one,sizeof(one));
 
-       if (bind(ctcp->listen_fd, (struct sockaddr * )&sock, sizeof(sock)) != 
0) {
+       if (bind(ctcp->listen_fd, (struct sockaddr * )&sock, sock_size) != 0) {
+               DEBUG(DEBUG_ERR,(__location__ " Failed to bind() to socket. 
%s(%d)\n", strerror(errno), errno));
                goto failed;
        }
 


-- 
CTDB repository

Reply via email to