session_shared: init fail: close backend.
[metaproxy-moved-to-github.git] / src / filter_z3950_client.cpp
index afeccb8..683c09a 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Metaproxy.
-   Copyright (C) 2005-2008 Index Data
+   Copyright (C) 2005-2010 Index Data
 
 Metaproxy is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -18,10 +18,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include "config.hpp"
 
-#include "filter.hpp"
-#include "package.hpp"
-#include "util.hpp"
 #include "filter_z3950_client.hpp"
+#include <metaproxy/package.hpp>
+#include <metaproxy/util.hpp>
 
 #include <map>
 #include <stdexcept>
@@ -70,6 +69,7 @@ namespace metaproxy_1 {
             int m_queue_len;
             int m_time_elapsed;
             int m_time_max;
+            int m_time_connect_max;
             std::string m_host;
         };
 
@@ -100,7 +100,7 @@ yf::Z3950Client::Assoc::Assoc(yazpp_1::SocketManager *socket_manager,
        m_socket_manager(socket_manager), m_PDU_Observable(PDU_Observable),
        m_package(0), m_in_use(true), m_waiting(false), 
        m_destroyed(false), m_connected(false), m_queue_len(1),
-       m_time_elapsed(0), m_time_max(timeout_sec), 
+       m_time_elapsed(0), m_time_max(timeout_sec),  m_time_connect_max(10),
        m_host(host)
 {
     // std::cout << "create assoc " << this << "\n";
@@ -139,7 +139,8 @@ void yf::Z3950Client::Assoc::failNotify()
 void yf::Z3950Client::Assoc::timeoutNotify()
 {
     m_time_elapsed++;
-    if (m_time_elapsed >= m_time_max)
+    if ((m_connected && m_time_elapsed >= m_time_max)
+        || (!m_connected && m_time_elapsed >= m_time_connect_max))
     {
         m_waiting = false;
 
@@ -272,7 +273,7 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package)
                 package.response() = odr.create_initResponse(
                     apdu,
                     YAZ_BIB1_INIT_NEGOTIATION_OPTION_REQUIRED,
-                    "z3950_client: No virtal host given");
+                    "z3950_client: No vhost given");
                 
                 package.session().close();
                 return 0;
@@ -302,17 +303,32 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package)
 
     while (max_sockets)
     {
+        int no_not_in_use = 0;
         int number = 0;
         it = m_clients.begin();
         for (; it != m_clients.end(); it++)
         {
             yf::Z3950Client::Assoc *as = it->second;
-            if (!strcmp(as->get_hostname(), host.c_str()))
+            if (!strcmp(as->m_host.c_str(), host.c_str()))
+            {
                 number++;
+                if (!as->m_in_use)
+                    no_not_in_use++;
+            }
         }
-        yaz_log(YLOG_LOG, "Found %d connections for %s", number, host.c_str());
+        yaz_log(YLOG_LOG, "Found %d/%d connections for %s", number, max_sockets,
+                host.c_str());
         if (number < max_sockets)
             break;
+        if (no_not_in_use == 0) // all in use..
+        {
+            mp::odr odr;
+            
+            package.response() = odr.create_initResponse(
+                apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "max sessions");
+            package.session().close();
+            return 0;
+        }
         boost::xtime xt;
         xtime_get(&xt, boost::TIME_UTC);
         
@@ -475,8 +491,9 @@ extern "C" {
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
- * c-file-style: "stroustrup"
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab
  */
+