+ // 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){
+
+ // 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());
+ }
+ // any other Z39.50 package is removed from statistics
+ 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){
+ 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
+//boost::posix_time::ptime receive_time
+// = boost::posix_time::microsec_clock::local_time();
+// //<< receive_time << " "
+// //<< to_iso_string(receive_time) << " "
+//<< to_iso_extended_string(receive_time) << " "
+
+
+// statistic manipulating functions,
+void yf::LoadBalance::Impl::add_dead(unsigned long session_id){
+
+
+ std::string target = find_session_target(session_id);
+
+ 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 += 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){
+
+ std::string target = find_session_target(session_id);
+
+ 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
+ < std::numeric_limits<unsigned int>::max()){
+ itarg->second.packages += 1;
+ std::cout << "add_package " << session_id << " " << target
+ << " p:" << itarg->second.packages << "\n";
+ }
+ }
+};
+
+void yf::LoadBalance::Impl::remove_package(unsigned long session_id){
+ std::string target = find_session_target(session_id);
+
+ 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 -= 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){
+
+ // 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()){
+ 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()){
+ 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));
+ std::cout << "add_session " << session_id << " " << target
+ << " s:1\n";
+ }
+ else if (itarg->second.sessions < std::numeric_limits<unsigned int>::max())
+ {
+ itarg->second.sessions += 1;
+ std::cout << "add_session " << session_id << " " << target
+ << " s:" << itarg->second.sessions << "\n";
+ }
+};