Add MARC field 876$f to tmarc.xsl, named "loan-period", #4411
[pazpar2-moved-to-github.git] / src / connection.c
index 643f1a7..0a6f61c 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2010 Index Data
+   Copyright (C) 2006-2011 Index Data
 
 Pazpar2 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
@@ -48,22 +48,39 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include "settings.h"
 
 /* connection counting (1) , disable connection counting (0) */
-#if 0
+#if 1
 static YAZ_MUTEX g_mutex = 0;
 static int no_connections = 0;
+static int total_no_connections = 0;
 
-static void connection_use(int delta)
+static int connection_use(int delta)
 {
+    int result;
     if (!g_mutex)
         yaz_mutex_create(&g_mutex);
     yaz_mutex_enter(g_mutex);
     no_connections += delta;
+    result = no_connections;
+    if (delta > 0)
+        total_no_connections += delta;
     yaz_mutex_leave(g_mutex);
+    if (delta == 0)
+            return result;
     yaz_log(YLOG_LOG, "%s connections=%d", delta > 0 ? "INC" : "DEC",
             no_connections);
+    return result;
+}
+
+int connections_count(void)
+{
+    return connection_use(0);
 }
+
+
 #else
 #define connection_use(x)
+#define connections_count(x) 0
+#define connections_count_total(x) 0
 #endif
 
 
@@ -78,7 +95,8 @@ struct connection {
     enum {
         Conn_Resolving,
         Conn_Connecting,
-        Conn_Open
+        Conn_Open,
+        Conn_Dead
     } state;
     int operation_timeout;
     int session_timeout;
@@ -133,14 +151,13 @@ static void connection_destroy(struct connection *co)
         ZOOM_connection_destroy(co->link);
         iochan_destroy(co->iochan);
     }
-    yaz_log(YLOG_DEBUG, "Connection destroy %s", co->host->hostport);
+    yaz_log(YLOG_DEBUG, "%p Connection destroy %s", co, co->host->hostport);
 
     if (co->client)
     {
         client_disconnect(co->client);
     }
 
-    remove_connection_from_host(co);
     xfree(co->zproxy);
     xfree(co);
     connection_use(-1);
@@ -280,24 +297,28 @@ static void connection_handler(IOCHAN iochan, int event)
            a closed connection from the target.. Or, perhaps, an unexpected
            package.. We will just close the connection */
         yaz_log(YLOG_LOG, "timeout connection %p event=%d", co, event);
-        connection_destroy(co);
+        remove_connection_from_host(co);
         yaz_mutex_leave(host->mutex);
+        connection_destroy(co);
     }
     else if (event & EVENT_TIMEOUT)
     {
         if (co->state == Conn_Connecting)
         {
-            yaz_log(YLOG_WARN,  "connect timeout %s", client_get_url(cl));
+            yaz_log(YLOG_WARN, "%p connect timeout %s", co, client_get_url(cl));
 
             client_set_state(cl, Client_Error);
+            remove_connection_from_host(co);
+            yaz_mutex_leave(host->mutex);
             connection_destroy(co);
         }
         else
         {
-            yaz_log(YLOG_LOG,  "idle timeout %s", client_get_url(cl));
+            yaz_log(YLOG_LOG,  "%p Connection idle timeout %s", co, client_get_url(cl));
+            remove_connection_from_host(co);
+            yaz_mutex_leave(host->mutex);
             connection_destroy(co);
         }
-        yaz_mutex_leave(host->mutex);
     }
     else
     {
@@ -344,6 +365,7 @@ start:
         {
             if (!host->ipport) /* unresolved */
             {
+                remove_connection_from_host(con);
                 yaz_mutex_leave(host->mutex);
                 connection_destroy(con);
                 goto start;
@@ -351,6 +373,7 @@ start:
             }
             else if (!con->client)
             {
+                remove_connection_from_host(con);
                 yaz_mutex_leave(host->mutex);
                 connection_destroy(con);
                 /* start all over .. at some point it will be NULL */
@@ -417,7 +440,6 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
     if ((sru_version = session_setting_oneval(sdb, PZ_SRU_VERSION)) 
         && *sru_version)
         ZOOM_options_set(zoptions, "sru_version", sru_version);
-
     if (!(link = ZOOM_connection_create(zoptions)))
     {
         yaz_log(YLOG_FATAL|YLOG_ERRNO, "Failed to create ZOOM Connection");
@@ -432,6 +454,8 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
         strcat(http_hostport, host->hostport);
         ZOOM_connection_connect(link, http_hostport, 0);
     }
+    else if (zproxy && *zproxy)
+        ZOOM_connection_connect(link, host->hostport, 0);        
     else
         ZOOM_connection_connect(link, host->ipport, 0);
     
@@ -530,6 +554,7 @@ int client_prep_connection(struct client *cl,
         }
         if (co)
         {
+            yaz_log(YLOG_LOG,  "%p Connection reuse. state: %d", co, co->state);
             connection_release(co);
             client_set_connection(cl, co);
             co->client = cl;