Thanks for fixing this bug Ryan,

For this round, high level comments:



> -static struct ovsdb_idl_txn *status_txn;
> +static struct ovsdb_idl_txn *update_txn;
> +enum ovsdb_idl_txn_status update_txn_status = TXN_UNCOMMITTED;
>
>  /* When the status update transaction returns 'TXN_INCOMPLETE', should
> register a
>   * timeout in 'STATUS_CHECK_AGAIN_MSEC' to check again. */
> @@ -1820,7 +1827,9 @@ iface_refresh_netdev_status(struct iface *iface)
>          return;
>      }
>
> -    if (iface->change_seq == netdev_get_change_seq(iface->netdev)) {
> +    if (iface->change_seq == netdev_get_change_seq(iface->netdev)
> +        && (update_txn_status == TXN_SUCCESS ||
> +            update_txn_status == TXN_UNCHANGED)) {
>          return;
>      }
>




Instead of checking here, could we have a global boolean for forcing
status update?

Basically, we check the ovsdb_idl_txn_commit() return value, if the value
is not INCOMPLETE, SUCCESS or UNCHANGED, we set the boolean.






> @@ -2415,14 +2424,14 @@ bridge_run(void)
>          stats_timer = time_msec() + stats_timer_interval;
>      }
>
> -    if (!status_txn) {
> +    if (!update_txn) {
>          uint64_t seq;
>
>          /* Check the need to update status. */
>          seq = seq_read(connectivity_seq_get());
>          if (seq != connectivity_seqno) {
>


We need to use the flag here to force an update.




>              connectivity_seqno = seq;
> -            status_txn = ovsdb_idl_txn_create(idl);
> +            update_txn = ovsdb_idl_txn_create(idl);
>              HMAP_FOR_EACH (br, node, &all_bridges) {
>                  struct port *port;
>
> @@ -2440,15 +2449,13 @@ bridge_run(void)
>          }
>      }
>
> -    if (status_txn) {
> -        enum ovsdb_idl_txn_status status;
> -
> -        status = ovsdb_idl_txn_commit(status_txn);
> -        /* Do not destroy "status_txn" if the transaction is
> +    if (update_txn) {
> +        update_txn_status = ovsdb_idl_txn_commit(update_txn);
> +        /* Do not destroy "update_txn" if the transaction is
>           * "TXN_INCOMPLETE". */
> -        if (status != TXN_INCOMPLETE) {
> -            ovsdb_idl_txn_destroy(status_txn);
> -            status_txn = NULL;
> +        if (update_txn_status != TXN_INCOMPLETE) {
> +            ovsdb_idl_txn_destroy(update_txn);
> +            update_txn = NULL;
>          }
>      }
>
> @@ -2487,7 +2494,7 @@ bridge_wait(void)
>       * 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 (update_txn) {
>          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
>


This line need to be removed,

diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 9764c1f..7fbf19a 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -1547,7 +1547,6 @@ iface_create(struct bridge *br, const struct
ovsrec_interface *iface_cfg,

     /* Populate initial status in database. */
     iface_refresh_stats(iface);
-    iface_refresh_netdev_status(iface);

     /* Add bond fake iface if necessary. */
     if (port_is_bond_fake_iface(port)) {


Since we do another update transaction after the bridge_reconfigure()
execution, if this transaction fails, the initial status of netdev will not
be
updated to database until next global connectivity_seq change.

So, instead, we could set the force update flag and the update will be
handled in the status update.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to