Removed log msg
[metaproxy-moved-to-github.git] / src / filter_z3950_client.cpp
index d0d0442..afeccb8 100644 (file)
@@ -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<std::string> 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<std::string> 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();
@@ -397,17 +406,13 @@ void yf::Z3950Client::Rep::release_assoc(Package &package)
         {
             // destroy hint (send_and_receive)
             it->second->m_destroyed = true;
-            
-            // wait until no one is waiting for it.
-            while (it->second->m_queue_len)
-                m_cond_session_ready.wait(lock);
-            // the Z_Assoc and PDU_Assoc must be destroyed before
-            // the socket manager.. so pull that out.. first..
-            yazpp_1::SocketManager *s = it->second->m_socket_manager;
-            delete it->second;  // destroy Z_Assoc
-            delete s;    // then manager
-            m_clients.erase(it);
+            if (it->second->m_queue_len == 0)
+            {
+                yazpp_1::SocketManager *s = it->second->m_socket_manager;
+                delete it->second;  // destroy Z_Assoc
+                delete s;    // then manager
+                m_clients.erase(it);
+            }
         }
         m_cond_session_ready.notify_all();
     }