OSDN Git Service

Add session_thread_pool_size option for l7vsadm and l7directord.
authorMichiro Hibari <hibari@users.sourceforge.jp>
Wed, 28 Dec 2011 06:14:14 +0000 (15:14 +0900)
committerhibari <l05102@shibaura-it.ac.jp>
Sat, 8 Sep 2012 04:30:03 +0000 (13:30 +0900)
doc/conf/l7directord.cf.sample
l7directord/l7directord
l7vsd/include/l7vsadm.h
l7vsd/include/virtualservice_element.h
l7vsd/src/l7vsadm.cpp
l7vsd/src/virtualservice_tcp.cpp

index d979496..53eddef 100644 (file)
@@ -56,3 +56,4 @@ virtual  = 192.168.0.50:80
        #accesslog_rotate_max_filesize     = 100M
        #accesslog_rotate_rotation_timing  = month
        #accesslog_rotate_rotation_timing_value = "1 23:59"
+       #session_thread_pool_size = 32
index b905b1a..2a0db44 100644 (file)
@@ -138,6 +138,7 @@ our %VIRTUAL = (
     accesslog_rotate_max_filesize          => undef,
     accesslog_rotate_rotation_timing       => undef,
     accesslog_rotate_rotation_timing_value => undef,
+    session_thread_pool_size               => undef,
     other_virtual_key                      => undef,
     # can override
     checkcount          => undef,
@@ -1060,6 +1061,11 @@ sub validate_config {
                 config_error($line, 'ERR0129', $config);
             }
         }
+        elsif ($name eq 'session_thread_pool_size') {
+            if (!defined $value || $value !~ /^\d+$/ || $value == 0 ) {
+                config_error($line, 'ERR0101', $config);
+            }
+        }
     }
 
     return ($name, $value);
