* Copyright (c) 1998-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: yaz-proxy.cpp,v 1.51 2003-10-08 08:15:01 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.53 2003-10-08 09:49:05 adam Exp $
*/
#include <assert.h>
return 0;
}
+const char *Yaz_Proxy::load_balance(const char **url)
+{
+ int zurl_in_use[MAX_ZURL_PLEX];
+ Yaz_ProxyClient *c;
+ int i;
+
+ for (i = 0; i<MAX_ZURL_PLEX; i++)
+ zurl_in_use[i] = 0;
+ for (c = m_parent->m_clientPool; c; c = c->m_next)
+ {
+ for (i = 0; url[i]; i++)
+ if (!strcmp(url[i], c->get_hostname()))
+ zurl_in_use[i]++;
+ }
+ int min = 100000;
+ const char *ret = 0;
+ for (i = 0; url[i]; i++)
+ {
+ yaz_log(LOG_DEBUG, "%s zurl=%s use=%d",
+ m_session_str, url[i], zurl_in_use[i]);
+ if (min > zurl_in_use[i])
+ {
+ ret = url[i];
+ min = zurl_in_use[i];
+ }
+ }
+ return ret;
+}
+
Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
{
assert (m_parent);
if (!m_proxyTarget)
{
+ const char *url[MAX_ZURL_PLEX];
const char *proxy_host = get_proxy(oi);
if (proxy_host)
{
proxy_host = m_default_target;
}
- const char *url = 0;
int client_idletime = -1;
- m_config.get_target_info(proxy_host, &url, &m_keepalive, &m_bw_max,
+ m_config.get_target_info(proxy_host, url, &m_keepalive, &m_bw_max,
&m_pdu_max, &m_max_record_retrieve,
&m_target_idletime, &client_idletime,
&parent->m_max_clients);
m_client_idletime = client_idletime;
timeout(m_client_idletime);
}
- if (!url)
+ if (!url[0])
{
yaz_log(LOG_LOG, "%s No default target", m_session_str);
return 0;
}
- m_proxyTarget = (char*) xstrdup(url);
+ // we don't handle multiplexing for cookie session, so we just
+ // pick the first one in this case (anonymous users will be able
+ // to use any backend)
+ if (cookie && *cookie)
+ m_proxyTarget = (char*) xstrdup(url[0]);
+ else
+ m_proxyTarget = (char*) xstrdup(load_balance(url));
}
if (cookie && *cookie)
{
int min_seq = -1;
int no_of_clients = 0;
if (parent->m_clientPool)
- yaz_log (LOG_LOG, "Existing sessions");
+ yaz_log (LOG_DEBUG, "Existing sessions");
for (c = parent->m_clientPool; c; c = c->m_next)
{
- yaz_log (LOG_LOG, " Session %-3d wait=%d %s cookie=%s", c->m_seqno,
+ yaz_log (LOG_DEBUG, " Session %-3d wait=%d %s cookie=%s", c->m_seqno,
c->m_waiting, c->get_hostname(),
c->m_cookie ? c->m_cookie : "");
no_of_clients++;