The connection to dcbd was not getting correctly re-established when
dcbd was stopped and restarted quickly.   Sometimes the connection to
dcbd was established without registering to receive dcbd events - which
resulted in crippled fcoemon functionality from that point on.
This patch fixes the dcbd connection logic so that it always retried
in a timely manner and that registering for dcbd events always occurs.

Signed-off-by:  Eric Multanen <[email protected]>
---

 fcoemon.c |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/fcoemon.c b/fcoemon.c
index ba4711f..8be3381 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -77,6 +77,7 @@
 #define CLIF_PID_FILE           _PATH_VARRUN "fcoemon.pid"
 #define CLIF_LOCAL_SUN_PATH     _PATH_TMP "fcoemon.dcbd.%d"
 #define FCM_DCBD_TIMEOUT_USEC   (10 * 1000 * 1000)     /* 10 seconds */
+#define FCM_DCBD_RETRY_TIMEOUT_USEC   (1 * 1000 * 1000)        /* 1 seconds */
 #define FCM_EVENT_TIMEOUT_USEC  (500 * 1000)           /* half a second */
 #define FCM_PING_REQ_LEN       1 /* byte-length of dcbd PING request */
 #define FCM_PING_RSP_LEN       8 /* byte-length of dcbd PING response */
@@ -915,13 +916,12 @@ static void fcm_dcbd_timeout(void *arg)
        if (fcm_clif->cl_fd < 0) {
                if (fcm_dcbd_connect())
                        fcm_dcbd_request("A");  /* ATTACH_CMD: for events */
+               else
+                       sa_timer_set(&fcm_dcbd_timer, FCM_DCBD_TIMEOUT_USEC);
        } else {
-               if (!is_query_in_progress()) {
-                       fcm_clif->cl_ping_pending++;
-                       fcm_dcbd_request("P");  /* ping to verify connection */
-               }
+               fcm_clif->cl_ping_pending++;
+               fcm_dcbd_request("P");  /* ping to verify connection */
        }
-       sa_timer_set(&fcm_dcbd_timer, FCM_DCBD_TIMEOUT_USEC);
 }
 
 static void fcm_dcbd_disconnect(void)
@@ -1081,13 +1081,14 @@ static void fcm_dcbd_request(char *req)
                return;
        len = strlen(req);
        ASSERT(fcm_clif->cl_busy == 0);
+       sa_timer_set(&fcm_dcbd_timer, FCM_DCBD_TIMEOUT_USEC);
        fcm_clif->cl_busy = 1;
        rc = write(fcm_clif->cl_fd, req, len);
        if (rc < 0) {
                FCM_LOG_ERR(errno, "Failed write req %s len %d", req, len);
                fcm_clif->cl_busy = 0;
                fcm_dcbd_disconnect();
-               fcm_dcbd_connect();
+               sa_timer_set(&fcm_dcbd_timer, FCM_DCBD_RETRY_TIMEOUT_USEC);
                return;
        }
 

_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel

Reply via email to