OSDN Git Service

l7vs.cfの[session] セクションにオプション項目 server_connect_timeout を追加。
authorhibari <l05102@shibaura-it.ac.jp>
Tue, 11 Sep 2012 11:24:42 +0000 (20:24 +0900)
committerhibari <l05102@shibaura-it.ac.jp>
Tue, 11 Sep 2012 11:24:42 +0000 (20:24 +0900)
0~INT_MAXまでの値を指定可能。
0を指定した場合はtimeout無し。デフォルト30秒(デフォルトはハードコーディング)

#基本デフォルト値で問題ないはずなので、隠しオプションという扱いとする。
 (デフォルトの設定ファイルに設定値を追記しない。)

sslidモジュールを利用した際など、clientからconnectされた後、realserverに接続する前に
readをしないといけない場合、clientが何もデータを送ってこないとそのまま処理が進まなくなる。
=>session_thread_poolsize分、connectすればセッションを食いつぶすことが可能!!

timeoutを設定できるようにし、上記問題を回避できるように修正した。

CHANGES
l7vsd/include/tcp_session.h
l7vsd/src/tcp_session.cpp

diff --git a/CHANGES b/CHANGES
index 481302f..079391c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,7 @@
   - Add "session_thread_pool_size" option for l7vsadm and l7directord.
   - Change spec file. Make devel package.
   - Fixed bug: Evaluated the header section with the body section in HTTP negotiate check.
+  - Add "server_connect_timeout" option at l7vsd.cf.
 
 [Aug. 30 2012] 3.0.4-2 Hiroaki Nakano
   - Fixed LogLevel at #29144 patch.
index 1b2ae92..c5cc5ad 100644 (file)
 #include "virtualservice_element.h"
 
 #define TCP_SESSION_THREAD_STATE_BIT    8
+#define DEFAULT_SERVER_CONNECT_TIMEOUT  30
 #define PARAM_UP_BUFFER_SIZE            "upstream_buffer_size"
 #define PARAM_DOWN_BUFFER_SIZE          "downstream_buffer_size"
+#define SERVER_CONNECT_TIMEOUT          "server_connect_timeout"
 
 namespace l7vs
 {
@@ -258,6 +260,13 @@ protected:
         //! thread main loop exit flag update mutex
         wr_mutex exit_flag_update_mutex;
 
+        //!  client connected time
+        boost::xtime    client_connected_time;
+        //! target server connected flag
+        bool server_connected_flag;
+        //! server connect timeout
+        int server_connect_time_out;
+
         //! upthread_status_tag
         enum UPTHREAD_STATUS_TAG {
                 UPTHREAD_SLEEP = 0,
index 6e1e907..ae96569 100644 (file)
@@ -58,6 +58,8 @@ tcp_session::tcp_session(
         parent_dispatcher(session_io),
         parent_service(vs),
         exit_flag(0),
+        server_connected_flag(false),
+        server_connect_time_out(DEFAULT_SERVER_CONNECT_TIMEOUT),
         upthread_status(UPTHREAD_SLEEP),
         downthread_status(DOWNTHREAD_SLEEP),
         protocol_module(NULL),
@@ -412,6 +414,7 @@ session_result_message tcp_session::initialize()
         msg.flag = false;
         msg.message = "";
         exit_flag = 0;
+        server_connected_flag = false;
         up_thread_id = boost::thread::id();
         down_thread_id = boost::thread::id();
         upthread_status = UPTHREAD_SLEEP;
@@ -444,6 +447,12 @@ session_result_message tcp_session::initialize()
         if ((likely(!vs_err)) && (int_val > 0)) {
                 downstream_buffer_size = int_val;
         }
+
+        int_val = param.get_int(PARAM_COMP_SESSION, SERVER_CONNECT_TIMEOUT, vs_err);
+        if ((likely(!vs_err)) && (int_val >= 0)) {
+                server_connect_time_out = int_val;
+        }
+
         protocol_module = parent_service.get_protocol_module();
 
         if (unlikely(protocol_module == NULL)) {
@@ -824,6 +833,19 @@ void tcp_session::up_thread_run()
                                                 }
                                         }
                                 }
+                                if (!server_connected_flag && server_connect_time_out != 0) {
+                                        boost::xtime    now_time;
+                                        boost::xtime_get(&now_time, boost::TIME_UTC);
+                                        if ((now_time.sec - client_connected_time.sec) > server_connect_time_out) {     // timeout detect.
+                                                boost::system::error_code error_code;
+                                                client_socket.close(error_code);
+                                                if (error_code) {
+                                                        boost::format   fmt("Thread ID[%d] client socket close fail when realserver select timeout : %s");
+                                                        fmt % boost::this_thread::get_id() % error_code.message();
+                                                        Logger::putLogInfo(LOG_CAT_L7VSD_SESSION, 0, fmt.str(), __FILE__, __LINE__);
+                                                }
+                                        }
+                                }
                         }
                 }       // lockmode while loop end.
 
@@ -1107,6 +1129,7 @@ void tcp_session::up_thread_client_accept(const TCP_PROCESS_TYPE_TAG process_typ
                                                   this,
                                                   boost::asio::placeholders::error));
         } else {
+                boost::xtime_get(&client_connected_time, boost::TIME_UTC);
                 upthread_status = UPTHREAD_ACTIVE;
         }
         up_thread_next_call_function = up_thread_function_array[func_tag];
@@ -1832,6 +1855,8 @@ void tcp_session::up_thread_realserver_connect_event(const TCP_PROCESS_TYPE_TAG
                 }
         }
 
+        server_connected_flag = true;
+
         //set realserver socket send buffer size
         if (likely(upstream_buffer_size > 0)) {
                 boost::asio::socket_base::send_buffer_size      buf_size(upstream_buffer_size);
@@ -2347,6 +2372,8 @@ void tcp_session::up_thread_sorryserver_connect_event(const TCP_PROCESS_TYPE_TAG
 
         boost::system::error_code       error_code;
 
+        server_connected_flag = true;
+
         // set sorryserver socket receive buffer size
         if (likely(downstream_buffer_size > 0)) {
                 boost::asio::socket_base::receive_buffer_size   buf_size(downstream_buffer_size);