OSDN Git Service

Persist sorry server connection. sorry-fix-persist
authorKohei TANUMA <tanuma@users.sourceforge.jp>
Mon, 7 Jun 2010 15:04:17 +0000 (00:04 +0900)
committerKohei TANUMA <tanuma@users.sourceforge.jp>
Mon, 7 Jun 2010 16:36:29 +0000 (01:36 +0900)
Change about sorry server connection to the following.
(a) 1. First connection: sorry server (over max connections)
    2. Communicate to sorry server...
    3. Some other connections done. (below max connections)
    4. Still communicate to sorry server.
(b) 1. First connection: sorry server (force-sorry-flag is on)
    2. Communicate to sorry server...
    3. Administrator change setting (force-sorry-flag is off)
    4. Still communicate to sorry server.
(c) 1. First connection: sorry server (no real servers)
    2. Communicate to sorry server...
    3. Administrator add real servers
    4. Still communicate to sorry server.
(d) 1. First connection: real server
    2. Communicate to real server...
    3. Administrator change setting (force-sorry-flag is on)
    4. Connection to real server will be disconnected.
(e) 1. First connection: real server
    2. Communicate to real server...
    3. Administrator remove real servers.
    4. Connection to real server will be disconnected.

include/l7vs_conn.h
include/l7vs_sched.h
src/conn.c
src/lsock.c
src/sched.c

index ea333e8..779b362 100644 (file)
@@ -74,7 +74,6 @@ struct        l7vs_conn{
        size_t                  cldata_bufsize; //! client buffer size
        int                     cmss;   //! cmess??
        int                     sorry_conn_flag; //! sorry connection flag
-       struct  l7vs_dest*      old_dest; //! old destination
 };
 
 //
@@ -136,7 +135,6 @@ inline      void    l7vs_conn_c_str(char* ret, const struct l7vs_conn* conn)
        char raddr_str[DEBUG_STR_LEN];
        char ciom_str[DEBUG_STR_LEN];
        char riom_str[DEBUG_STR_LEN];
-       char old_dest_str[DEBUG_STR_LEN];
 
        if (!conn) {
                snprintf(ret, DEBUG_STR_LEN, "(nil)");
@@ -148,7 +146,6 @@ inline      void    l7vs_conn_c_str(char* ret, const struct l7vs_conn* conn)
        l7vs_dest_c_str(dest_str, conn->dest);
        l7vs_iomux_c_str(ciom_str, conn->ciom);
        l7vs_iomux_c_str(riom_str, conn->riom);
-       l7vs_dest_c_str(old_dest_str, conn->old_dest);
        
        snprintf(ret, DEBUG_STR_LEN, 
                "l7vs_conn="
@@ -164,8 +161,7 @@ inline      void    l7vs_conn_c_str(char* ret, const struct l7vs_conn* conn)
                "cldata_len=%zu: "
                "cldata_bufsize=%zu: "
                "cmss=%d: "
-               "sorry_conn_flag=%d: "
-               "old_dest=%s}"
+               "sorry_conn_flag=%d}"
                , conn->lsock
                , conn->srv
                , dest_str
@@ -178,8 +174,7 @@ inline      void    l7vs_conn_c_str(char* ret, const struct l7vs_conn* conn)
                , conn->cldata_len
                , conn->cldata_bufsize
                , conn->cmss
-               , conn->sorry_conn_flag
-               , old_dest_str);
+               , conn->sorry_conn_flag);
 }
 
 #endif //L7VS_CONN_H
index 612a171..d783c11 100644 (file)
@@ -55,6 +55,6 @@ extern        void                    l7vs_sched_put( struct l7vs_scheduler* );
 extern void                    l7vs_sched_bind( struct l7vs_scheduler*, struct l7vs_service* );
 extern void                    l7vs_sched_unbind( struct l7vs_scheduler*, struct l7vs_service* );
 extern int                     l7vs_sched_sorry_check(struct l7vs_service*, int);
