X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_session_shared.cpp;h=736ae69e40eb6f0643572366a48de7dca1a0d206;hb=2e63f8129fbd6ff31b322590117c428c1b4afd3d;hp=ac26c47ede86f16316e4824be045957807f0c1b2;hpb=a83814901948c8dc8d6d3da35e413dad5bf03400;p=metaproxy-moved-to-github.git diff --git a/src/filter_session_shared.cpp b/src/filter_session_shared.cpp index ac26c47..736ae69 100644 --- a/src/filter_session_shared.cpp +++ b/src/filter_session_shared.cpp @@ -74,7 +74,7 @@ namespace metaproxy_1 { public: std::string m_result_set_id; Databases m_databases; - int m_result_set_size; + Odr_int m_result_set_size; yazpp_1::Yaz_Z_Query m_query; time_t m_time_last_use; void timestamp(); @@ -195,6 +195,7 @@ namespace metaproxy_1 { int m_resultset_max; int m_session_ttl; bool m_optimize_search; + bool m_restart; int m_session_max; }; } @@ -463,33 +464,42 @@ void yf::SessionShared::Rep::init(mp::Package &package, const Z_GDU *gdu, } } BackendClassPtr bc = frontend->m_backend_class; - BackendInstancePtr backend = bc->get_backend(package); - + BackendInstancePtr backend; mp::odr odr; - if (!backend) + + // we only need to get init response from "first" target in + // backend class - the assumption being that init response is + // same for all + if (bc->m_init_response.get() == 0) { - Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0); - *apdu->u.initResponse->result = 0; - package.response() = apdu; - package.session().close(); + backend = bc->get_backend(package); } - else { boost::mutex::scoped_lock lock(bc->m_mutex_backend_class); - yazpp_1::GDU init_response = bc->m_init_response; - Z_GDU *response_gdu = init_response.get(); - mp::util::transfer_referenceId(odr, gdu->u.z3950, - response_gdu->u.z3950); - - Z_Options *server_options = - response_gdu->u.z3950->u.initResponse->options; - Z_Options *client_options = &frontend->m_init_options; - - int i; - for (i = 0; i<30; i++) - if (!ODR_MASK_GET(client_options, i)) - ODR_MASK_CLEAR(server_options, i); - package.response() = init_response; + if (bc->m_init_response.get() == 0) + { + Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0); + *apdu->u.initResponse->result = 0; + package.response() = apdu; + package.session().close(); + } + else + { + yazpp_1::GDU init_response = bc->m_init_response; + Z_GDU *response_gdu = init_response.get(); + mp::util::transfer_referenceId(odr, gdu->u.z3950, + response_gdu->u.z3950); + + Z_Options *server_options = + response_gdu->u.z3950->u.initResponse->options; + Z_Options *client_options = &frontend->m_init_options; + + int i; + for (i = 0; i < 30; i++) + if (!ODR_MASK_GET(client_options, i)) + ODR_MASK_CLEAR(server_options, i); + package.response() = init_response; + } } if (backend) bc->release_backend(backend); @@ -748,9 +758,10 @@ restart: } } - if (!session_restarted && + if (m_p->m_restart && !session_restarted && condition == YAZ_BIB1_TEMPORARY_SYSTEM_ERROR) { + package.log("session_shared", YLOG_LOG, "restart"); bc->remove_backend(found_backend); session_restarted = true; found_backend.reset(); @@ -782,8 +793,9 @@ restart: return; // search error } } - if (!session_restarted && new_set->m_result_set_size < 0) + if (m_p->m_restart && !session_restarted && new_set->m_result_set_size < 0) { + package.log("session_shared", YLOG_LOG, "restart"); bc->remove_backend(found_backend); session_restarted = true; found_backend.reset(); @@ -825,7 +837,7 @@ void yf::SessionShared::Frontend::search(mp::Package &package, query.set_Z_Query(req->query); Databases databases; int i; - for (i = 0; inum_databaseNames; i++) + for (i = 0; i < req->num_databaseNames; i++) databases.push_back(req->databaseNames[i]); BackendSetPtr found_set; // null @@ -1057,6 +1069,7 @@ yf::SessionShared::Rep::Rep() m_resultset_max = 10; m_session_ttl = 90; m_optimize_search = true; + m_restart = false; m_session_max = 100; } @@ -1219,6 +1232,10 @@ void yf::SessionShared::configure(const xmlNode *ptr, bool test_only, m_p->m_optimize_search = mp::xml::get_bool(attr->children, true); } + else if (!strcmp((const char *) attr->name, "restart")) + { + m_p->m_restart = mp::xml::get_bool(attr->children, true); + } else throw mp::filter::FilterException( "Bad attribute " + std::string((const char *)