projects
/
metaproxy-moved-to-github.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
session_shared: allow max sessions to be given
[metaproxy-moved-to-github.git]
/
src
/
filter_session_shared.cpp
diff --git
a/src/filter_session_shared.cpp
b/src/filter_session_shared.cpp
index
c243dea
..
ac26c47
100644
(file)
--- a/
src/filter_session_shared.cpp
+++ b/
src/filter_session_shared.cpp
@@
-1,5
+1,5
@@
/* This file is part of Metaproxy.
/* This file is part of Metaproxy.
- Copyright (C) 2005-2011 Index Data
+ Copyright (C) 2005-2012 Index Data
Metaproxy 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
Metaproxy 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
@@
-104,6
+104,7
@@
namespace metaproxy_1 {
time_t m_time_last_use;
mp::Package * m_close_package;
~BackendInstance();
time_t m_time_last_use;
mp::Package * m_close_package;
~BackendInstance();
+ void timestamp();
};
// backends of some class (all with same InitKey)
class SessionShared::BackendClass : boost::noncopyable {
};
// backends of some class (all with same InitKey)
class SessionShared::BackendClass : boost::noncopyable {
@@
-161,7
+162,9
@@
namespace metaproxy_1 {
BackendInstancePtr &found_backend,
BackendSetPtr &found_set);
void override_set(BackendInstancePtr &found_backend,
BackendInstancePtr &found_backend,
BackendSetPtr &found_set);
void override_set(BackendInstancePtr &found_backend,
- std::string &result_set_id);
+ std::string &result_set_id,
+ const Databases &databases,
+ bool out_of_sessions);
Rep *m_p;
BackendClassPtr m_backend_class;
Rep *m_p;
BackendClassPtr m_backend_class;
@@
-192,6
+195,7
@@
namespace metaproxy_1 {
int m_resultset_max;
int m_session_ttl;
bool m_optimize_search;
int m_resultset_max;
int m_session_ttl;
bool m_optimize_search;
+ int m_session_max;
};
}
}
};
}
}
@@
-331,10
+335,15
@@
yf::SessionShared::BackendClass::get_backend(
void yf::SessionShared::BackendClass::use_backend(BackendInstancePtr backend)
{
backend->m_in_use = true;
void yf::SessionShared::BackendClass::use_backend(BackendInstancePtr backend)
{
backend->m_in_use = true;
- time(&backend->m_time_last_use);
backend->m_sequence_this = m_sequence_top++;
}
backend->m_sequence_this = m_sequence_top++;
}
+void yf::SessionShared::BackendInstance::timestamp()
+{
+ assert(m_in_use);
+ time(&m_time_last_use);
+}
+
yf::SessionShared::BackendInstance::~BackendInstance()
{
delete m_close_package;
yf::SessionShared::BackendInstance::~BackendInstance()
{
delete m_close_package;
@@
-528,6
+537,10
@@
bool yf::SessionShared::BackendSet::search(
for (; it != m_databases.end(); it++)
req->databaseNames[i++] = odr_strdup(odr, it->c_str());
for (; it != m_databases.end(); it++)
req->databaseNames[i++] = odr_strdup(odr, it->c_str());
+ if (frontend_apdu->which == Z_APDU_searchRequest)
+ req->preferredRecordSyntax =
+ frontend_apdu->u.searchRequest->preferredRecordSyntax;
+
search_package.request() = apdu_req;
search_package.move();
search_package.request() = apdu_req;
search_package.move();
@@
-558,13
+571,16
@@
bool yf::SessionShared::BackendSet::search(
void yf::SessionShared::Frontend::override_set(
BackendInstancePtr &found_backend,
void yf::SessionShared::Frontend::override_set(
BackendInstancePtr &found_backend,
- std::string &result_set_id)
+ std::string &result_set_id,
+ const Databases &databases,
+ bool out_of_sessions)
{
BackendClassPtr bc = m_backend_class;
BackendInstanceList::const_iterator it = bc->m_backend_list.begin();
time_t now;
time(&now);
{
BackendClassPtr bc = m_backend_class;
BackendInstanceList::const_iterator it = bc->m_backend_list.begin();
time_t now;
time(&now);
-
+
+ size_t max_sets = bc->m_named_result_sets ? bc->m_backend_set_max : 1;
for (; it != bc->m_backend_list.end(); it++)
{
if (!(*it)->m_in_use)
for (; it != bc->m_backend_list.end(); it++)
{
if (!(*it)->m_in_use)
@@
-572,8
+588,11
@@
void yf::SessionShared::Frontend::override_set(
BackendSetList::iterator set_it = (*it)->m_sets.begin();
for (; set_it != (*it)->m_sets.end(); set_it++)
{
BackendSetList::iterator set_it = (*it)->m_sets.begin();
for (; set_it != (*it)->m_sets.end(); set_it++)
{
- if (now >= (*set_it)->m_time_last_use &&
- now - (*set_it)->m_time_last_use > bc->m_backend_set_ttl)
+ if ((max_sets > 1 || (*set_it)->m_databases == databases)
+ &&
+ (out_of_sessions ||
+ now < (*set_it)->m_time_last_use ||
+ now - (*set_it)->m_time_last_use >= bc->m_backend_set_ttl))
{
found_backend = *it;
result_set_id = (*set_it)->m_result_set_id;
{
found_backend = *it;
result_set_id = (*set_it)->m_result_set_id;
@@
-583,7
+602,6
@@
void yf::SessionShared::Frontend::override_set(
}
}
}
}
}
}
- size_t max_sets = bc->m_named_result_sets ? bc->m_backend_set_max : 1;
for (it = bc->m_backend_list.begin(); it != bc->m_backend_list.end(); it++)
{
if (!(*it)->m_in_use && (*it)->m_sets.size() < max_sets)
for (it = bc->m_backend_list.begin(); it != bc->m_backend_list.end(); it++)
{
if (!(*it)->m_in_use && (*it)->m_sets.size() < max_sets)
@@
-614,9
+632,13
@@
void yf::SessionShared::Frontend::get_set(mp::Package &package,
restart:
std::string result_set_id;
restart:
std::string result_set_id;
+ bool out_of_sessions = false;
BackendClassPtr bc = m_backend_class;
{
boost::mutex::scoped_lock lock(bc->m_mutex_backend_class);
BackendClassPtr bc = m_backend_class;
{
boost::mutex::scoped_lock lock(bc->m_mutex_backend_class);
+
+ if ((int) bc->m_backend_list.size() >= m_p->m_session_max)
+ out_of_sessions = true;
if (m_p->m_optimize_search)
{
if (m_p->m_optimize_search)
{
@@
-643,33
+665,38
@@
restart:
}
}
}
}
}
}
- override_set(found_backend, result_set_id);
+ override_set(found_backend, result_set_id, databases, out_of_sessions);
if (found_backend)
bc->use_backend(found_backend);
}
if (!found_backend)
{
if (found_backend)
bc->use_backend(found_backend);
}
if (!found_backend)
{
- // create a new backend set (and new set)
- found_backend = bc->create_backend(package);
+ // create a new backend set (and new set) if we're not out of sessions
+ if (!out_of_sessions)
+ found_backend = bc->create_backend(package);
if (!found_backend)
{
Z_APDU *f_apdu = 0;
mp::odr odr;
if (!found_backend)
{
Z_APDU *f_apdu = 0;
mp::odr odr;
+ const char *addinfo = 0;
+
+ if (out_of_sessions)
+ addinfo = "session_shared: all sessions in use";
if (apdu_req->which == Z_APDU_searchRequest)
{
f_apdu = odr.create_searchResponse(
if (apdu_req->which == Z_APDU_searchRequest)
{
f_apdu = odr.create_searchResponse(
- apdu_req, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, 0);
+ apdu_req, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, addinfo);
}
else if (apdu_req->which == Z_APDU_presentRequest)
{
f_apdu = odr.create_presentResponse(
}
else if (apdu_req->which == Z_APDU_presentRequest)
{
f_apdu = odr.create_presentResponse(
- apdu_req, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, 0);
+ apdu_req, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, addinfo);
}
else
{
f_apdu = odr.create_close(
}
else
{
f_apdu = odr.create_close(
- apdu_req, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, 0);
+ apdu_req, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, addinfo);
}
package.response() = f_apdu;
return;
}
package.response() = f_apdu;
return;
@@
-683,6
+710,8
@@
restart:
else
result_set_id = "default";
}
else
result_set_id = "default";
}
+ found_backend->timestamp();
+
// we must search ...
BackendSetPtr new_set(new BackendSet(result_set_id,
databases, query));
// we must search ...
BackendSetPtr new_set(new BackendSet(result_set_id,
databases, query));
@@
-877,6
+906,8
@@
void yf::SessionShared::Frontend::present(mp::Package &package,
bc->release_backend(found_backend);
return;
}
bc->release_backend(found_backend);
return;
}
+
+ found_backend->timestamp();
Z_APDU *p_apdu = zget_APDU(odr, Z_APDU_presentRequest);
Z_PresentRequest *p_req = p_apdu->u.presentRequest;
Z_APDU *p_apdu = zget_APDU(odr, Z_APDU_presentRequest);
Z_PresentRequest *p_req = p_apdu->u.presentRequest;
@@
-950,6
+981,7
@@
void yf::SessionShared::Frontend::scan(mp::Package &frontend_package,
else
{
Package scan_package(backend->m_session, frontend_package.origin());
else
{
Package scan_package(backend->m_session, frontend_package.origin());
+ backend->timestamp();
scan_package.copy_filter(frontend_package);
scan_package.request() = apdu_req;
scan_package.move();
scan_package.copy_filter(frontend_package);
scan_package.request() = apdu_req;
scan_package.move();
@@
-987,8
+1019,7
@@
void yf::SessionShared::BackendClass::expire_class()
{
bit++;
}
{
bit++;
}
- else if ((now >= last_use && now - last_use > m_backend_expiry_ttl)
- || (now < last_use))
+ else if (now < last_use || now - last_use > m_backend_expiry_ttl)
{
mp::odr odr;
(*bit)->m_close_package->response() = odr.create_close(
{
mp::odr odr;
(*bit)->m_close_package->response() = odr.create_close(
@@
-1011,7
+1042,7
@@
void yf::SessionShared::Rep::expire()
{
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
{
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
- xt.sec += 30;
+ xt.sec += m_session_ttl / 3;
boost::thread::sleep(xt);
BackendClassMap::const_iterator b_it = m_backend_map.begin();
boost::thread::sleep(xt);
BackendClassMap::const_iterator b_it = m_backend_map.begin();
@@
-1026,6
+1057,7
@@
yf::SessionShared::Rep::Rep()
m_resultset_max = 10;
m_session_ttl = 90;
m_optimize_search = true;
m_resultset_max = 10;
m_session_ttl = 90;
m_optimize_search = true;
+ m_session_max = 100;
}
void yf::SessionShared::Rep::start()
}
void yf::SessionShared::Rep::start()
@@
-1200,7
+1232,10
@@
void yf::SessionShared::configure(const xmlNode *ptr, bool test_only,
{
if (!strcmp((const char *) attr->name, "ttl"))
m_p->m_session_ttl =
{
if (!strcmp((const char *) attr->name, "ttl"))
m_p->m_session_ttl =
- mp::xml::get_int(attr->children, 120);
+ mp::xml::get_int(attr->children, 90);
+ else if (!strcmp((const char *) attr->name, "max"))
+ m_p->m_session_max =
+ mp::xml::get_int(attr->children, 100);
else
throw mp::filter::FilterException(
"Bad attribute " + std::string((const char *)
else
throw mp::filter::FilterException(
"Bad attribute " + std::string((const char *)