-extern struct l7vs_dest*       l7vs_sched_sorry_dest(struct l7vs_service*, struct l7vs_conn*, int);
+extern struct l7vs_dest*       l7vs_sched_sorry_dest(struct l7vs_service*, struct l7vs_conn*);
 
 #endif //L7VS_SCHED_H
index fa184f2..77eb8cb 100644 (file)
@@ -403,7 +403,6 @@ l7vs_conn_create(int lfd, struct l7vs_lsock *lsock)
     }
     /*------ DEBUG LOG END ------*/
     conn->sorry_conn_flag = 0;
-    conn->old_dest = NULL;
     l7vs_iomux_add(conn->ciom, iom_read);
 
     // connect real server immediately if all lsock services are fast schedule.
@@ -1060,135 +1059,42 @@ l7vs_conn_is_rs_connected(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct
     }
     /*------ DEBUG LOG END ------*/
 
-    //is real server connected?
     if (-1 != conn->riom->fd) {
-        // check sorry status of service
-        // argment 0 means no connection count check
+        // Connection to real/sorry server is already ESTABLISHED
+
+        // Check force-sorry-flag and existance of real servers
         sorry_state = l7vs_sched_sorry_check(conn->srv, 0);
         if (sorry_state) {
-            // check connect to sorry-server now
+            // force-sorry-flag is ON or no real servers
+
             if (!conn->sorry_conn_flag) {
-                // get sorry-server destination (argment 0)
-                d = l7vs_sched_sorry_dest(conn->srv, conn, 0);
+                // Current connection is to real server,
+                // so close the connection.
                 /*-------- DEBUG LOG --------*/
                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                    char sorry_dest_str1[DEBUG_STR_LEN] = {0};
-                    l7vs_dest_c_str(sorry_dest_str1, d);
-                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,116,
-                        "pointer_assign: d=%s",
-                        sorry_dest_str1);
+                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
+                        "iom->status change: %d->%d",
+                        iom->status, iomux_conn_disconnected);
                 }
                 /*------ DEBUG LOG END ------*/
-                if (!d) {
-                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,18, "error / sorry-server dest NG");
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
-                            "iom->status change: %d->%d",
-                            iom->status, iomux_conn_rs_connect_error);
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    iom->status = iomux_conn_rs_connect_error;
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
-                            "out_function: static int l7vs_conn_is_rs_connected("
-                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                            "return_value: 0");
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    return 0;
-                }
-                conn->old_dest = conn->dest;
+                iom->status = iomux_conn_disconnected;
                 /*-------- DEBUG LOG --------*/
                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                    char old_dest_str[DEBUG_STR_LEN] = {0};
-                    l7vs_dest_c_str(old_dest_str, conn->old_dest);
-                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,119,
-                        "pointer_assign: conn->old_dest=%s",
-                        old_dest_str);
+                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
+                        "out_function: static int l7vs_conn_is_rs_connected("
+                        "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                        "return_value: 0");
                 }
                 /*------ DEBUG LOG END ------*/
-                // change connection to sorry-server
-                if (!l7vs_conn_change_connect_rs(conn, d)) {
-                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,19, "error / change connection to Sorry NG");
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,120,
-                            "iom->status change: %d->%d",
-                            iom->status, iomux_conn_rs_connect_error);
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    iom->status = iomux_conn_rs_connect_error;
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,121,
-                            "out_function: static int l7vs_conn_is_rs_connected("
-                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                            "return_value: 0");
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    return 0;
-                }
-                conn->sorry_conn_flag = 1;
+                return 0;
             }
