For sort, re-use non-idle clients
[pazpar2-moved-to-github.git] / src / connection.c
index 1c7d467..02509cf 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2011 Index Data
+   Copyright (C) 2006-2012 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
@@ -224,7 +224,7 @@ static void non_block_events(struct connection *co)
                 {
                     yaz_log(YLOG_LOG, "Error %s from %s",
                             error, client_get_id(cl));
-                    client_set_diagnostic(cl, err);
+                    client_set_diagnostic(cl, err, addinfo);
                     client_set_state(cl, Client_Error);
                 }
                 else
@@ -261,6 +261,7 @@ static void non_block_events(struct connection *co)
         default:
             yaz_log(YLOG_LOG, "Unhandled event (%d) from %s",
                     ev, client_get_id(cl));
+            break;
         }
     }
     if (got_records)
@@ -287,7 +288,7 @@ void connection_continue(struct connection *co)
             {
                 yaz_log(YLOG_LOG, "Error %s from %s",
                         error, client_get_id(co->client));
-                client_set_diagnostic(co->client, err);
+                client_set_diagnostic(co->client, err, addinfo);
                 client_set_state_nb(co->client, Client_Error);
             }
         }
@@ -495,7 +496,8 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
 int client_prep_connection(struct client *cl,
                            int operation_timeout, int session_timeout,
                            iochan_man_t iochan_man,
-                           const struct timeval *abstime)
+                           const struct timeval *abstime,
+                           int ok_with_working)
 {
     struct connection *co;
     struct session_database *sdb = client_get_database(cl);
@@ -524,14 +526,14 @@ int client_prep_connection(struct client *cl,
     if (co)
     {
         assert(co->host);
-        if (co->host == host)
-            ;  /* reusing connection. It's ours! */
-        else 
+        if (co->host == host && (client_get_state(cl) == Client_Idle
+                                 || ok_with_working))
         {
-            client_incref(cl);
-            connection_release(co);
-            co = 0;
+            return 2;
         }
+        client_incref(cl);
+        connection_release(co);
+        co = 0;
     }
     if (!co)
     {