- int max_connections = 30;
- const char *v = session_setting_oneval(client_get_database(cl),
- PZ_MAX_CONNECTIONS);
- if (v && *v)
- max_connections = atoi(v);
-
- // See if someone else has an idle connection
- // We should look at timestamps here to select the longest-idle connection
- yaz_mutex_enter(host->mutex);
- while (1)
- {
- int num_connections = 0;
- for (co = host->connections; co; co = co->next)
- num_connections++;
- for (co = host->connections; co; co = co->next)
- {
- if (connection_is_idle(co) &&
- (!co->client || client_get_state(co->client) == Client_Idle) &&
- !strcmp(ZOOM_connection_option_get(co->link, "user"),
- session_setting_oneval(client_get_database(cl),
- PZ_AUTHENTICATION)))
- {
- if (zproxy == 0 && co->zproxy == 0)
- break;
- if (zproxy && co->zproxy && !strcmp(zproxy, co->zproxy))
- break;
- }
- }
- if (co)
- {
- yaz_log(YLOG_LOG, "num_connections = %d (reusing)",
- num_connections);
- break;
- }
- if (num_connections < max_connections)
- {
- yaz_log(YLOG_LOG, "num_connections = %d (new); max = %d",
- num_connections, max_connections);
- break;
- }
- yaz_log(YLOG_LOG, "num_connections = %d (waiting) max = %d",
- num_connections, max_connections);
- if (yaz_cond_wait(host->cond_ready, host->mutex, abstime))
- {
- yaz_log(YLOG_LOG, "out of connections %s", client_get_url(cl));
- client_set_state(cl, Client_Error);
- yaz_mutex_leave(host->mutex);
- return 0;
- }
- }
- if (co)
- {
- connection_release(co);
- client_set_connection(cl, co);
- co->client = cl;
- /* ensure that connection is only assigned to this client
- by marking the client non Idle */
- client_set_state(cl, Client_Working);
- yaz_mutex_leave(host->mutex);
- co->operation_timeout = operation_timeout;
- co->session_timeout = session_timeout;
- /* tells ZOOM to reconnect if necessary. Disabled becuase
- the ZOOM_connection_connect flushes the task queue */
- ZOOM_connection_connect(co->link, 0, 0);
- }
- else
- {
- yaz_mutex_leave(host->mutex);
- co = connection_create(cl, operation_timeout, session_timeout,
- iochan_man);
- }