When ovsdb happens to get blocked for few seconds, the 'stats_timer' will not be updated due to incompletion of previous transaction. When the current time passes the 'stats_timer', the call to poll_timer_wait_until(stats_timer) will keep waking up ovs-vswitchd, causing 100% cpu utilization.
This commit fixes this issue by making ovs-vswitchd wait on the previous idl transaction when it is incomplete rather than the 'stats_timer'. Signed-off-by: Alex Wang <al...@nicira.com> --- vswitchd/bridge.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 161ba14..cb74aa3 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -203,6 +203,8 @@ static bool status_txn_try_again; * timeout in 'STATUS_CHECK_AGAIN_MSEC' to check again. */ #define STATUS_CHECK_AGAIN_MSEC 100 +/* Statistics update to database. */ +static struct ovsdb_idl_txn *stats_txn; /* Each time this timer expires, the bridge fetches interface and mirror * statistics and pushes them into the database. */ static int stats_timer_interval; @@ -2693,7 +2695,6 @@ refresh_controller_status(void) static void run_stats_update(void) { - static struct ovsdb_idl_txn *stats_txn; const struct ovsrec_open_vswitch *cfg = ovsrec_open_vswitch_first(idl); int stats_interval; @@ -2748,6 +2749,18 @@ run_stats_update(void) } } +static void +stats_update_wait(void) +{ + /* If the 'stats_txn' is non-null (transaction incomplete), waits for the + * transaction to complete. Otherwise, waits for the 'stats_timer. */ + if (stats_txn) { + ovsdb_idl_txn_wait(stats_txn); + } else { + poll_timer_wait_until(stats_timer); + } +} + /* Update bridge/port/interface status if necessary. */ static void run_status_update(void) @@ -3008,8 +3021,7 @@ bridge_wait(void) HMAP_FOR_EACH (br, node, &all_bridges) { ofproto_wait(br->ofproto); } - - poll_timer_wait_until(stats_timer); + stats_update_wait(); status_update_wait(); } -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev