X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_frontend_net.cpp;h=cf28e9b6bd3353c474c2249efd4432c08584b1a2;hb=24037b116e6c6a46a477e973e60e5fe6030b46c3;hp=f7b1bbb7019051f4b6eb33feafa1f115e38e1e00;hpb=cabf4d45007436abe46147df5da77901ea39238b;p=metaproxy-moved-to-github.git diff --git a/src/filter_frontend_net.cpp b/src/filter_frontend_net.cpp index f7b1bbb..cf28e9b 100644 --- a/src/filter_frontend_net.cpp +++ b/src/filter_frontend_net.cpp @@ -49,14 +49,21 @@ namespace metaproxy_1 { }; class FrontendNet::Rep { friend class FrontendNet; + int m_no_threads; std::vector m_ports; int m_listen_duration; int m_session_timeout; int m_connect_max; std::string m_msg_config; + std::string m_stat_req; yazpp_1::SocketManager mySocketManager; ZAssocServer **az; + int m_duration_freq[22]; + double m_duration_lim[22]; + public: + Rep(); + ~Rep(); }; class FrontendNet::My_Timer_Thread : public yazpp_1::ISocketObserver { private: @@ -75,7 +82,7 @@ namespace metaproxy_1 { mp::ThreadPoolSocketObserver *m_thread_pool_observer, const mp::Package *package, std::string route, - const char *msg_config); + Rep *rep); int m_no_requests; std::string m_route; private: @@ -93,13 +100,13 @@ namespace metaproxy_1 { mp::Origin m_origin; bool m_delete_flag; const mp::Package *m_package; - const char *m_msg_config; + Rep *m_p; }; class FrontendNet::ThreadPoolPackage : public mp::IThreadPoolMsg { public: ThreadPoolPackage(mp::Package *package, yf::FrontendNet::ZAssocChild *ses, - const char *msg_config); + Rep *rep); ~ThreadPoolPackage(); IThreadPoolMsg *handle(); void result(const char *t_info); @@ -108,16 +115,16 @@ namespace metaproxy_1 { yaz_timing_t timer; ZAssocChild *m_assoc_child; mp::Package *m_package; - const char *m_msg_config; + Rep *m_p; }; class FrontendNet::ZAssocServer : public yazpp_1::Z_Assoc { public: ~ZAssocServer(); - ZAssocServer(yazpp_1::IPDU_Observable *PDU_Observable, int timeout, - int connect_max, std::string route, - const char *msg_config); + ZAssocServer(yazpp_1::IPDU_Observable *PDU_Observable, + std::string route, + Rep *rep); void set_package(const mp::Package *package); - void set_thread_pool(ThreadPoolSocketObserver *m_thread_pool_observer); + void set_thread_pool(ThreadPoolSocketObserver *observer); private: yazpp_1::IPDU_Observer* sessionNotify( yazpp_1::IPDU_Observable *the_PDU_Observable, @@ -130,24 +137,19 @@ namespace metaproxy_1 { private: mp::ThreadPoolSocketObserver *m_thread_pool_observer; const mp::Package *m_package; - int m_session_timeout; - int m_connect_max; yazpp_1::LimitConnect limit_connect; std::string m_route; - const char *m_msg_config; + Rep *m_p; }; } } yf::FrontendNet::ThreadPoolPackage::ThreadPoolPackage(mp::Package *package, ZAssocChild *ses, - const char *msg_config) : - m_assoc_child(ses), m_package(package), m_msg_config(msg_config) + Rep *rep) : + m_assoc_child(ses), m_package(package), m_p(rep) { - if (msg_config) - timer = yaz_timing_create(); - else - timer = 0; + timer = yaz_timing_create(); } yf::FrontendNet::ThreadPoolPackage::~ThreadPoolPackage() @@ -173,6 +175,31 @@ void yf::FrontendNet::ThreadPoolPackage::result(const char *t_info) { int len; m_assoc_child->send_GDU(gdu->get(), &len); + + yaz_timing_stop(timer); + double duration = yaz_timing_get_real(timer); + + size_t ent = 0; + while (m_p->m_duration_lim[ent] != 0.0 && duration > m_p->m_duration_lim[ent]) + ent++; + m_p->m_duration_freq[ent]++; + + if (m_p->m_msg_config.length()) + { + Z_GDU *z_gdu = gdu->get(); + + std::ostringstream os; + os << m_p->m_msg_config << " " + << *m_package << " " + << std::fixed << std::setprecision (6) << duration << " "; + + if (z_gdu) + os << *z_gdu; + else + os << "-"; + + yaz_log(YLOG_LOG, "%s %s", os.str().c_str(), t_info); + } } else if (!m_package->session().is_closed()) { @@ -208,25 +235,7 @@ void yf::FrontendNet::ThreadPoolPackage::result(const char *t_info) { m_assoc_child->close(); } - - if (m_msg_config) - { - yaz_timing_stop(timer); - double duration = yaz_timing_get_real(timer); - Z_GDU *z_gdu = gdu->get(); - - std::ostringstream os; - os << m_msg_config << " " - << *m_package << " " - << std::fixed << std::setprecision (6) << duration << " "; - - if (z_gdu) - os << *z_gdu; - else - os << "-"; - - yaz_log(YLOG_LOG, "%s %s", os.str().c_str(), t_info); - } + delete this; } @@ -237,14 +246,12 @@ mp::IThreadPoolMsg *yf::FrontendNet::ThreadPoolPackage::handle() return this; } - yf::FrontendNet::ZAssocChild::ZAssocChild( yazpp_1::IPDU_Observable *PDU_Observable, mp::ThreadPoolSocketObserver *my_thread_pool, const mp::Package *package, - std::string route, - const char *msg_config) - : Z_Assoc(PDU_Observable), m_msg_config(msg_config) + std::string route, Rep *rep) + : Z_Assoc(PDU_Observable), m_p(rep) { m_thread_pool_observer = my_thread_pool; m_no_requests = 0; @@ -255,12 +262,11 @@ yf::FrontendNet::ZAssocChild::ZAssocChild( if (!peername) peername = "unknown"; m_origin.set_tcpip_address(std::string(peername), m_session.id()); + timeout(m_p->m_session_timeout); } - yazpp_1::IPDU_Observer *yf::FrontendNet::ZAssocChild::sessionNotify( - yazpp_1::IPDU_Observable - *the_PDU_Observable, int fd) + yazpp_1::IPDU_Observable *the_PDU_Observable, int fd) { return 0; } @@ -275,16 +281,66 @@ void yf::FrontendNet::ZAssocChild::recv_GDU(Z_GDU *z_pdu, int len) mp::Package *p = new mp::Package(m_session, m_origin); - ThreadPoolPackage *tp = new ThreadPoolPackage(p, this, m_msg_config); + if (z_pdu && z_pdu->which == Z_GDU_HTTP_Request) + { + Z_HTTP_Request *hreq = z_pdu->u.HTTP_Request; + + if (m_p->m_stat_req.length() + && !strcmp(hreq->path, m_p->m_stat_req.c_str())) + { + mp::odr o; + + Z_GDU *gdu_res = o.create_HTTP_Response(m_session, hreq, 200); + + Z_HTTP_Response *hres = gdu_res->u.HTTP_Response; + + mp::wrbuf w; + size_t i; + int number_total = 0; + + for (i = 0; m_p->m_duration_lim[i] != 0.0; i++) + number_total += m_p->m_duration_freq[i]; + number_total += m_p->m_duration_freq[i]; + + wrbuf_puts(w, "\n"); + wrbuf_puts(w, "\n"); + wrbuf_printf(w, " \n", number_total); + for (i = 0; m_p->m_duration_lim[i] != 0.0; i++) + { + if (m_p->m_duration_freq[i] > 0) + wrbuf_printf( + w, " \n", + i > 0 ? m_p->m_duration_lim[i - 1] : 0.0, + m_p->m_duration_lim[i], m_p->m_duration_freq[i]); + } + + if (m_p->m_duration_freq[i] > 0) + wrbuf_printf( + w, " \n", + m_p->m_duration_lim[i - 1], m_p->m_duration_freq[i]); + wrbuf_puts(w, " \n"); + wrbuf_puts(w, "\n"); + + hres->content_len = w.len(); + hres->content_buf = (char *) w.buf(); + + int len; + send_GDU(gdu_res, &len); + return; + } + } + + ThreadPoolPackage *tp = new ThreadPoolPackage(p, this, m_p); p->copy_route(*m_package); p->request() = yazpp_1::GDU(z_pdu); - if (m_msg_config) + if (m_p->m_msg_config.length()) { if (z_pdu) { std::ostringstream os; - os << m_msg_config << " " + os << m_p->m_msg_config << " " << *p << " " << "0.000000" << " " << *z_pdu; @@ -309,7 +365,7 @@ void yf::FrontendNet::ZAssocChild::failNotify() mp::Package *p = new mp::Package(m_session, m_origin); - ThreadPoolPackage *tp = new ThreadPoolPackage(p, this, m_msg_config); + ThreadPoolPackage *tp = new ThreadPoolPackage(p, this, m_p); p->copy_route(*m_package); m_thread_pool_observer->cleanup(tp, &m_session); m_thread_pool_observer->put(tp); @@ -327,11 +383,10 @@ void yf::FrontendNet::ZAssocChild::connectNotify() yf::FrontendNet::ZAssocServer::ZAssocServer( yazpp_1::IPDU_Observable *PDU_Observable, - int timeout, int connect_max, - std::string route, const char *msg_config) + std::string route, + Rep *rep) : - Z_Assoc(PDU_Observable), m_session_timeout(timeout), - m_connect_max(connect_max), m_route(route), m_msg_config(msg_config) + Z_Assoc(PDU_Observable), m_route(route), m_p(rep) { m_package = 0; } @@ -342,13 +397,14 @@ void yf::FrontendNet::ZAssocServer::set_package(const mp::Package *package) m_package = package; } -void yf::FrontendNet::ZAssocServer::set_thread_pool(ThreadPoolSocketObserver *observer) +void yf::FrontendNet::ZAssocServer::set_thread_pool( + ThreadPoolSocketObserver *observer) { m_thread_pool_observer = observer; } -yazpp_1::IPDU_Observer *yf::FrontendNet::ZAssocServer::sessionNotify(yazpp_1::IPDU_Observable - *the_PDU_Observable, int fd) +yazpp_1::IPDU_Observer *yf::FrontendNet::ZAssocServer::sessionNotify( + yazpp_1::IPDU_Observable *the_PDU_Observable, int fd) { const char *peername = the_PDU_Observable->getpeername(); @@ -357,13 +413,12 @@ yazpp_1::IPDU_Observer *yf::FrontendNet::ZAssocServer::sessionNotify(yazpp_1::IP limit_connect.add_connect(peername); limit_connect.cleanup(false); int con_sz = limit_connect.get_total(peername); - if (m_connect_max && con_sz > m_connect_max) + if (m_p->m_connect_max && con_sz > m_p->m_connect_max) return 0; } ZAssocChild *my = new ZAssocChild(the_PDU_Observable, m_thread_pool_observer, - m_package, m_route, m_msg_config); - my->timeout(m_session_timeout); + m_package, m_route, m_p); return my; } @@ -389,23 +444,57 @@ void yf::FrontendNet::ZAssocServer::connectNotify() yf::FrontendNet::FrontendNet() : m_p(new Rep) { - m_p->m_no_threads = 5; - m_p->m_listen_duration = 0; - m_p->m_session_timeout = 300; // 5 minutes - m_p->m_connect_max = 0; - m_p->az = 0; } -yf::FrontendNet::~FrontendNet() +yf::FrontendNet::Rep::Rep() { - if (m_p->az) + m_no_threads = 5; + m_listen_duration = 0; + m_session_timeout = 300; // 5 minutes + m_connect_max = 0; + az = 0; + size_t i; + for (i = 0; i < 22; i++) + m_duration_freq[i] = 0; + m_duration_lim[0] = 0.000001; + m_duration_lim[1] = 0.00001; + m_duration_lim[2] = 0.0001; + m_duration_lim[3] = 0.001; + m_duration_lim[4] = 0.01; + m_duration_lim[5] = 0.1; + m_duration_lim[6] = 0.2; + m_duration_lim[7] = 0.3; + m_duration_lim[8] = 0.5; + m_duration_lim[9] = 1.0; + m_duration_lim[10] = 1.5; + m_duration_lim[11] = 2.0; + m_duration_lim[12] = 3.0; + m_duration_lim[13] = 4.0; + m_duration_lim[14] = 5.0; + m_duration_lim[15] = 6.0; + m_duration_lim[16] = 8.0; + m_duration_lim[17] = 10.0; + m_duration_lim[18] = 15.0; + m_duration_lim[19] = 20.0; + m_duration_lim[20] = 30.0; + m_duration_lim[21] = 0; +} + + +yf::FrontendNet::Rep::~Rep() +{ + if (az) { size_t i; - for (i = 0; im_ports.size(); i++) - delete m_p->az[i]; - delete [] m_p->az; + for (i = 0; i < m_ports.size(); i++) + delete az[i]; + delete [] az; } - m_p->az = 0; + az = 0; +} + +yf::FrontendNet::~FrontendNet() +{ } void yf::FrontendNet::stop() const @@ -413,7 +502,7 @@ void yf::FrontendNet::stop() const if (m_p->az) { size_t i; - for (i = 0; im_ports.size(); i++) + for (i = 0; i < m_p->m_ports.size(); i++) m_p->az[i]->server(""); } } @@ -519,6 +608,10 @@ void yf::FrontendNet::configure(const xmlNode * ptr, bool test_only, { m_p->m_msg_config = mp::xml::get_text(ptr); } + else if (!strcmp((const char *) ptr->name, "stat-req")) + { + m_p->m_stat_req = mp::xml::get_text(ptr); + } else { throw yf::FilterException("Bad element " @@ -562,12 +655,8 @@ void yf::FrontendNet::set_ports(std::vector &ports) yazpp_1::PDU_Assoc *as = new yazpp_1::PDU_Assoc(&m_p->mySocketManager); // create ZAssoc with PDU Assoc - m_p->az[i] = new yf::FrontendNet::ZAssocServer(as, - m_p->m_session_timeout, - m_p->m_connect_max, - m_p->m_ports[i].route, - m_p->m_msg_config.length() > 0 ? - m_p->m_msg_config.c_str() : 0); + m_p->az[i] = new yf::FrontendNet::ZAssocServer( + as, m_p->m_ports[i].route, m_p.get()); if (m_p->az[i]->server(m_p->m_ports[i].port.c_str())) { throw yf::FilterException("Unable to bind to address "