Happy new year
[pazpar2-moved-to-github.git] / src / connection.c
index c55785d..e0b809d 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
@@ -78,7 +78,8 @@ struct connection {
     enum {
         Conn_Resolving,
         Conn_Connecting,
-        Conn_Open
+        Conn_Open,
+        Conn_Dead
     } state;
     int operation_timeout;
     int session_timeout;
@@ -133,14 +134,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 +280,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 +348,7 @@ start:
         {
             if (!host->ipport) /* unresolved */
             {
+                remove_connection_from_host(con);
                 yaz_mutex_leave(host->mutex);
                 connection_destroy(con);
                 goto start;
@@ -351,6 +356,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 */
@@ -532,6 +538,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;