Acked-by: Ethan Jackson <et...@nicira.com>

On Fri, Aug 17, 2012 at 1:20 PM, Ben Pfaff <b...@nicira.com> wrote:
> The bonding code is supposed to tag flows two ways:
>
>     - According to the chosen bond slave, to make it easy to invalidate all
>       of the flows assigned to a given slave.
>
>     - According to the hash value for a flow, to make it easy to invalidate
>       all of the flows that hash into the same bucket.
>
> However, the code wasn't actually applying the hash-based tags.  This
> meant that rebalancing didn't take effect immediately, and so after
> rebalancing we could get log messages like this:
>
>    inconsistency in subfacet (actions were: 5) (correct actions: 4)
>
> specifying some flow that was moved by the rebalance.
>
> This commit fixes the problem by applying the hash-based tags.
>
> Bug #12847.
> Reported-by: Pratap Reddy <pre...@nicira.com>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
>  AUTHORS    |    1 +
>  lib/bond.c |   10 ++++++----
>  2 files changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/AUTHORS b/AUTHORS
> index dee8931..28dc742 100644
> --- a/AUTHORS
> +++ b/AUTHORS
> @@ -152,6 +152,7 @@ Paulo Cravero           pcrav...@as2594.net
>  Peter Balland           pe...@nicira.com
>  Peter Phaal             peter.ph...@inmon.com
>  Prabina Pattnaik        prabina.pattn...@nechclst.in
> +Pratap Reddy            pre...@nicira.com
>  Ralf Heiringhoff        r...@frosty-geek.net
>  Ram Jothikumar          rjothiku...@nicira.com
>  Ramana Reddy            gtvrre...@gmail.com
> diff --git a/lib/bond.c b/lib/bond.c
> index 7178416..77812ed 100644
> --- a/lib/bond.c
> +++ b/lib/bond.c
> @@ -133,7 +133,7 @@ static struct bond_entry *lookup_bond_entry(const struct 
> bond *,
>  static tag_type bond_get_active_slave_tag(const struct bond *);
>  static struct bond_slave *choose_output_slave(const struct bond *,
>                                                const struct flow *,
> -                                              uint16_t vlan);
> +                                              uint16_t vlan, tag_type *tags);
>  static void bond_update_fake_slave_stats(struct bond *);
>
>  /* Attempts to parse 's' as the name of a bond balancing mode.  If 
> successful,
> @@ -523,13 +523,14 @@ bond_compose_learning_packet(struct bond *bond,
>  {
>      struct bond_slave *slave;
>      struct ofpbuf *packet;
> +    tag_type tags = 0;
>      struct flow flow;
>
>      assert(may_send_learning_packets(bond));
>
>      memset(&flow, 0, sizeof flow);
>      memcpy(flow.dl_src, eth_src, ETH_ADDR_LEN);
> -    slave = choose_output_slave(bond, &flow, vlan);
> +    slave = choose_output_slave(bond, &flow, vlan, &tags);
>
>      packet = ofpbuf_new(0);
>      compose_rarp(packet, eth_src);
> @@ -637,7 +638,7 @@ void *
>  bond_choose_output_slave(struct bond *bond, const struct flow *flow,
>                           uint16_t vlan, tag_type *tags)
>  {
> -    struct bond_slave *slave = choose_output_slave(bond, flow, vlan);
> +    struct bond_slave *slave = choose_output_slave(bond, flow, vlan, tags);
>      if (slave) {
>          *tags |= bond->balance == BM_STABLE ? bond->stb_tag : slave->tag;
>          return slave->aux;
> @@ -1405,7 +1406,7 @@ choose_stb_slave(const struct bond *bond, uint32_t 
> flow_hash)
>
>  static struct bond_slave *
>  choose_output_slave(const struct bond *bond, const struct flow *flow,
> -                    uint16_t vlan)
> +                    uint16_t vlan, tag_type *tags)
>  {
>      struct bond_entry *e;
>
> @@ -1441,6 +1442,7 @@ choose_output_slave(const struct bond *bond, const 
> struct flow *flow,
>              }
>              e->tag = tag_create_random();
>          }
> +        *tags |= e->tag;
>          return e->slave;
>
>      default:
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to