X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ffilter_z3950_client.cpp;h=6b27e7eb8a508afbcd0090eca7db9f8d04a66d98;hb=09ce8a48eb9d2947cd019f9b8adb6513941c2211;hp=d0d04427595889803b216b9322c8c04b344f0451;hpb=a261f885073190e8de7ebe07870bc8e4d048f1e0;p=metaproxy-moved-to-github.git diff --git a/src/filter_z3950_client.cpp b/src/filter_z3950_client.cpp index d0d0442..6b27e7e 100644 --- a/src/filter_z3950_client.cpp +++ b/src/filter_z3950_client.cpp @@ -203,11 +203,18 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) package.move(); return 0; } + + int max_sockets = package.origin().get_max_sockets(); + if (max_sockets == 0) + max_sockets = m_max_sockets; + + std::string host; + it = m_clients.find(package.session()); if (it != m_clients.end()) { it->second->m_queue_len++; - while(true) + while (true) { #if 0 // double init .. NOT working yet @@ -249,7 +256,7 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) target = m_default_target; std::list vhosts; mp::util::remove_vhost_otherinfo(&apdu->u.initRequest->otherInfo, - vhosts); + vhosts); size_t no_vhosts = vhosts.size(); if (no_vhosts == 1) { @@ -282,17 +289,18 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) return 0; } } - + std::list dblist; - std::string host; mp::util::split_zurl(target, host, dblist); if (dblist.size()) { ; // z3950_client: Databases in vhost ignored } + + // see if we have reached max number of clients (max-sockets) - while (m_max_sockets) + while (max_sockets) { int number = 0; it = m_clients.begin(); @@ -302,16 +310,17 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) if (!strcmp(as->get_hostname(), host.c_str())) number++; } - if (number < m_max_sockets) + yaz_log(YLOG_LOG, "Found %d connections for %s", number, host.c_str()); + if (number < max_sockets) break; boost::xtime xt; xtime_get(&xt, boost::TIME_UTC); - + xt.sec += 15; if (!m_cond_session_ready.timed_wait(lock, xt)) { mp::odr odr; - + package.response() = odr.create_initResponse( apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "max sessions"); package.session().close(); @@ -409,6 +418,7 @@ void yf::Z3950Client::Rep::release_assoc(Package &package) delete s; // then manager m_clients.erase(it); } + yaz_log(YLOG_LOG, "Notify all release_assoc"); m_cond_session_ready.notify_all(); } }