X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ffilter_load_balance.cpp;h=86859713e36d097f03daff2a895a6f26af37ebcc;hb=0ab6e8aba7de1ea5cf109de175f56c9d8f7f49bc;hp=64536f2d76713d1e172084ae7b76d6104f424eec;hpb=66d4ec677bbc06aa9be29ab2e5fa2bec7442a7fa;p=metaproxy-moved-to-github.git diff --git a/src/filter_load_balance.cpp b/src/filter_load_balance.cpp index 64536f2..8685971 100644 --- a/src/filter_load_balance.cpp +++ b/src/filter_load_balance.cpp @@ -1,7 +1,22 @@ -/* $Id: filter_load_balance.cpp,v 1.2 2007-01-03 15:03:55 marc Exp $ - Copyright (c) 2005-2006, Index Data. +/* $Id: filter_load_balance.cpp,v 1.8 2007-05-09 21:23:09 adam Exp $ + Copyright (c) 2005-2007, Index Data. - See the LICENSE file for details +This file is part of Metaproxy. + +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 +Software Foundation; either version 2, or (at your option) any later +version. + +Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +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. */ #include "config.hpp" @@ -11,12 +26,18 @@ #include "filter_load_balance.hpp" #include "util.hpp" + #include #include #include -#include +// remove max macro if already defined (defined later in ) +#ifdef max +#undef max +#endif + +//#include #include #include #include @@ -54,11 +75,11 @@ namespace metaproxy_1 { unsigned int deads; unsigned int cost() { unsigned int c = sessions + packages + deads; - std::cout << "cost c:" << c - << " s:" << sessions - << " p:" << packages - << " d:" << deads - <<"\n"; + //std::cout << "stats c:" << c + // << " s:" << sessions + // << " p:" << packages + // << " d:" << deads + // <<"\n"; return c; } }; @@ -112,6 +133,7 @@ void yf::LoadBalance::Impl::process(mp::Package &package) { bool is_closed_front = false; + bool is_closed_back = false; // checking for closed front end packages if (package.session().is_closed()){ @@ -190,15 +212,8 @@ void yf::LoadBalance::Impl::process(mp::Package &package) // checking for closed back end packages - if (package.session().is_closed()) { - boost::mutex::scoped_lock scoped_lock(m_mutex); - - // marking backend dead if backend closed without fronted close - if (is_closed_front == false) - add_dead(package.session().id()); - - remove_session(package.session().id()); - } + if (package.session().is_closed()) + is_closed_back = true; Z_GDU *gdu_res = package.response().get(); @@ -207,14 +222,9 @@ void yf::LoadBalance::Impl::process(mp::Package &package) // session closing only on Z39.50 close response if (gdu_res->u.z3950->which == Z_APDU_close){ + is_closed_back = true; boost::mutex::scoped_lock scoped_lock(m_mutex); remove_package(package.session().id()); - - // marking backend dead if backend closed without fronted close - if (is_closed_front == false) - add_dead(package.session().id()); - - //remove_session(package.session().id()); } // any other Z39.50 package is removed from statistics else { @@ -222,6 +232,20 @@ void yf::LoadBalance::Impl::process(mp::Package &package) remove_package(package.session().id()); } } + + // finally removing sessions and marking deads + if (is_closed_back || is_closed_front){ + boost::mutex::scoped_lock scoped_lock(m_mutex); + + // marking backend dead if backend closed without fronted close + if (is_closed_front == false) + add_dead(package.session().id()); + + remove_session(package.session().id()); + + // making sure that package is closed + package.session().close(); + } } // getting timestamp for receiving of package @@ -235,9 +259,19 @@ void yf::LoadBalance::Impl::process(mp::Package &package) // statistic manipulating functions, void yf::LoadBalance::Impl::add_dead(unsigned long session_id){ + std::string target = find_session_target(session_id); - std::cout << "add_dead " << session_id << "\n"; + if (target.size() != 0){ + std::map::iterator itarg; + itarg = m_target_stat.find(target); + if (itarg != m_target_stat.end() + && itarg->second.deads < std::numeric_limits::max()){ + itarg->second.deads += 1; + // std:.cout << "add_dead " << session_id << " " << target + // << " d:" << itarg->second.deads << "\n"; + } + } }; //void yf::LoadBalance::Impl::clear_dead(unsigned long session_id){ @@ -251,10 +285,12 @@ void yf::LoadBalance::Impl::add_package(unsigned long session_id){ if (target.size() != 0){ std::map::iterator itarg; itarg = m_target_stat.find(target); - if (itarg != m_target_stat.end()){ + if (itarg != m_target_stat.end() + && itarg->second.packages + < std::numeric_limits::max()){ itarg->second.packages += 1; - std::cout << "add_package " << session_id << " " << target - << " p:" << itarg->second.packages << "\n"; + // std:.cout << "add_package " << session_id << " " << target + // << " p:" << itarg->second.packages << "\n"; } } }; @@ -265,10 +301,11 @@ void yf::LoadBalance::Impl::remove_package(unsigned long session_id){ if (target.size() != 0){ std::map::iterator itarg; itarg = m_target_stat.find(target); - if (itarg != m_target_stat.end()){ + if (itarg != m_target_stat.end() + && itarg->second.packages > 0){ itarg->second.packages -= 1; - std::cout << "remove_package " << session_id << " " << target - << " p:" << itarg->second.packages << "\n"; + // std:.cout << "remove_package " << session_id << " " << target + // << " p:" << itarg->second.packages << "\n"; } } }; @@ -289,16 +326,18 @@ void yf::LoadBalance::Impl::add_session(unsigned long session_id, if (itarg == m_target_stat.end()){ TargetStat stat; stat.sessions = 1; - m_target_stat.insert(std::make_pair(target, stat)); - std::cout << "add_session " << session_id << " " << target - << " s:1\n"; - } else { + stat.packages = 0; // no idea why the defaut constructor TargetStat() + stat.deads = 0; // is not initializig this correctly to zero ?? + m_target_stat.insert(std::make_pair(target, stat)); + // std:.cout << "add_session " << session_id << " " << target + // << " s:1\n"; + } + else if (itarg->second.sessions < std::numeric_limits::max()) + { itarg->second.sessions += 1; - std::cout << "add_session " << session_id << " " << target - << " s:" << itarg->second.sessions << "\n"; + // std:.cout << "add_session " << session_id << " " << target + // << " s:" << itarg->second.sessions << "\n"; } - - }; void yf::LoadBalance::Impl::remove_session(unsigned long session_id){ @@ -322,13 +361,14 @@ void yf::LoadBalance::Impl::remove_session(unsigned long session_id){ } // counting session down - itarg->second.sessions -= 1; + if (itarg->second.sessions > 0) + itarg->second.sessions -= 1; - std::cout << "remove_session " << session_id << " " << target - << " s:" << itarg->second.sessions << "\n"; + // std:.cout << "remove_session " << session_id << " " << target + // << " s:" << itarg->second.sessions << "\n"; // clearing empty sessions and targets - if (itarg->second.sessions == 0){ + if (itarg->second.sessions == 0 && itarg->second.deads == 0 ){ m_target_stat.erase(itarg); m_session_target.erase(isess); } @@ -359,13 +399,24 @@ unsigned int yf::LoadBalance::Impl::cost(std::string target){ } } - std::cout << "cost " << target << " c:" << cost << "\n"; + //std::cout << "cost " << target << " c:" << cost << "\n"; return cost; }; unsigned int yf::LoadBalance::Impl::dead(std::string target){ - std::cout << "dead " << target << "\n"; - return 0; + + unsigned int dead; + + if (target.size() != 0){ + std::map::iterator itarg; + itarg = m_target_stat.find(target); + if (itarg != m_target_stat.end()){ + dead = itarg->second.deads; + } + } + + //std::cout << "dead " << target << " d:" << dead << "\n"; + return dead; };