@@ -1400,6 +1406,13 @@ sub ld_setup {
                 if ( $option_key_flag == 0 ) {
                     $v->{other_virtual_key} .= ' none';
                 }
+                if ( defined $v->{session_thread_pool_size} ) {
+                    $v->{option}{flags} .= ' --session-thread-pool-size ' . $v->{session_thread_pool_size};
+                    $v->{other_virtual_key} .= ' ' . $v->{session_thread_pool_size};
+                }
+                else {
+                    $v->{other_virtual_key} .= ' none';
+                }
             }
     
             if ( !defined $v->{fallback} && defined $CONFIG{fallback} ) {
@@ -4998,6 +5011,11 @@ FORMAT: B<"HH:mm">
 
 FORMAT: B<"mm">
 
+Defines the size each of session_thread_pool_size.
+Default is session_thread_pool_size parameter at l7vs.cf.
+
+=item B<session_thread_pool_size = >I<n>
+
 =back
 
 =back
index 399c850..9363822 100644 (file)
@@ -286,6 +286,8 @@ protected:
         bool parse_opt_vs_access_log_logrotate_func(int &, int, char*[]);
         //! virtualservice option socket option function
         bool parse_opt_vs_socket_func(int &, int, char*[]);
+        //! virtualservice option session thread pool size function
+        bool parse_opt_vs_session_thread_pool_size_func(int &, int, char*[]);
         // realserver option function
         //! realserver weight set
         bool parse_opt_rs_weight_func(int &, int, char*[]);
index ae24c88..11af252 100644 (file)
@@ -68,6 +68,7 @@ public:
         unsigned long long qos_downstream;
         unsigned long long throughput_upstream;
         unsigned long long throughput_downstream;
+        unsigned long long session_thread_pool_size;
 
         std::string ssl_file_name;
 
@@ -99,6 +100,7 @@ public:
                    qos_downstream(0ULL),
                    throughput_upstream(0ULL),
                    throughput_downstream(0ULL),
+                   session_thread_pool_size(0),
                    access_log_flag(0),
                    socket_option_tcp_defer_accept(0),
                    socket_option_tcp_nodelay(0),
@@ -122,6 +124,7 @@ public:
                    qos_downstream(in.qos_downstream),
                    throughput_upstream(in.throughput_upstream),
                    throughput_downstream(in.throughput_downstream),
+                   session_thread_pool_size(in.session_thread_pool_size),
                    ssl_file_name(in.ssl_file_name),
                    access_log_flag(in.access_log_flag),
                    access_log_file_name(in.access_log_file_name),
@@ -164,6 +167,7 @@ public:
                 qos_downstream = in.qos_downstream;
                 throughput_upstream = in.throughput_upstream;
                 throughput_downstream = in.throughput_downstream;
+                session_thread_pool_size = in.session_thread_pool_size;
                 access_log_flag = in.access_log_flag;
                 ssl_file_name = in.ssl_file_name;
                 access_log_file_name = in.access_log_file_name;
@@ -205,6 +209,7 @@ public:
                     elem1.qos_downstream == elem2.qos_downstream &&
                     elem1.throughput_upstream == elem2.throughput_upstream &&
                     elem1.throughput_downstream == elem2.throughput_downstream &&
+                    elem1.session_thread_pool_size == elem2.session_thread_pool_size &&
                     elem1.access_log_flag == elem2.access_log_flag &&
                     elem1.ssl_file_name == elem2.ssl_file_name &&
                     elem1.access_log_file_name == elem2.access_log_file_name &&
@@ -265,6 +270,7 @@ public:
                     elem1.qos_downstream == elem2.qos_downstream &&
                     elem1.throughput_upstream == elem2.throughput_upstream &&
                     elem1.throughput_downstream == elem2.throughput_downstream &&
+                    elem1.session_thread_pool_size == elem2.session_thread_pool_size &&
                     elem1.access_log_flag == elem2.access_log_flag &&
                     elem1.ssl_file_name == elem2.ssl_file_name &&
                     elem1.access_log_file_name == elem2.access_log_file_name &&
@@ -368,6 +374,7 @@ public:
                                     "qos_downstream=%d, "
                                     "throughput_upstream=%d, "
                                     "throughput_downstream=%d, "
+                                    "session_thread_pool_size=%d, "
                                     "access_log_flag=%d, "
                                     "ssl_file_name=%s, "
                                     "access_log_file_name=%s, "
@@ -392,6 +399,7 @@ public:
                    % elem.qos_downstream
                    % elem.throughput_upstream
                    % elem.throughput_downstream
+                   % elem.session_thread_pool_size
                    % elem.access_log_flag
                    % elem.ssl_file_name
                    % elem.access_log_file_name
@@ -440,6 +448,7 @@ private:
                 ar &qos_downstream;
                 ar &throughput_upstream;
                 ar &throughput_downstream;
+                ar &session_thread_pool_size;
                 ar &access_log_flag;
                 ar &ssl_file_name;
                 ar &access_log_file_name;
index b63d573..9c0905f 100644 (file)
@@ -1185,6 +1185,40 @@ bool l7vs::l7vsadm::parse_opt_vs_socket_func(int &pos, int argc, char *argv[])
         return true;
 
 }
