X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffilter_session_shared.cpp;h=8f7c44dc0bfdb7b8e1f2b98927c89a4350bf761f;hb=516b4a41888fccdb4dca00f625adf6dd00350f5d;hp=bada836451ce5ed89698d1b98428d66a15061de8;hpb=85189f2d04df4cfc8b16ee78187fb89d00dfe3ff;p=metaproxy-moved-to-github.git diff --git a/src/filter_session_shared.cpp b/src/filter_session_shared.cpp index bada836..8f7c44d 100644 --- a/src/filter_session_shared.cpp +++ b/src/filter_session_shared.cpp @@ -1,7 +1,5 @@ -/* $Id: filter_session_shared.cpp,v 1.20 2008-02-20 15:07:52 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 @@ -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 -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" @@ -49,6 +46,7 @@ namespace yf = metaproxy_1::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; @@ -56,13 +54,13 @@ namespace metaproxy_1 { 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; }; + // worker thread .. for expiry of sessions class SessionShared::Worker { public: Worker(SessionShared::Rep *rep); @@ -70,6 +68,7 @@ namespace metaproxy_1 { private: SessionShared::Rep *m_p; }; + // backend result set 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, - const BackendInstancePtr bp); + const BackendInstancePtr bp, + bool &fatal_error); }; + // backend connection instance class SessionShared::BackendInstance { friend class Rep; friend class BackendClass; @@ -101,6 +102,7 @@ namespace metaproxy_1 { 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; @@ -111,7 +113,7 @@ namespace metaproxy_1 { 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; @@ -126,6 +128,7 @@ namespace metaproxy_1 { int session_ttl); ~BackendClass(); }; + // frontend result set 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(); }; + // frontend session struct SessionShared::Frontend { Frontend(Rep *rep); ~Frontend(); @@ -160,6 +164,7 @@ namespace metaproxy_1 { BackendClassPtr m_backend_class; FrontendSets m_frontend_sets; }; + // representation 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) + { + 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); + } else it++; } @@ -479,7 +492,8 @@ yf::SessionShared::BackendSet::BackendSet( 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()); @@ -503,7 +517,8 @@ bool yf::SessionShared::BackendSet::search( 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() @@ -519,11 +534,15 @@ bool yf::SessionShared::BackendSet::search( } 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; + *f_resp->searchStatus = *b_resp->searchStatus; 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; + fatal_error = true; // weired response.. bad backend 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)); - 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; @@ -855,7 +879,7 @@ void yf::SessionShared::Worker::operator() (void) m_p->expire(); } -void yf::SessionShared::BackendClass::expire() +void yf::SessionShared::BackendClass::expire_class() { 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++) - b_it->second->expire(); + b_it->second->expire_class(); } }