-        } else {
-            // check connect to sorry-server now
-            if (conn->sorry_conn_flag) {
-                // get old real-server destination (argment 1)
-                d = l7vs_sched_sorry_dest(conn->srv, conn, 1);
-                /*-------- DEBUG LOG --------*/
-                if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                    char sorry_dest_str2[DEBUG_STR_LEN] = {0};
-                    l7vs_dest_c_str(sorry_dest_str2, d);
-                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,122,
-                        "pointer_assign: d=%s",
-                        sorry_dest_str2);
-                }
-                /*------ DEBUG LOG END ------*/
-                if (!d) {
-                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,20, "error / old real-server dest NG");
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,123,
-                            "iom->status change: %d->%d",
-                            iom->status, iomux_conn_rs_connect_error);
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    iom->status = iomux_conn_rs_connect_error;
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,124,
-                            "out_function: static int l7vs_conn_is_rs_connected("
-                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                            "return_value: 0");
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    return 0;
-                }
-                // change connection to real-server
-                if (!l7vs_conn_change_connect_rs(conn, d)) {
-                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,21, "error / change connection to RS NG");
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,125,
-                            "iom->status change: %d->%d",
-                            iom->status, iomux_conn_rs_connect_error);
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    iom->status = iomux_conn_rs_connect_error;
-                    /*-------- DEBUG LOG --------*/
-                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,126,
-                            "out_function: static int l7vs_conn_is_rs_connected("
-                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                            "return_value: 0");
-                    }
-                    /*------ DEBUG LOG END ------*/
-                    return 0;
-                }
-                conn->sorry_conn_flag = 0;
+            else {
+                // Current connection is already changed to sorry server,
+                // so do nothing.
             }
+        } else {
+            // force-sorry-flag is OFF and real servers exist,
+            // then keep the connection to real/sorry server.
         }
         /*-------- DEBUG LOG --------*/
         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
@@ -3507,17 +3413,6 @@ static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest
         /*------ DEBUG LOG END ------*/
         return 0;
     }
-    // save old destination
-    conn->old_dest = conn->dest;
-    /*-------- DEBUG LOG --------*/
-    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-        char old_dest_str[DEBUG_STR_LEN] = {0};
-        l7vs_dest_c_str(old_dest_str, conn->old_dest);
-        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,313,
-            "pointer_assign: conn->old_dest=%s",
-            old_dest_str);
-    }
-    /*------ DEBUG LOG END ------*/
     // close real-server connection
     l7vs_conn_close_rsock(conn);
     // connect to new destination
index 23b4026..7890ce5 100644 (file)
@@ -464,11 +464,9 @@ l7vs_lsock_select_service(struct l7vs_lsock *lsock,
     struct l7vs_dest *dest;
     int ret, val;
     struct l7vs_service *srv_tmp = NULL;    //! temporary for srv
-    struct l7vs_dest *dest_tmp   = NULL;    //! temporary for dest
     size_t len_tmp = 0;                     //! temporary for len
     int    sorry_save = 0;                  //! sorry dest save flag
     struct l7vs_service *srv_tmp2 = NULL;   //! temporary for srv when select_dest NG
-    struct l7vs_dest *dest_tmp2   = NULL;   //! temporary for dest when select_dest NG
     size_t len_tmp2 = 0;                    //! temporary for len when select_dest NG
     int    sorry_save2 = 0;                 //! sorry dest save flag when select_dest NG
 
@@ -492,11 +490,11 @@ l7vs_lsock_select_service(struct l7vs_lsock *lsock,
         if (ret == 0) {
             // check sorry status if ret == 0
             // sorry_check argument 1 means check connection count
+            // Check the connection count(--upper, maxconn)
             if (l7vs_sched_sorry_check(srv, 1)) {
                 if (!sorry_save) {
                     // save sorry dest to xxx_tmp only first time
                     srv_tmp = srv;
-                    dest_tmp = dest;
                     len_tmp = len;
                     sorry_save = 1;
                 }
@@ -517,10 +515,10 @@ l7vs_lsock_select_service(struct l7vs_lsock *lsock,
             }
         }
         // when select_dest NG
+        // No suitable realservers exist
         if (!sorry_save2) {
             // save sorry dest to xxx_tmp2 only first time
             srv_tmp2 = srv;
-            dest_tmp2 = dest;
             len_tmp2 = len;
             sorry_save2 = 1;
         }
@@ -528,11 +526,11 @@ l7vs_lsock_select_service(struct l7vs_lsock *lsock,
         l = g_list_next(l);
     }
 
+    // Over maximum connections
     if (sorry_save) {
         // saved sorry dest is exist
         // set sorry-server destination
-        //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 1);
-        *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 0);
+        *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL);
         if (!*dest_ret) {
             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,2, "sorry-server dest is NULL");
             if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
@@ -545,11 +543,12 @@ l7vs_lsock_select_service(struct l7vs_lsock *lsock,
         conn->cldata_len = len_tmp;
         conn->sorry_conn_flag = 1;
         val = 1;
+
+    // No suitable realservers exist
     } else if (sorry_save2) {
         // saved sorry dest2 is exist
         // set sorry-server destination
-        //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 1);
-        *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 0);
+        *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL);
         if (!*dest_ret) {
             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,3, "sorry-server dest is NULL");
             if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
index 671c63b..d11d741 100644 (file)
@@ -454,14 +454,13 @@ sorry_check_out:
 }
 
 /*!
- * Get sorry-server destination or old real-server destination.
+ * Get sorry-server destination
  * @param[in]  *srv            service pointer
  * @param[in]  *conn           connection pointer
- * @param[in]  reverse         specification which get sorry-server or old real-server
  * @return     l7vs_dest*      sorry-server or old real-server destination
  */
 struct l7vs_dest *
-l7vs_sched_sorry_dest(struct l7vs_service *srv, struct l7vs_conn *conn, int reverse)
+l7vs_sched_sorry_dest(struct l7vs_service *srv, struct l7vs_conn *conn)
 {
        struct l7vs_dest* dest = NULL;
 
@@ -473,33 +472,18 @@ l7vs_sched_sorry_dest(struct l7vs_service *srv, struct l7vs_conn *conn, int reve
                l7vs_conn_c_str(conn_str, conn);
                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SCHEDULE,21,
                    "in_function: struct l7vs_dest* l7vs_sched_sorry_dest(struct l7vs_service* srv, "
-                   "struct l7vs_conn* conn, int reverse): srv=&(%s), conn=&(%s), reverse=%d",
-                   srv_str, conn_str, reverse);
+                   "struct l7vs_conn* conn, int reverse): srv=&(%s), conn=&(%s)",
+                   srv_str, conn_str);
        }
        /*------ DEBUG LOG END ------*/
 
        // argument check
-       if (reverse != 0 && reverse != 1) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,13,"Invalid reverse value");
+       if (!srv) {
+               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,14,"Argument srv is NULL pointer");
                goto sorry_dest_out;
        }
-       if (!reverse) {
-               // argument check
-               if (!srv) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,14,"Argument srv is NULL pointer");
-                       goto sorry_dest_out;
-               }
-               // return sorry-server destination
-               dest = srv->sorry_dest;
-       } else {
-               // argument check
-               if (!conn) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SCHEDULE,15,"Argument srv is NULL pointer");
-                       goto sorry_dest_out;
-               }
-               // return old real-server destination
-               dest = conn->old_dest;
-       }
+       // return sorry-server destination
+       dest = srv->sorry_dest;
 
 sorry_dest_out:
 
@@ -515,7 +499,7 @@ sorry_dest_out:
                l7vs_dest_c_str(dest_str, dest);
                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SCHEDULE,22,
                    "out_function: struct l7vs_dest* l7vs_sched_sorry_dest(struct l7vs_service* srv, "
-                   "struct l7vs_conn* conn, int reverse): return_value=&(%s)", dest_str);
+                   "struct l7vs_conn* conn): return_value=&(%s)", dest_str);
        }
        /*------ DEBUG LOG END ------*/