+//! virtualservice option session_thread_pool_size function
+//! @param[in] argument position
+//! @param[in] argument count
+//! @param[in] argument value
+bool l7vs::l7vsadm::parse_opt_vs_session_thread_pool_size_func(int &pos, int argc, char *argv[])
+{
+        Logger logger(LOG_CAT_L7VSADM_COMMON, 10, "l7vsadm::parse_opt_vs_session_thread_pool_size_func", __FILE__, __LINE__);
+        if (++pos >= argc) {
+                // session_thread_pool_size is not specified.
+                std::string buf("session_thread_pool_size is not specified.(--session-thread-pool-size)");
+                l7vsadm_err.setter(true, buf);
+                Logger::putLogError(LOG_CAT_L7VSADM_PARSE, /* fix me */999, buf, __FILE__, __LINE__);
+                return false;
+        }
+        try {
+                virtualservice_element &elem = request.vs_element; // request virtualservice element reference get.
+                std::string tmp = argv[pos];
+                unsigned long long ullval = boost::lexical_cast<unsigned long long> (argv[pos]);
+                if (ullval < 1) {
+                        std::string buf("session-thread-pool-size is too small.(--session-thread-pool-size)");
+                        l7vsadm_err.setter(true, buf);
+                        Logger::putLogError(LOG_CAT_L7VSADM_PARSE, /* fix me */999, buf, __FILE__, __LINE__);
+                        return false;
+                }
+                elem.session_thread_pool_size = ullval; // set session_thread_pool_size
+        } catch (boost::bad_lexical_cast &ex) {
+                std::string buf("invalid session-thread-pool-size.(--session-thiread-pool-size)");
+                l7vsadm_err.setter(true, buf);
+                Logger::putLogError(LOG_CAT_L7VSADM_PARSE, /* fix me */999, buf, __FILE__, __LINE__);
+                return false;
+        }
+        return true;
+}
+
 //! realserver command parsing.
 //! @param[in] request command
 //! @param[in] argument count
@@ -2258,6 +2292,7 @@ bool l7vs::l7vsadm::parse_help_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd,
                   "  --access-log       -L access-log-flag     access log flag 0(none) or 1(output)\n"
                   "  --access-log-name  -a access-log-file     access log file\n"
                   "                        [logrotate-args]\n"
+                  "  --session-thread-pool-size val-size       set session_thread_pool_size\n"
                   "  --real-server      -r server-address      server-address is host:port\n"
                   "  --weight           -w weight              scheduling weight set to real server\n"
                   "  --tproxy                                  set real server connection to IP transparent mode.\n"
@@ -2291,6 +2326,7 @@ std::string l7vs::l7vsadm::usage()
                "          [-s scheduler] [-u connection-count] [-b sorry-server] [--masq|tproxy]\n"
                "          [-f sorry-flag] [-Q QoSval-up] [-q QoSval-down] [-z ssl-config-file]\n"
                "          [-O socket-option] [-L access-log-flag] [-a access-log-file [logrotate-args]]\n"
+               "          [--session-thread-pool-size val-size]\n"
                "  l7vsadm -E -t service-address -m proto-module [module-args]\n"
                "          [-s scheduler] [-u connection-count] [-b sorry-server] [--masq|tproxy]\n"
                "          [-f sorry-flag] [-Q QoSval-up] [-q QoSval-down] [-L access-log-flag]\n"
@@ -2682,6 +2718,7 @@ l7vs::l7vsadm::l7vsadm()
         vs_option_dic["--access-log"]      = boost::bind(&l7vsadm::parse_opt_vs_access_log_func, this, _1, _2, _3);
         vs_option_dic["-a"]                = boost::bind(&l7vsadm::parse_opt_vs_access_log_logrotate_func, this, _1, _2, _3);
         vs_option_dic["--access-log-name"] = boost::bind(&l7vsadm::parse_opt_vs_access_log_logrotate_func, this, _1, _2, _3);
+        vs_option_dic["--session-thread-pool-size"] = boost::bind(&l7vsadm::parse_opt_vs_session_thread_pool_size_func, this, _1, _2, _3);
 
         // create realserver option dictionary
         rs_option_dic["-t"]             = boost::bind(&l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3);
index bdb6bd6..7f69571 100644 (file)
@@ -798,7 +798,13 @@ void l7vs::virtualservice_tcp::initialize(l7vs::error_code &err)
 
         //create session pool
         {
-                for (int i = 0; i < param_data.session_pool_size; ++i) {
+                int session_pool_size;
+                if (element.session_thread_pool_size > 0) {
+                        session_pool_size = element.session_thread_pool_size;
+                } else {
+                        session_pool_size = param_data.session_pool_size;
+                }
+                for (int i = 0; i < session_pool_size; ++i) {
                         try {
                                 tcp_session *sess = new tcp_session(*this,
                                                                     *dispatcher,