namespace mp = metaproxy_1;
namespace yf = mp::filter;
-namespace metaproxy_1 {
- namespace filter {
- class LoadBalance::Impl {
+namespace metaproxy_1
+{
+ namespace filter
+ {
+ class LoadBalance::Impl
+ {
public:
Impl();
~Impl();
}
-// define Implementation stuff
-
-
-
yf::LoadBalance::Impl::Impl()
{
}
bool is_closed_back = false;
// checking for closed front end packages
- if (package.session().is_closed()){
+ if (package.session().is_closed())
+ {
is_closed_front = true;
}
Z_GDU *gdu_req = package.request().get();
// passing anything but z3950 packages
- if (gdu_req && gdu_req->which == Z_GDU_Z3950){
-
+ if (gdu_req && gdu_req->which == Z_GDU_Z3950)
+ {
// target selecting only on Z39.50 init request
- if (gdu_req->u.z3950->which == Z_APDU_initRequest){
-
+ if (gdu_req->u.z3950->which == Z_APDU_initRequest)
+ {
mp::odr odr_en(ODR_ENCODE);
Z_InitRequest *org_init = gdu_req->u.z3950->u.initRequest;
// choosing one target according to load-balancing algorithm
- if (vhosts.size()){
+ if (vhosts.size())
+ {
std::string target;
unsigned int cost = std::numeric_limits<unsigned int>::max();
-
{ //locking scope for local databases
boost::mutex::scoped_lock scoped_lock(m_mutex);
// load-balancing algorithm goes here
//target = *vhosts.begin();
- for(std::list<std::string>::const_iterator ivh
- = vhosts.begin();
- ivh != vhosts.end();
- ivh++){
- if ((*ivh).size() != 0){
+ for (std::list<std::string>::const_iterator ivh
+ = vhosts.begin();
+ ivh != vhosts.end();
+ ivh++)
+ {
+ if ((*ivh).size() != 0)
+ {
unsigned int vhcost
= yf::LoadBalance::Impl::cost(*ivh);
- if (cost > vhcost){
+ if (cost > vhcost)
+ {
cost = vhcost;
target = *ivh;
}
mp::util::set_vhost_otherinfo(&(org_init->otherInfo),
odr_en, target, 1);
package.request() = gdu_req;
- }
-
+ }
}
// frontend Z39.50 close request is added to statistics and marked
- else if (gdu_req->u.z3950->which == Z_APDU_close){
+ else if (gdu_req->u.z3950->which == Z_APDU_close)
+ {
is_closed_front = true;
boost::mutex::scoped_lock scoped_lock(m_mutex);
add_package(package.session().id());
}
// any other Z39.50 package is added to statistics
- else {
+ else
+ {
boost::mutex::scoped_lock scoped_lock(m_mutex);
add_package(package.session().id());
}
// moving all package types
package.move();
-
// checking for closed back end packages
if (package.session().is_closed())
is_closed_back = true;
Z_GDU *gdu_res = package.response().get();
// passing anything but z3950 packages
- if (gdu_res && gdu_res->which == Z_GDU_Z3950){
-
+ if (gdu_res && gdu_res->which == Z_GDU_Z3950)
+ {
// session closing only on Z39.50 close response
- if (gdu_res->u.z3950->which == Z_APDU_close){
+ 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());
}
// any other Z39.50 package is removed from statistics
- else {
+ else
+ {
boost::mutex::scoped_lock scoped_lock(m_mutex);
remove_package(package.session().id());
}
}
// finally removing sessions and marking deads
- if (is_closed_back || is_closed_front){
+ if (is_closed_back || is_closed_front)
+ {
boost::mutex::scoped_lock scoped_lock(m_mutex);
// marking backend dead if backend closed without fronted close
}
// statistic manipulating functions,
-void yf::LoadBalance::Impl::add_dead(unsigned long session_id){
-
-
+void yf::LoadBalance::Impl::add_dead(unsigned long session_id)
+{
std::string target = find_session_target(session_id);
- if (target.size() != 0){
+ if (target.size() != 0)
+ {
std::map<std::string, TargetStat>::iterator itarg;
itarg = m_target_stat.find(target);
if (itarg != m_target_stat.end()
- && itarg->second.deads < std::numeric_limits<unsigned int>::max()){
+ && itarg->second.deads < std::numeric_limits<unsigned int>::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){
// std::cout << "clear_dead " << session_id << "\n";
//};
-void yf::LoadBalance::Impl::add_package(unsigned long session_id){
-
+void yf::LoadBalance::Impl::add_package(unsigned long session_id)
+{
std::string target = find_session_target(session_id);
- if (target.size() != 0){
+ if (target.size() != 0)
+ {
std::map<std::string, TargetStat>::iterator itarg;
itarg = m_target_stat.find(target);
if (itarg != m_target_stat.end()
// << " p:" << itarg->second.packages << "\n";
}
}
-};
+}
-void yf::LoadBalance::Impl::remove_package(unsigned long session_id){
+void yf::LoadBalance::Impl::remove_package(unsigned long session_id)
+{
std::string target = find_session_target(session_id);
- if (target.size() != 0){
+ if (target.size() != 0)
+ {
std::map<std::string, TargetStat>::iterator itarg;
itarg = m_target_stat.find(target);
if (itarg != m_target_stat.end()
- && itarg->second.packages > 0){
+ && itarg->second.packages > 0)
+ {
itarg->second.packages -= 1;
// std:.cout << "remove_package " << session_id << " " << target
// << " p:" << itarg->second.packages << "\n";
}
}
-};
+}
void yf::LoadBalance::Impl::add_session(unsigned long session_id,
- std::string target){
-
+ std::string target)
+{
// finding and adding session
std::map<unsigned long, std::string>::iterator isess;
isess = m_session_target.find(session_id);
- if (isess == m_session_target.end()){
+ if (isess == m_session_target.end())
+ {
m_session_target.insert(std::make_pair(session_id, target));
}
// finding and adding target statistics
std::map<std::string, TargetStat>::iterator itarg;
itarg = m_target_stat.find(target);
- if (itarg == m_target_stat.end()){
+ if (itarg == m_target_stat.end())
+ {
TargetStat stat;
stat.sessions = 1;
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));
+ m_target_stat.insert(std::make_pair(target, stat));
// std:.cout << "add_session " << session_id << " " << target
// << " s:1\n";
}
// std:.cout << "add_session " << session_id << " " << target
// << " s:" << itarg->second.sessions << "\n";
}
-};
-
-void yf::LoadBalance::Impl::remove_session(unsigned long session_id){
+}
+void yf::LoadBalance::Impl::remove_session(unsigned long session_id)
+{
std::string target;
// finding session
// finding target statistics
std::map<std::string, TargetStat>::iterator itarg;
itarg = m_target_stat.find(target);
- if (itarg == m_target_stat.end()){
+ if (itarg == m_target_stat.end())
+ {
m_session_target.erase(isess);
return;
}
// << " s:" << itarg->second.sessions << "\n";
// clearing empty sessions and targets
- if (itarg->second.sessions == 0 && itarg->second.deads == 0 ){
+ if (itarg->second.sessions == 0 && itarg->second.deads == 0 )
+ {
m_target_stat.erase(itarg);
m_session_target.erase(isess);
}
-};
-
-std::string
-yf::LoadBalance::Impl::find_session_target(unsigned long session_id){
+}
+std::string yf::LoadBalance::Impl::find_session_target(unsigned long session_id)
+{
std::string target;
std::map<unsigned long, std::string>::iterator isess;
isess = m_session_target.find(session_id);
// cost functions
-unsigned int yf::LoadBalance::Impl::cost(std::string target){
-
+unsigned int yf::LoadBalance::Impl::cost(std::string target)
+{
unsigned int cost;
if (target.size() != 0){
//std::cout << "cost " << target << " c:" << cost << "\n";
return cost;
-};
-
-unsigned int yf::LoadBalance::Impl::dead(std::string target){
+}
+unsigned int yf::LoadBalance::Impl::dead(std::string target)
+{
unsigned int dead;
if (target.size() != 0){
//std::cout << "dead " << target << " d:" << dead << "\n";
return dead;
-};
-
-
+}
static mp::filter::Base* filter_creator()