1 /* $Id: filter_load_balance.cpp,v 1.1 2007-01-02 15:35:36 marc Exp $
2 Copyright (c) 2005-2006, Index Data.
4 See the LICENSE file for details
9 #include "filter_load_balance.hpp"
10 #include "package.hpp"
13 #include <boost/thread/mutex.hpp>
14 #include <boost/date_time/posix_time/posix_time.hpp>
20 namespace mp = metaproxy_1;
21 namespace yf = mp::filter;
23 namespace metaproxy_1 {
25 class LoadBalance::Impl {
29 void process(metaproxy_1::Package & package);
30 void configure(const xmlNode * ptr);
37 // define Pimpl wrapper forwarding to Impl
39 yf::LoadBalance::LoadBalance() : m_p(new Impl)
43 yf::LoadBalance::~LoadBalance()
44 { // must have a destructor because of boost::scoped_ptr
47 void yf::LoadBalance::configure(const xmlNode *xmlnode)
49 m_p->configure(xmlnode);
52 void yf::LoadBalance::process(mp::Package &package) const
54 m_p->process(package);
58 // define Implementation stuff
62 yf::LoadBalance::Impl::Impl()
66 yf::LoadBalance::Impl::~Impl()
70 void yf::LoadBalance::Impl::configure(const xmlNode *xmlnode)
74 void yf::LoadBalance::Impl::process(mp::Package &package)
76 Z_GDU *gdu_req = package.request().get();
79 // passing anything but z3950 packages
81 || !(gdu_req->which == Z_GDU_Z3950))
88 // target selecting only on Z39.50 init request
89 if (gdu_req->u.z3950->which == Z_APDU_initRequest){
91 mp::odr odr_en(ODR_ENCODE);
92 Z_InitRequest *org_init = gdu_req->u.z3950->u.initRequest;
94 // extracting virtual hosts
95 std::list<std::string> vhosts;
97 mp::util::remove_vhost_otherinfo(&(org_init->otherInfo), vhosts);
99 //std::cout << "LoadBalance::Impl::process() vhosts: "
100 // << vhosts.size() << "\n";
101 //std::cout << "LoadBalance::Impl::process()" << *gdu_req << "\n";
103 // choosing one target according to load-balancing algorithm
108 // getting timestamp for receiving of package
109 boost::posix_time::ptime receive_time
110 = boost::posix_time::microsec_clock::local_time();
112 // //<< receive_time << " "
113 // //<< to_iso_string(receive_time) << " "
114 //<< to_iso_extended_string(receive_time) << " "
115 // package.session().id();
117 { // scope for locking local target database
118 boost::mutex::scoped_lock scoped_lock(m_mutex);
119 target = *vhosts.begin();
123 // copying new target into init package
124 mp::util::set_vhost_otherinfo(&(org_init->otherInfo), odr_en, target);
125 package.request() = gdu_req;
131 // moving all Z39.50 package typess
136 //boost::posix_time::ptime send_time
137 // = boost::posix_time::microsec_clock::local_time();
139 //boost::posix_time::time_duration duration = send_time - receive_time;
142 // { // scope for locking local target database
143 // boost::mutex::scoped_lock scoped_lock(m_mutex);
144 // target = *vhosts.begin();
151 static mp::filter::Base* filter_creator()
153 return new mp::filter::LoadBalance;
157 struct metaproxy_1_filter_struct metaproxy_1_filter_load_balance = {
168 * indent-tabs-mode: nil
169 * c-file-style: "stroustrup"
171 * vim: shiftwidth=4 tabstop=8 expandtab