Hi,

On 2010/01/26 1:30, PCextreme B.V. - Wido den Hollander wrote:
> Hi,
> 
> r...@wido-desktop:~# corosync-cfgtool -s
> Printing ring status.
> Local node ID 537307328
> RING ID 0
>       id      = 192.168.6.32
>       status  = ring 0 active with no faults
> r...@wido-desktop:~# 

Your corosync seems to work right.
The problem is that the collie fails to get the local ip address.

Could you try the following patch?

==
From: MORITA Kazutaka <[email protected]>
Date: Tue, 26 Jan 2010 14:33:02 +0900
Subject: [PATCH] collie: avoid using an invalid address

Some distributions contain `127.0.1.1' in /etc/hosts.
We avoid using these kind of invalid addresses.

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 collie/group.c |   46 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/collie/group.c b/collie/group.c
index cbb4761..676706d 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -728,7 +728,7 @@ struct cluster_info *create_cluster(int port)
        int fd, ret;
        cpg_handle_t cpg_handle;
        struct cluster_info *ci;
-       struct addrinfo hints, *res;
+       struct addrinfo hints, *res, *res0;
        char name[INET6_ADDRSTRLEN];
        struct cpg_name group = { 8, "sheepdog" };
        cpg_callbacks_t cb = { &sd_deliver, &sd_confch };
@@ -782,23 +782,43 @@ join_retry:
        memset(&hints, 0, sizeof(hints));

        hints.ai_socktype = SOCK_STREAM;
-       ret = getaddrinfo(name, NULL, &hints, &res);
+       ret = getaddrinfo(name, NULL, &hints, &res0);
        if (ret)
                exit(1);

-       if (res->ai_family == AF_INET) {
-               struct sockaddr_in *addr = (struct sockaddr_in *)res->ai_addr;
-               memset(ci->this_node.addr, 0, sizeof(ci->this_node.addr));
-               memcpy(ci->this_node.addr + 12, &addr->sin_addr, 4);
-       } else if (res->ai_family == AF_INET6) {
-               struct sockaddr_in6 *addr = (struct sockaddr_in6 *)res->ai_addr;
-               memcpy(ci->this_node.addr, &addr->sin6_addr, 16);
-       } else {
-               eprintf("unknown address family\n");
-               exit(1);
+       for (res = res0; res; res = res->ai_next) {
+               if (res->ai_family == AF_INET) {
+                       struct sockaddr_in *addr;
+                       addr = (struct sockaddr_in *)res->ai_addr;
+
+                       if (((char *) &addr->sin_addr)[0] == 127)
+                               continue;
+
+                       memset(ci->this_node.addr, 0, 12);
+                       memcpy(ci->this_node.addr + 12, &addr->sin_addr, 4);
+                       break;
+               } else if (res->ai_family == AF_INET6) {
+                       struct sockaddr_in6 *addr;
+                       uint8_t localhost[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
+                                                 0, 0, 0, 0, 0, 0, 0, 1 };
+
+                       addr = (struct sockaddr_in6 *)res->ai_addr;
+
+                       if (memcmp(&addr->sin6_addr, localhost, 16) == 0)
+                               continue;
+
+                       memcpy(ci->this_node.addr, &addr->sin6_addr, 16);
+                       break;
+               } else
+                       dprintf("unknown address family\n");
+       }
+
+       if (res == NULL) {
+               eprintf("failed to get address info\n");
+               return NULL;
        }

-       freeaddrinfo(res);
+       freeaddrinfo(res0);

        ci->this_node.port = port;

-- 
1.6.5
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to