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
Omit setting implementationName.
[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
c4d8a8c
..
8f7c44d
100644
(file)
--- a/
src/filter_session_shared.cpp
+++ b/
src/filter_session_shared.cpp
@@
-1,7
+1,5
@@
-/* $Id: filter_session_shared.cpp,v 1.19 2008-01-21 15:23:11 adam Exp $
- Copyright (c) 2005-2007, Index Data.
-
-This file is part of Metaproxy.
+/* This file is part of Metaproxy.
+ Copyright (C) 2005-2008 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
@@
-14,10
+12,9
@@
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
-along with Metaproxy; see the file LICENSE. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
- */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
#include "config.hpp"
#include "config.hpp"
@@
-49,6
+46,7
@@
namespace yf = metaproxy_1::filter;
namespace metaproxy_1 {
namespace filter {
namespace metaproxy_1 {
namespace filter {
+ // key for session.. We'll only share sessions with same InitKey
class SessionShared::InitKey {
public:
bool operator < (const SessionShared::InitKey &k) const;
class SessionShared::InitKey {
public:
bool operator < (const SessionShared::InitKey &k) const;
@@
-56,13
+54,13
@@
namespace metaproxy_1 {
InitKey(const InitKey &);
~InitKey();
private:
InitKey(const InitKey &);
~InitKey();
private:
- InitKey &operator = (const InitKey &k);
char *m_idAuthentication_buf;
int m_idAuthentication_size;
char *m_otherInfo_buf;
int m_otherInfo_size;
ODR m_odr;
};
char *m_idAuthentication_buf;
int m_idAuthentication_size;
char *m_otherInfo_buf;
int m_otherInfo_size;
ODR m_odr;
};
+ // worker thread .. for expiry of sessions
class SessionShared::Worker {
public:
Worker(SessionShared::Rep *rep);
class SessionShared::Worker {
public:
Worker(SessionShared::Rep *rep);
@@
-70,6
+68,7
@@
namespace metaproxy_1 {
private:
SessionShared::Rep *m_p;
};
private:
SessionShared::Rep *m_p;
};
+ // backend result set
class SessionShared::BackendSet {
public:
std::string m_result_set_id;
class SessionShared::BackendSet {
public:
std::string m_result_set_id;
@@
-85,8
+84,10
@@
namespace metaproxy_1 {
bool search(
Package &frontend_package,
const Z_APDU *apdu_req,
bool search(
Package &frontend_package,
const Z_APDU *apdu_req,
- const BackendInstancePtr bp);
+ const BackendInstancePtr bp,
+ bool &fatal_error);
};
};
+ // backend connection instance
class SessionShared::BackendInstance {
friend class Rep;
friend class BackendClass;
class SessionShared::BackendInstance {
friend class Rep;
friend class BackendClass;
@@
-101,6
+102,7
@@
namespace metaproxy_1 {
mp::Package * m_close_package;
~BackendInstance();
};
mp::Package * m_close_package;
~BackendInstance();
};
+ // backends of some class (all with same InitKey)
class SessionShared::BackendClass : boost::noncopyable {
friend class Rep;
friend struct Frontend;
class SessionShared::BackendClass : boost::noncopyable {
friend class Rep;
friend struct Frontend;
@@
-111,7
+113,7
@@
namespace metaproxy_1 {
BackendInstancePtr get_backend(const Package &package);
void use_backend(BackendInstancePtr b);
void release_backend(BackendInstancePtr b);
BackendInstancePtr get_backend(const Package &package);
void use_backend(BackendInstancePtr b);
void release_backend(BackendInstancePtr b);
- void expire();
+ void expire_class();
yazpp_1::GDU m_init_request;
yazpp_1::GDU m_init_response;
boost::mutex m_mutex_backend_class;
yazpp_1::GDU m_init_request;
yazpp_1::GDU m_init_response;
boost::mutex m_mutex_backend_class;
@@
-126,6
+128,7
@@
namespace metaproxy_1 {
int session_ttl);
~BackendClass();
};
int session_ttl);
~BackendClass();
};
+ // frontend result set
class SessionShared::FrontendSet {
Databases m_databases;
yazpp_1::Yaz_Z_Query m_query;
class SessionShared::FrontendSet {
Databases m_databases;
yazpp_1::Yaz_Z_Query m_query;
@@
-137,6
+140,7
@@
namespace metaproxy_1 {
const yazpp_1::Yaz_Z_Query &query);
FrontendSet();
};
const yazpp_1::Yaz_Z_Query &query);
FrontendSet();
};
+ // frontend session
struct SessionShared::Frontend {
Frontend(Rep *rep);
~Frontend();
struct SessionShared::Frontend {
Frontend(Rep *rep);
~Frontend();
@@
-160,6
+164,7
@@
namespace metaproxy_1 {
BackendClassPtr m_backend_class;
FrontendSets m_frontend_sets;
};
BackendClassPtr m_backend_class;
FrontendSets m_frontend_sets;
};
+ // representation
class SessionShared::Rep {
friend class SessionShared;
friend struct Frontend;
class SessionShared::Rep {
friend class SessionShared;
friend struct Frontend;
@@
-273,7
+278,15
@@
void yf::SessionShared::BackendClass::remove_backend(BackendInstancePtr b)
while (it != m_backend_list.end())
{
if (*it == b)
while (it != m_backend_list.end())
{
if (*it == b)
+ {
+ mp::odr odr;
+ (*it)->m_close_package->response() = odr.create_close(
+ 0, Z_Close_lackOfActivity, 0);
+ (*it)->m_close_package->session().close();
+ (*it)->m_close_package->move();
+
it = m_backend_list.erase(it);
it = m_backend_list.erase(it);
+ }
else
it++;
}
else
it++;
}
@@
-479,7
+492,8
@@
yf::SessionShared::BackendSet::BackendSet(
bool yf::SessionShared::BackendSet::search(
mp::Package &frontend_package,
const Z_APDU *frontend_apdu,
bool yf::SessionShared::BackendSet::search(
mp::Package &frontend_package,
const Z_APDU *frontend_apdu,
- const BackendInstancePtr bp)
+ const BackendInstancePtr bp,
+ bool & fatal_error)
{
Package search_package(bp->m_session, frontend_package.origin());
{
Package search_package(bp->m_session, frontend_package.origin());
@@
-503,7
+517,8
@@
bool yf::SessionShared::BackendSet::search(
search_package.request() = apdu_req;
search_package.move();
search_package.request() = apdu_req;
search_package.move();
-
+ fatal_error = false; // assume backend session is good
+
Z_Records *z_records_diag = 0;
Z_GDU *gdu = search_package.response().get();
if (!search_package.session().is_closed()
Z_Records *z_records_diag = 0;
Z_GDU *gdu = search_package.response().get();
if (!search_package.session().is_closed()
@@
-519,11
+534,15
@@
bool yf::SessionShared::BackendSet::search(
}
if (z_records_diag)
{
}
if (z_records_diag)
{
+ // there could be diagnostics that are so bad.. that
+ // we simply mark the error as fatal.. For now we assume
+ // we can resume
if (frontend_apdu->which == Z_APDU_searchRequest)
{
Z_APDU *f_apdu = odr.create_searchResponse(frontend_apdu,
0, 0);
Z_SearchResponse *f_resp = f_apdu->u.searchResponse;
if (frontend_apdu->which == Z_APDU_searchRequest)
{
Z_APDU *f_apdu = odr.create_searchResponse(frontend_apdu,
0, 0);
Z_SearchResponse *f_resp = f_apdu->u.searchResponse;
+ *f_resp->searchStatus = *b_resp->searchStatus;
f_resp->records = z_records_diag;
frontend_package.response() = f_apdu;
return false;
f_resp->records = z_records_diag;
frontend_package.response() = f_apdu;
return false;
@@
-552,6
+571,7
@@
bool yf::SessionShared::BackendSet::search(
f_apdu = odr.create_close(
frontend_apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, 0);
frontend_package.response() = f_apdu;
f_apdu = odr.create_close(
frontend_apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, 0);
frontend_package.response() = f_apdu;
+ fatal_error = true; // weired response.. bad backend
return false;
}
return false;
}
@@
-680,9
+700,13
@@
void yf::SessionShared::Frontend::get_set(mp::Package &package,
// 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));
- if (!new_set->search(package, apdu_req, found_backend))
+ bool fatal_error = false;
+ if (!new_set->search(package, apdu_req, found_backend, fatal_error))
{
{
- bc->remove_backend(found_backend);
+ if (fatal_error)
+ bc->remove_backend(found_backend);
+ else
+ bc->release_backend(found_backend);
return; // search error
}
found_set = new_set;
return; // search error
}
found_set = new_set;
@@
-855,7
+879,7
@@
void yf::SessionShared::Worker::operator() (void)
m_p->expire();
}
m_p->expire();
}
-void yf::SessionShared::BackendClass::expire()
+void yf::SessionShared::BackendClass::expire_class()
{
time_t now;
time(&now);
{
time_t now;
time(&now);
@@
-898,7
+922,7
@@
void yf::SessionShared::Rep::expire()
BackendClassMap::const_iterator b_it = m_backend_map.begin();
for (; b_it != m_backend_map.end(); b_it++)
BackendClassMap::const_iterator b_it = m_backend_map.begin();
for (; b_it != m_backend_map.end(); b_it++)
- b_it->second->expire();
+ b_it->second->expire_class();
}
}
}
}
@@
-1035,7
+1059,7
@@
void yf::SessionShared::process(mp::Package &package) const
m_p->release_frontend(package);
}
m_p->release_frontend(package);
}
-void yf::SessionShared::configure(const xmlNode *ptr)
+void yf::SessionShared::configure(const xmlNode *ptr, bool test_only)
{
for (ptr = ptr->children; ptr; ptr = ptr->next)
{
{
for (ptr = ptr->children; ptr; ptr = ptr->next)
{