Alban Browaeys prahal@yahoo.com
Alex Yip alex@nicira.com
Alexey I. Froloff raorn@altlinux.org
+Ben Basler bbasler@nicira.com
Bob Ball bob.ball@citrix.com
Brad Hall brad@nicira.com
Brandon Heller brandonh@stanford.edu
- The default bond_mode changed from SLB to active-backup, to protect
unsuspecting users from the significant risks of SLB bonds (which are
documented in vswitchd/INTERNALS).
+ - Load balancing can be disabled by setting the bond-rebalance-interval
+ to zero.
- Logging to console and file will have UTC timestamp as a default for all
the daemons. An example of the default format is 2012-01-27T16:35:17Z.
ovs-appctl can be used to change the default format as before.
bond->updelay = s->up_delay;
bond->downdelay = s->down_delay;
- bond->rebalance_interval = s->rebalance_interval;
+
+ if (bond->rebalance_interval != s->rebalance_interval) {
+ bond->rebalance_interval = s->rebalance_interval;
+ revalidate = true;
+ }
if (bond->balance != s->balance) {
bond->balance = s->balance;
static bool
bond_is_balanced(const struct bond *bond)
{
- return bond->balance == BM_SLB || bond->balance == BM_TCP;
+ return bond->rebalance_interval
+ && (bond->balance == BM_SLB || bond->balance == BM_TCP);
}
/* Notifies 'bond' that 'n_bytes' bytes were sent in 'flow' within 'vlan'. */
* more complex implementations and require the use of memory. This may need
* to be reimplemented if it becomes a performance bottleneck. */
static struct bond_slave *
-choose_stb_slave(const struct bond *bond, const struct flow *flow,
- uint16_t vlan)
+choose_stb_slave(const struct bond *bond, uint32_t flow_hash)
{
struct bond_slave *best, *slave;
- uint32_t best_hash, flow_hash;
+ uint32_t best_hash;
best = NULL;
best_hash = 0;
- flow_hash = bond_hash_tcp(flow, vlan, bond->basis);
HMAP_FOR_EACH (slave, hmap_node, &bond->slaves) {
if (slave->enabled) {
uint32_t hash;
return bond->active_slave;
case BM_STABLE:
- return choose_stb_slave(bond, flow, vlan);
+ return choose_stb_slave(bond, bond_hash_tcp(flow, vlan, bond->basis));
case BM_TCP:
if (bond->lacp_status != LACP_NEGOTIATED) {
}
/* Fall Through. */
case BM_SLB:
+ if (!bond_is_balanced(bond)) {
+ return choose_stb_slave(bond, bond_hash(bond, flow, vlan));
+ }
e = lookup_bond_entry(bond, flow, vlan);
if (!e->slave || !e->slave->enabled) {
e->slave = CONTAINER_OF(hmap_random_node(&bond->slaves),
/* Balancing configuration. */
enum bond_mode balance;
- int rebalance_interval; /* Milliseconds between rebalances. */
+ int rebalance_interval; /* Milliseconds between rebalances.
+ Zero to disable rebalancing. */
/* Link status detection. */
int up_delay; /* ms before enabling an up slave. */
s->basis = atoi(get_port_other_config(port->cfg, "bond-hash-basis", "0"));
s->rebalance_interval = atoi(
get_port_other_config(port->cfg, "bond-rebalance-interval", "10000"));
- if (s->rebalance_interval < 1000) {
+ if (s->rebalance_interval && s->rebalance_interval < 1000) {
s->rebalance_interval = 1000;
}
</p>
<column name="other_config" key="bond-rebalance-interval"
- type='{"type": "integer", "minInteger": 1000, "maxInteger": 10000}'>
- For an SLB bonded port, the number of milliseconds between successive
- attempts to rebalance the bond, that is, to move source MACs and
- their flows from one interface on the bond to another in an attempt
- to keep usage of each interface roughly equal.
+ type='{"type": "integer", "minInteger": 0, "maxInteger": 10000}'>
+ For a load balanced bonded port, the number of milliseconds between
+ successive attempts to rebalance the bond, that is, to move flows
+ from one interface on the bond to another in an attempt to keep usage
+ of each interface roughly equal. If zero, load balancing is disabled
+ on the bond (carrier status changes still cause flows to move). If
+ less than 1000ms, the rebalance interval will be 1000ms.
</column>
</group>