When there are more than one ovs-vswitchd processes started, only one process is enabled. The disabled processes should just sleep. However, a bug in ovs makes the disabled processes keep waking up on global connectivity sequence number which is never sync'ed. Consequently, those processes use 100% cpu.
This commit fixes the bug by always sync up the connectivity sequence number for disabled processes. Reported-by: Ben Pfaff <b...@nicira.com> Signed-off-by: Alex Wang <al...@nicira.com> --- tests/ovs-vswitchd.at | 28 ++++++++++++++++++++++++++++ vswitchd/bridge.c | 3 +++ 2 files changed, 31 insertions(+) diff --git a/tests/ovs-vswitchd.at b/tests/ovs-vswitchd.at index fe3dd8e..9be3078 100644 --- a/tests/ovs-vswitchd.at +++ b/tests/ovs-vswitchd.at @@ -66,3 +66,31 @@ OVS_VSCTL_CHECK_RX_PKT([p1], [7]) OVS_VSWITCHD_STOP AT_CLEANUP + +dnl ---------------------------------------------------------------------- +AT_SETUP([ovs-vswitchd -- start additional ovs-vswitchd process]) +OVS_VSWITCHD_START + +# start another ovs-vswitchd process. +ovs-vswitchd --log-file=fakelog & +pid=`echo $!` + +# sleep for a while +sleep 5 + +# stop the process. +kill $pid + +# check the fakelog, should only see one ERR for reporting +# the existing ovs-vswitchd process. +AT_CHECK([grep ERR fakelog | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl +another ovs-vswitchd process is running, disabling this process () until it goes away +]) + +# check the fakelog, the ERR log should be the last line. +AT_CHECK([tail -n 2 fakelog | head -n 1 | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl +another ovs-vswitchd process is running, disabling this process () until it goes away +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 99dd21f..c5c6096 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -2772,6 +2772,9 @@ bridge_run(void) * with the current situation of multiple ovs-vswitchd daemons, * disable system stats collection. */ system_stats_enable(false); + /* This prevents the process from constantly waking up on + * connectivity seq. */ + connectivity_seqno = seq_read(connectivity_seq_get()); return; } else if (!ovsdb_idl_has_lock(idl)) { return; -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev