This commit adds logic that checks the return value of status_txn transaction and runs the update again if the transaction fails.
Signed-off-by: Alex Wang <al...@nicira.com> --- vswitchd/bridge.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 994e1c9..835de0f 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -173,8 +173,13 @@ static uint64_t connectivity_seqno = LLONG_MIN; * update if the previous transaction status is 'TXN_INCOMPLETE'. * * 'statux_txn' is NULL if there is no ongoing status update. + * + * If the previous database transaction was incomplete or failed (is not + * 'TXN_SUCCESS' or 'TXN_UNCHANGED'), 'status_txn_try_again' is set to true, + * which will cause the main thread wake up soon and retry the status update. */ static struct ovsdb_idl_txn *status_txn; +static bool status_txn_try_again; /* When the status update transaction returns 'TXN_INCOMPLETE', should register a * timeout in 'STATUS_CHECK_AGAIN_MSEC' to check again. */ @@ -2423,7 +2428,7 @@ bridge_run(void) /* Check the need to update status. */ seq = seq_read(connectivity_seq_get()); - if (seq != connectivity_seqno) { + if (seq != connectivity_seqno || status_txn_try_again) { connectivity_seqno = seq; status_txn = ovsdb_idl_txn_create(idl); HMAP_FOR_EACH (br, node, &all_bridges) { @@ -2453,6 +2458,14 @@ bridge_run(void) ovsdb_idl_txn_destroy(status_txn); status_txn = NULL; } + + /* Sets the 'status_txn_try_again' if the transaction fails or + * is still incomplete. */ + if (status == TXN_SUCCESS || status == TXN_UNCOMMITTED) { + status_txn_try_again = false; + } else { + status_txn_try_again = true; + } } run_system_stats(); @@ -2486,11 +2499,11 @@ bridge_wait(void) poll_timer_wait_until(stats_timer); } - /* If the status database transaction is 'TXN_INCOMPLETE' in this run, - * register a timeout in 'STATUS_CHECK_AGAIN_MSEC'. Else, wait on the - * global connectivity sequence number. Note, this also helps batch - * multiple status changes into one transaction. */ - if (status_txn) { + /* If the status update to database needs to be run again (transaction + * fails or incomplete), registers a timeout in 'STATUS_CHECK_AGAIN_MSEC'. + * Else, waits on the global connectivity sequence number. Note, this also + * helps batch multiple status changes into one transaction. */ + if (status_txn_try_again) { poll_timer_wait_until(time_msec() + STATUS_CHECK_AGAIN_MSEC); } else { seq_wait(connectivity_seq_get(), connectivity_seqno); -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev