If a timeout occurs when a client exists and is non-Idle, the timeout
is ignored. This ensures that if a timeout happens after a connection
is picked up in client_prep_connection, then it is not destroyed
(soon after).
In connection_create, move code that adds connection to host list to
the end of the creation phase.
{
struct connection **conp = &con->host->connections;
assert(con);
{
struct connection **conp = &con->host->connections;
assert(con);
- yaz_mutex_enter(con->host->mutex);
while (*conp)
{
if (*conp == con)
while (*conp)
{
if (*conp == con)
}
conp = &(*conp)->next;
}
}
conp = &(*conp)->next;
}
- yaz_mutex_leave(con->host->mutex);
}
// Close connection and recycle structure
}
// Close connection and recycle structure
new = xmalloc(sizeof(*new));
new->host = host;
new = xmalloc(sizeof(*new));
new->host = host;
- yaz_mutex_enter(host->mutex);
- new->next = new->host->connections;
- new->host->connections = new;
- yaz_mutex_leave(host->mutex);
-
new->client = cl;
new->zproxy = 0;
client_set_connection(cl, new);
new->client = cl;
new->zproxy = 0;
client_set_connection(cl, new);
new->session_timeout = session_timeout;
if (host->ipport)
connection_connect(new, iochan_man);
new->session_timeout = session_timeout;
if (host->ipport)
connection_connect(new, iochan_man);
+
+ yaz_mutex_enter(host->mutex);
+ new->next = new->host->connections;
+ new->host->connections = new;
+ yaz_mutex_leave(host->mutex);
+
{
struct connection *co = iochan_getdata(iochan);
struct client *cl = co->client;
{
struct connection *co = iochan_getdata(iochan);
struct client *cl = co->client;
+ struct host *host = co->host;
+ yaz_mutex_enter(host->mutex);
if (!cl)
{
/* no client associated with it.. We are probably getting
if (!cl)
{
/* no client associated with it.. We are probably getting
package.. We will just close the connection */
yaz_log(YLOG_LOG, "timeout connection %p event=%d", co, event);
connection_destroy(co);
package.. We will just close the connection */
yaz_log(YLOG_LOG, "timeout connection %p event=%d", co, event);
connection_destroy(co);
- if (event & EVENT_TIMEOUT)
+ else if (event & EVENT_TIMEOUT)
{
if (co->state == Conn_Connecting)
{
yaz_log(YLOG_WARN, "connect timeout %s", client_get_url(cl));
client_fatal(cl);
}
{
if (co->state == Conn_Connecting)
{
yaz_log(YLOG_WARN, "connect timeout %s", client_get_url(cl));
client_fatal(cl);
}
+ else if (client_get_state(co->client) == Client_Idle)
{
yaz_log(YLOG_LOG, "idle timeout %s", client_get_url(cl));
connection_destroy(co);
}
{
yaz_log(YLOG_LOG, "idle timeout %s", client_get_url(cl));
connection_destroy(co);
}
+ else
+ {
+ yaz_log(YLOG_LOG, "ignore timeout %s", client_get_url(cl));
+ }
+ yaz_mutex_leave(host->mutex);