
dejanmm at fastmail
Oct 15, 2009, 5:57 AM
Post #4 of 4
(912 views)
Permalink
|
Hi Kazunori-san, On Thu, Oct 15, 2009 at 07:22:43PM +0900, Kazunori INOUE wrote: > Hi Dejan, > > Dejan Muhamedagic wrote: > >Hi Kazunori-san, > > > >On Fri, Oct 09, 2009 at 07:17:15PM +0900, Kazunori INOUE wrote: > >>Hi, > >> > >>I found that IPv6addr failed to assign the address in the following > >>environments. > >>I attached patch for IPv6addr in Cluster Resource Agents > >>(changeset:de034cf1e9a1). > >> > >>1) environments > >> # ifconfig bond0 > >> bond0 Link encap:Ethernet HWaddr 00:10:18:27:02:D3 > >> inet6 addr: 2001:db8:91:0:92::181/80 Scope:Global > >> [snip] > >> > >> # ifconfig eth0 > >> eth0 Link encap:Ethernet HWaddr 00:1A:64:06:59:92 > >> inet6 addr: 2001:db8:91:0:91::182/64 Scope:Global > >> [snip] > >> > >> # grep ^2001 /proc/net/if_inet6 > >> 20010db8009100000091000000000182 0e 40 00 80 eth0 > >> 20010db8009100000092000000000181 0c 50 00 80 bond0 > >> (* POINT which fails is this order.) > > > >You mean the order of interface list influences the processing? > > > Yes. (and it is also important that prefix_len is different.) > IPv6addr will be successful if it is the following order. > > # grep ^2001 /proc/net/if_inet6 > 20010db8009100000092000000000181 0c 50 00 80 bond0 > 20010db8009100000091000000000182 0e 40 00 80 eth0 > # > > >>2) IPv6addr start op > >> # env | grep OCF_RESKEY > >> OCF_RESKEY_ipv6addr=2001:db8:91:0:92::189 > >> OCF_RESKEY_nic=bond0 > >> (* OCF_RESKEY_cidr_netmask is not specified intentionally.) > >> > >> # /usr/lib/ocf/resource.d/heartbeat/IPv6addr start > >> # echo $? > >> 1 > >> # > >> > >>I hope they are helpful to you. > >> > >>Regards, > >>Kazunori INOUE > > > >>diff -urN agents.org/heartbeat/IPv6addr.c agents.mod/heartbeat/IPv6addr.c > >>--- agents.org/heartbeat/IPv6addr.c 2009-10-09 15:13:50.000000000 +0900 > >>+++ agents.mod/heartbeat/IPv6addr.c 2009-10-09 15:19:36.000000000 +0900 > >>@@ -294,6 +294,7 @@ > >> /* release the pid file */ > >> unlink(pid_file); > >>+ cl_log(LOG_DEBUG, "%s %s : %d", getenv("OCF_RESOURCE_INSTANCE"), argv[1], ret); > >> return ret; > >> } > >> int > >>@@ -513,7 +514,6 @@ > >> if (*plen_target!=0 && plen != *plen_target) { > >> continue; > >> } > >>- *plen_target = plen; > >> /* If interface name provided, only same devname entry > >> * would be considered > >>@@ -554,6 +554,7 @@ > >> /* We found it! */ > >> if (same) { > >> fclose(f); > >>+ *plen_target = plen; > >> return devname; > >> } > >> } > > > >I looked at the code twice, but can't see how this patch would > >make the difference. plen doesn't change in that code segment, so > >how can moving that assignment make plen_target different. Can > >you please explain in more detail. > > > Since plen is the value read from if_inet6 file, I recognize it as > changing... > When the line of eth0 is read, it's set as 64 (=0x40), > and the line of bond0 is read, it's set as 80 (=0x50). OK, now I got it. Sorry for being slow. I'll apply your patch. Many thanks. Cheers, Dejan > Please see the attached gdb.log for details. > > Best Regards, > Kazunori INOUE > > >Cheers, > > > >Dejan > > > >>_______________________________________________________ > >>Linux-HA-Dev: Linux-HA-Dev [at] lists > >>http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev > >>Home Page: http://linux-ha.org/ > > > >_______________________________________________________ > >Linux-HA-Dev: Linux-HA-Dev [at] lists > >http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev > >Home Page: http://linux-ha.org/ > # ifconfig bond0 > bond0 Link encap:Ethernet HWaddr 00:10:18:27:02:D3 > inet6 addr: 2001:db8:91:0:92::181/80 Scope:Global > [snip] --- > > # ifconfig eth0 > eth0 Link encap:Ethernet HWaddr 00:1A:64:06:59:92 > inet6 addr: 2001:db8:91:0:91::182/64 Scope:Global > [snip] --- > > # grep ^2001 /proc/net/if_inet6 > 20010db8009100000091000000000182 0e 40 00 80 eth0 > 20010db8009100000092000000000181 0c 50 00 80 bond0 > # -- > > # env | grep OCF_RESKEY > OCF_RESKEY_ipv6addr=2001:db8:91:0:92::189 > OCF_RESKEY_nic=bond0 > # > > # gdb ./IPv6addr > GNU gdb Fedora (6.8-27.el5) > Copyright (C) 2008 Free Software Foundation, Inc. > License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> > This is free software: you are free to change and redistribute it. > There is NO WARRANTY, to the extent permitted by law. Type "show copying" > and "show warranty" for details. > This GDB was configured as "x86_64-redhat-linux-gnu"... > (gdb) b scan_if > Breakpoint 1 at 0x4026ec: file IPv6addr.c, line 471. > (gdb) run start > Starting program: /usr/lib/ocf/resource.d/heartbeat/IPv6addr start > [Thread debugging using libthread_db enabled] > [New Thread 0x2ab77f177630 (LWP 8510)] > > Breakpoint 1, scan_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95524, use_mask=0, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:471 > 471 { > (gdb) bt > #0 scan_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95524, use_mask=0, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:471 > #1 0x0000000000402a59 in get_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95524, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:573 > #2 0x0000000000402363 in status_addr6 (addr6=0x7fff2bd95630, prefix_len=0, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:387 > #3 0x000000000040208e in start_addr6 (addr6=0x7fff2bd95630, prefix_len=0, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:304 > #4 0x0000000000401d35 in main (argc=2, argv=0x7fff2bd95848) at IPv6addr.c:273 > (gdb) c > Continuing. > > Breakpoint 1, scan_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95564, use_mask=1, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:471 > 471 { > (gdb) bt > #0 scan_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95564, use_mask=1, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:471 > #1 0x0000000000402a0a in find_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95564, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:567 > #2 0x00000000004020af in start_addr6 (addr6=0x7fff2bd95630, prefix_len=0, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:309 > #3 0x0000000000401d35 in main (argc=2, argv=0x7fff2bd95848) at IPv6addr.c:273 > (gdb) p *plen_target > $1 = 0 > (gdb) b IPv6addr.c:516 > Breakpoint 2 at 0x4027f9: file IPv6addr.c, line 516. > (gdb) c > Continuing. > > Breakpoint 2, scan_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95564, use_mask=1, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:516 > 516 *plen_target = plen; > (gdb) p *plen_target > $2 = 0 > (gdb) n > 521 if (prov_ifname!=0 && *prov_ifname!=0) > (gdb) p *plen_target > $3 = 64 > > /* ********************************************************************** > * plen_target "0" was overwrited by 64. > * **********************************************************************/ > > (gdb) n > 523 if (strcmp(devname, prov_ifname)) > (gdb) p devname > $4 = "eth0\0000", '\0' <repeats 14 times> > (gdb) p prov_ifname > $5 = 0x7fff2bd95e9e "bond0" > (gdb) list > 518 /* If interface name provided, only same devname entry > 519 * would be considered > 520 */ > 521 if (prov_ifname!=0 && *prov_ifname!=0) > 522 { > 523 if (strcmp(devname, prov_ifname)) > 524 continue; > 525 } > 526 > 527 for (i = 0; i< 4; i++) { > (gdb) n > 489 gboolean same = TRUE; > (gdb) p *plen_target > $6 = 64 > (gdb) b IPv6addr.c:513 > Breakpoint 3 at 0x4027d6: file IPv6addr.c, line 513. > (gdb) c > Continuing. > > Breakpoint 3, scan_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95564, use_mask=1, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:513 > 513 if (*plen_target!=0 && plen != *plen_target) { > (gdb) p devname > $7 = "bond0", '\0' <repeats 15 times> > (gdb) p plen > $8 = 80 > (gdb) p *plen_target > $9 = 64 > (gdb) list > 508 } > 509 > 510 /* If specified prefix, only same prefix entry > 511 * would be considered. > 512 */ > 513 if (*plen_target!=0 && plen != *plen_target) { > 514 continue; > 515 } > 516 *plen_target = plen; > 517 > > /* ********************************************************************** > * The value of plen_target "64" (please refer to the 72th line of this > * log) is a value of eth0 read from if_inet6. > * ----------------------------------------------------- > * 20010db8009100000091000000000182 0e 40 00 80 eth0 > * -- > * When plen_target is 0 here, the 514th line of IPv6addr.c ('continue;') > * is not executed. Therefore, bond0 is selected. > * **********************************************************************/ > > (gdb) b IPv6addr.c:557 > Breakpoint 4 at 0x40298b: file IPv6addr.c, line 557. > (gdb) b IPv6addr.c:561 > Breakpoint 5 at 0x4029a1: file IPv6addr.c, line 561. > (gdb) c > Continuing. > > Breakpoint 5, scan_if (addr_target=0x7fff2bd95630, plen_target=0x7fff2bd95564, use_mask=1, > prov_ifname=0x7fff2bd95e9e "bond0") at IPv6addr.c:561 > 561 return NULL; > (gdb) q > The program is running. Exit anyway? (y or n) y > # > > > _______________________________________________________ > Linux-HA-Dev: Linux-HA-Dev [at] lists > http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev > Home Page: http://linux-ha.org/ _______________________________________________________ Linux-HA-Dev: Linux-HA-Dev [at] lists http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev Home Page: http://linux-ha.org/
|