[ovs-dev] [netdev dummy 1/2] netdev-dummy: Fix reconnecting.

Andy Zhou azhou at nicira.com
Tue Feb 11 19:41:49 UTC 2014


The netdev-dummy unit test ran into the reconnect condition on Jarno's
machine. With his test environment, we found and fixed the bugs in
handling reconnect.

Co-authored-by: Jarno Rajahalme <jrajahalme at nicira.com>
Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
Signed-off-by: Andy Zhou <azhou at nicira.com>
---
 lib/netdev-dummy.c |   58 ++++++++++++++++++++++++----------------------------
 lib/reconnect.c    |    2 +-
 2 files changed, 28 insertions(+), 32 deletions(-)

diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index b8e7ab7..5d917a6 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -198,6 +198,7 @@ dummy_packet_stream_run(struct netdev_dummy *dev, struct dummy_packet_stream *s)
 
         txbuf = ofpbuf_from_list(list_front(&s->txq));
         retval = stream_send(s->stream, txbuf->data, txbuf->size);
+
         if (retval > 0) {
             ofpbuf_pull(txbuf, retval);
             if (!txbuf->size) {
@@ -229,6 +230,7 @@ dummy_packet_stream_run(struct netdev_dummy *dev, struct dummy_packet_stream *s)
 
         ofpbuf_prealloc_tailroom(&s->rxbuf, n);
         retval = stream_recv(s->stream, ofpbuf_tail(&s->rxbuf), n);
+
         if (retval > 0) {
             s->rxbuf.size += retval;
             if (retval == n && s->rxbuf.size > 2) {
@@ -370,24 +372,17 @@ dummy_packet_conn_set_config(struct dummy_packet_conn *conn,
         reconnect_set_backoff(reconnect, 1000, INT_MAX);
         reconnect_set_probe_interval(reconnect, 0);
         conn->u.rconn.reconnect = reconnect;
+        conn->type = ACTIVE;
+        error = stream_open_block(
+            stream_open(stream, &active_stream, DSCP_DEFAULT), &active_stream);
 
-        error = stream_open(stream, &active_stream, DSCP_DEFAULT);
         conn->u.rconn.rstream = dummy_packet_stream_create(active_stream);
 
-        switch (error) {
-        case 0:
-            reconnect_connected(conn->u.rconn.reconnect, time_msec());
-            conn->type = ACTIVE;
-            break;
-
-        case EAGAIN:
-            reconnect_connecting(conn->u.rconn.reconnect, time_msec());
-            break;
-
-        default:
-            reconnect_connecting(conn->u.rconn.reconnect, time_msec());
+        if (error) {
+            reconnect_connect_failed(conn->u.rconn.reconnect, time_msec(), error);
             stream_close(active_stream);
-            break;
+        } else {
+            reconnect_connected(conn->u.rconn.reconnect, time_msec());
         }
     }
 }
@@ -441,22 +436,19 @@ OVS_REQUIRES(dev->mutex)
     switch (reconnect_run(rconn->reconnect, time_msec())) {
     case RECONNECT_CONNECT:
         {
-            int err = stream_connect(rconn->rstream->stream);
-
-            switch (err) {
-            case 0: /* Connected. */
-                reconnect_connected(rconn->reconnect, time_msec());
-                dev->conn.type = ACTIVE;
-                break;
+            int error;
+            struct stream *active_stream;
 
-            case EAGAIN:
-                reconnect_connecting(rconn->reconnect, time_msec());
-                return;
+            error = stream_open_block(
+                stream_open(reconnect_get_name(rconn->reconnect),
+                            &active_stream, DSCP_DEFAULT), &active_stream);
+            rconn->rstream->stream = active_stream;
 
-            default:
-                reconnect_connect_failed(rconn->reconnect, time_msec(), err);
-                stream_close(rconn->rstream->stream);
-                return;
+            if (error) {
+                reconnect_connect_failed(rconn->reconnect, time_msec(), error);
+                stream_close(active_stream);
+            } else {
+                reconnect_connected(rconn->reconnect, time_msec());
             }
         }
         break;
@@ -511,7 +503,9 @@ dummy_packet_conn_wait(struct dummy_packet_conn *conn)
         }
         break;
     case ACTIVE:
-        dummy_packet_stream_wait(conn->u.rconn.rstream);
+        if (reconnect_is_connected(conn->u.rconn.reconnect)) {
+            dummy_packet_stream_wait(conn->u.rconn.rstream);
+        }
         break;
 
     case NONE:
@@ -537,8 +531,10 @@ dummy_packet_conn_send(struct dummy_packet_conn *conn,
         break;
 
     case ACTIVE:
-        dummy_packet_stream_send(conn->u.rconn.rstream, buffer, size);
-        dummy_packet_stream_wait(conn->u.rconn.rstream);
+        if (reconnect_is_connected(conn->u.rconn.reconnect)) {
+            dummy_packet_stream_send(conn->u.rconn.rstream, buffer, size);
+            dummy_packet_stream_wait(conn->u.rconn.rstream);
+        }
         break;
 
     case NONE:
diff --git a/lib/reconnect.c b/lib/reconnect.c
index 0a773bc..5296c5c 100644
--- a/lib/reconnect.c
+++ b/lib/reconnect.c
@@ -348,7 +348,7 @@ reconnect_disconnected(struct reconnect *fsm, long long int now, int error)
         } else {
             const char *type = fsm->passive ? "listen" : "connection";
             if (error > 0) {
-                VLOG_WARN("%s: %s attempt failed (%s)",
+                VLOG_INFO("%s: %s attempt failed (%s)",
                           fsm->name, type, ovs_strerror(error));
             } else {
                 VLOG(fsm->info, "%s: %s attempt timed out", fsm->name, type);
-- 
1.7.9.5




More information about the dev mailing list