package.move();
return 0;
}
+
+ int max_sockets = package.origin().get_max_sockets();
+ if (max_sockets == 0)
+ max_sockets = m_max_sockets;
+
+ std::string host;
+
it = m_clients.find(package.session());
if (it != m_clients.end())
{
it->second->m_queue_len++;
- while(true)
+ while (true)
{
#if 0
// double init .. NOT working yet
target = m_default_target;
std::list<std::string> vhosts;
mp::util::remove_vhost_otherinfo(&apdu->u.initRequest->otherInfo,
- vhosts);
+ vhosts);
size_t no_vhosts = vhosts.size();
if (no_vhosts == 1)
{
return 0;
}
}
-
+
std::list<std::string> dblist;
- std::string host;
mp::util::split_zurl(target, host, dblist);
if (dblist.size())
{
; // z3950_client: Databases in vhost ignored
}
+
+ // see if we have reached max number of clients (max-sockets)
- while (m_max_sockets)
+ while (max_sockets)
{
int number = 0;
it = m_clients.begin();
if (!strcmp(as->get_hostname(), host.c_str()))
number++;
}
- if (number < m_max_sockets)
+ yaz_log(YLOG_LOG, "Found %d connections for %s", number, host.c_str());
+ if (number < max_sockets)
break;
boost::xtime xt;
xtime_get(&xt, boost::TIME_UTC);
-
+
xt.sec += 15;
if (!m_cond_session_ready.timed_wait(lock, xt))
{
mp::odr odr;
-
+
package.response() = odr.create_initResponse(
apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "max sessions");
package.session().close();
delete s; // then manager
m_clients.erase(it);
}
+ yaz_log(YLOG_LOG, "Notify all release_assoc");
m_cond_session_ready.notify_all();
}
}
mp::Origin::Origin(std::string listen_host,
unsigned int listen_port)
: m_type(API), m_address(""), m_origin_id(0),
- m_listen_host(listen_host), m_listen_port(listen_port)
+ m_listen_host(listen_host), m_listen_port(listen_port), m_max_sockets(0)
{
}
return m_listen_port;
};
+void mp::Origin::set_max_sockets(int max_sockets)
+{
+ m_max_sockets = max_sockets;
+}
+int mp::Origin::get_max_sockets()
+{
+ return m_max_sockets;
+}
void mp::Origin::set_tcpip_address(std::string addr, unsigned long s)
{
/// set client IP info - left val in assignment
void set_tcpip_address(std::string addr, unsigned long id);
+ /// set max sockets (for outgoing connections to a given target)
+ void set_max_sockets(int max_sockets);
+
+ /// set max sockets (for outgoing connections to a given target)
+ int get_max_sockets();
private:
friend std::ostream&
std::operator<<(std::ostream& os, metaproxy_1::Origin& o);
unsigned int m_origin_id;
std::string m_listen_host;
unsigned int m_listen_port;
+ int m_max_sockets;
};
}