metaproxy  1.21.0
Public Member Functions | Private Member Functions | Private Attributes | Friends | List of all members
metaproxy_1::filter::SessionShared::Rep Class Reference
Collaboration diagram for metaproxy_1::filter::SessionShared::Rep:
Collaboration graph

Public Member Functions

 ~Rep ()
 
void expire ()
 

Private Member Functions

FrontendPtr get_frontend (Package &package)
 
void release_frontend (Package &package)
 
 Rep ()
 
void expire_classes ()
 
void stat ()
 
void init (Package &package, const Z_GDU *gdu, FrontendPtr frontend)
 
void start ()
 

Private Attributes

boost::mutex m_mutex
 
boost::condition m_cond_session_ready
 
boost::condition m_cond_expire_ready
 
std::map< mp::Session, FrontendPtrm_clients
 
BackendClassMap m_backend_map
 
boost::mutex m_mutex_backend_map
 
boost::thread_group m_thrds
 
int m_resultset_ttl
 
int m_resultset_max
 
int m_session_ttl
 
bool m_optimize_search
 
bool m_restart
 
bool m_ignore_auth
 
int m_session_max
 
Odr_int m_preferredMessageSize
 
Odr_int m_maximumRecordSize
 
bool close_down
 

Friends

class SessionShared
 
struct Frontend
 

Detailed Description

Definition at line 195 of file filter_session_shared.cpp.

Constructor & Destructor Documentation

◆ Rep()

mp::filter::SessionShared::Rep::Rep ( )
private

Definition at line 1394 of file filter_session_shared.cpp.

◆ ~Rep()

mp::filter::SessionShared::Rep::~Rep ( )

Definition at line 1408 of file filter_session_shared.cpp.

1409 {
1410  {
1411  boost::mutex::scoped_lock lock(m_mutex);
1412  close_down = true;
1413  m_cond_expire_ready.notify_all();
1414  }
1415  m_thrds.join_all();
1416 }

Member Function Documentation

◆ expire()

void mp::filter::SessionShared::Rep::expire ( )

Definition at line 1370 of file filter_session_shared.cpp.

1371 {
1372  while (true)
1373  {
1374  boost::xtime xt;
1375  boost::xtime_get(&xt,
1376 #if BOOST_VERSION >= 105000
1377  boost::TIME_UTC_
1378 #else
1379  boost::TIME_UTC
1380 #endif
1381  );
1382  xt.sec += m_session_ttl;
1383  {
1384  boost::mutex::scoped_lock lock(m_mutex);
1385  m_cond_expire_ready.timed_wait(lock, xt);
1386  if (close_down)
1387  break;
1388  }
1389  stat();
1390  expire_classes();
1391  }
1392 }

◆ expire_classes()

void mp::filter::SessionShared::Rep::expire_classes ( )
private

Definition at line 1354 of file filter_session_shared.cpp.

1355 {
1356  boost::mutex::scoped_lock lock(m_mutex_backend_map);
1357  BackendClassMap::iterator b_it = m_backend_map.begin();
1358  while (b_it != m_backend_map.end())
1359  {
1360  if (b_it->second->expire_instances())
1361  {
1362  m_backend_map.erase(b_it);
1363  b_it = m_backend_map.begin();
1364  }
1365  else
1366  b_it++;
1367  }
1368 }

◆ get_frontend()

yf::SessionShared::FrontendPtr mp::filter::SessionShared::Rep::get_frontend ( Package &  package)
private

Definition at line 1444 of file filter_session_shared.cpp.

1445 {
1446  boost::mutex::scoped_lock lock(m_mutex);
1447 
1448  std::map<mp::Session,yf::SessionShared::FrontendPtr>::iterator it;
1449 
1450  while(true)
1451  {
1452  it = m_clients.find(package.session());
1453  if (it == m_clients.end())
1454  break;
1455 
1456  if (!it->second->m_in_use)
1457  {
1458  it->second->m_in_use = true;
1459  return it->second;
1460  }
1461  m_cond_session_ready.wait(lock);
1462  }
1463  FrontendPtr f(new Frontend(this));
1464  m_clients[package.session()] = f;
1465  f->m_in_use = true;
1466  return f;
1467 }
std::map< mp::Session, FrontendPtr > m_clients
boost::shared_ptr< Frontend > FrontendPtr

◆ init()

void mp::filter::SessionShared::Rep::init ( Package &  package,
const Z_GDU *  gdu,
FrontendPtr  frontend 
)
private

Definition at line 561 of file filter_session_shared.cpp.

563 {
564  Z_InitRequest *req = gdu->u.z3950->u.initRequest;
565 
566  frontend->m_is_virtual = true;
567  frontend->m_init_options = *req->options;
568  if (m_ignore_auth)
569  req->idAuthentication = 0;
570  InitKey k(req);
571  {
572  boost::mutex::scoped_lock lock(m_mutex_backend_map);
573  BackendClassMap::const_iterator it;
574  it = m_backend_map.find(k);
575  if (it == m_backend_map.end())
576  {
577  BackendClassPtr b(new BackendClass(gdu->u.z3950,
583  m_backend_map[k] = b;
584  frontend->m_backend_class = b;
585  }
586  else
587  {
588  frontend->m_backend_class = it->second;
589  }
590  }
591  BackendClassPtr bc = frontend->m_backend_class;
592  mp::odr odr;
593 
594  // we only need to get init response from "first" target in
595  // backend class - the assumption being that init response is
596  // same for all
597  bool create_first_one = false;
598  {
599  boost::mutex::scoped_lock lock(bc->m_mutex_backend_class);
600  if (!bc->m_no_succeeded)
601  create_first_one = true;
602  else
603  {
604  // wait for first one to finish
605  while (!bc->m_no_failed && !bc->m_no_succeeded && bc->m_no_init)
606  {
607  bc->m_cond_set_ready.wait(lock);
608  }
609  }
610  }
611  if (create_first_one)
612  {
613 
614  int code;
615  std::string addinfo;
616  BackendInstancePtr backend = bc->create_backend(package, code, addinfo);
617  if (backend)
618  bc->release_backend(backend);
619  }
620  yazpp_1::GDU init_response;
621  {
622  boost::mutex::scoped_lock lock(bc->m_mutex_backend_class);
623 
624  init_response = bc->m_init_response;
625  }
626 
627  if (init_response.get())
628  {
629  Z_GDU *response_gdu = init_response.get();
630  mp::util::transfer_referenceId(odr, gdu->u.z3950,
631  response_gdu->u.z3950);
632  Z_InitResponse *init_res = response_gdu->u.z3950->u.initResponse;
633  Z_Options *server_options = init_res->options;
634  Z_Options *client_options = &frontend->m_init_options;
635  int i;
636  for (i = 0; i < 30; i++)
637  if (!ODR_MASK_GET(client_options, i))
638  ODR_MASK_CLEAR(server_options, i);
639 
640  if (!m_preferredMessageSize ||
641  *init_res->preferredMessageSize > *req->preferredMessageSize)
642  *init_res->preferredMessageSize = *req->preferredMessageSize;
643 
644  if (!m_maximumRecordSize ||
645  *init_res->maximumRecordSize > *req->maximumRecordSize)
646  *init_res->maximumRecordSize = *req->maximumRecordSize;
647 
648  package.response() = init_response;
649  if (!*response_gdu->u.z3950->u.initResponse->result)
650  package.session().close();
651  }
652  else
653  {
654  Z_APDU *apdu =
655  odr.create_initResponse(
656  gdu->u.z3950, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR,
657  "session_shared: target closed connection during init");
658  *apdu->u.initResponse->result = 0;
659  package.response() = apdu;
660  package.session().close();
661  }
662 }
boost::shared_ptr< BackendInstance > BackendInstancePtr
boost::shared_ptr< BackendClass > BackendClassPtr

◆ release_frontend()

void mp::filter::SessionShared::Rep::release_frontend ( Package &  package)
private

Definition at line 1469 of file filter_session_shared.cpp.

1470 {
1471  boost::mutex::scoped_lock lock(m_mutex);
1472  std::map<mp::Session,yf::SessionShared::FrontendPtr>::iterator it;
1473 
1474  it = m_clients.find(package.session());
1475  if (it != m_clients.end())
1476  {
1477  if (package.session().is_closed())
1478  {
1479  m_clients.erase(it);
1480  }
1481  else
1482  {
1483  it->second->m_in_use = false;
1484  }
1485  m_cond_session_ready.notify_all();
1486  }
1487 }

◆ start()

void mp::filter::SessionShared::Rep::start ( )
private

Definition at line 1418 of file filter_session_shared.cpp.

1419 {
1420  yf::SessionShared::Worker w(this);
1421  m_thrds.add_thread(new boost::thread(w));
1422 }

◆ stat()

void mp::filter::SessionShared::Rep::stat ( )
private

Definition at line 543 of file filter_session_shared.cpp.

544 {
545  int no_classes = 0;
546  int no_instances = 0;
547  BackendClassMap::const_iterator it;
548  {
549  boost::mutex::scoped_lock lock(m_mutex_backend_map);
550  for (it = m_backend_map.begin(); it != m_backend_map.end(); it++)
551  {
552  BackendClassPtr bc = it->second;
553  no_classes++;
554  BackendInstanceList::iterator bit = bc->m_backend_list.begin();
555  for (; bit != bc->m_backend_list.end(); bit++)
556  no_instances++;
557  }
558  }
559 }

Friends And Related Function Documentation

◆ Frontend

friend struct Frontend
friend

Definition at line 197 of file filter_session_shared.cpp.

◆ SessionShared

friend class SessionShared
friend

Definition at line 196 of file filter_session_shared.cpp.

Member Data Documentation

◆ close_down

bool metaproxy_1::filter::SessionShared::Rep::close_down
private

Definition at line 228 of file filter_session_shared.cpp.

◆ m_backend_map

BackendClassMap metaproxy_1::filter::SessionShared::Rep::m_backend_map
private

Definition at line 216 of file filter_session_shared.cpp.

◆ m_clients

std::map<mp::Session, FrontendPtr> metaproxy_1::filter::SessionShared::Rep::m_clients
private

Definition at line 214 of file filter_session_shared.cpp.

◆ m_cond_expire_ready

boost::condition metaproxy_1::filter::SessionShared::Rep::m_cond_expire_ready
private

Definition at line 213 of file filter_session_shared.cpp.

◆ m_cond_session_ready

boost::condition metaproxy_1::filter::SessionShared::Rep::m_cond_session_ready
private

Definition at line 212 of file filter_session_shared.cpp.

◆ m_ignore_auth

bool metaproxy_1::filter::SessionShared::Rep::m_ignore_auth
private

Definition at line 224 of file filter_session_shared.cpp.

◆ m_maximumRecordSize

Odr_int metaproxy_1::filter::SessionShared::Rep::m_maximumRecordSize
private

Definition at line 227 of file filter_session_shared.cpp.

◆ m_mutex

boost::mutex metaproxy_1::filter::SessionShared::Rep::m_mutex
private

Definition at line 211 of file filter_session_shared.cpp.

◆ m_mutex_backend_map

boost::mutex metaproxy_1::filter::SessionShared::Rep::m_mutex_backend_map
private

Definition at line 217 of file filter_session_shared.cpp.

◆ m_optimize_search

bool metaproxy_1::filter::SessionShared::Rep::m_optimize_search
private

Definition at line 222 of file filter_session_shared.cpp.

◆ m_preferredMessageSize

Odr_int metaproxy_1::filter::SessionShared::Rep::m_preferredMessageSize
private

Definition at line 226 of file filter_session_shared.cpp.

◆ m_restart

bool metaproxy_1::filter::SessionShared::Rep::m_restart
private

Definition at line 223 of file filter_session_shared.cpp.

◆ m_resultset_max

int metaproxy_1::filter::SessionShared::Rep::m_resultset_max
private

Definition at line 220 of file filter_session_shared.cpp.

◆ m_resultset_ttl

int metaproxy_1::filter::SessionShared::Rep::m_resultset_ttl
private

Definition at line 219 of file filter_session_shared.cpp.

◆ m_session_max

int metaproxy_1::filter::SessionShared::Rep::m_session_max
private

Definition at line 225 of file filter_session_shared.cpp.

◆ m_session_ttl

int metaproxy_1::filter::SessionShared::Rep::m_session_ttl
private

Definition at line 221 of file filter_session_shared.cpp.

◆ m_thrds

boost::thread_group metaproxy_1::filter::SessionShared::Rep::m_thrds
private

Definition at line 218 of file filter_session_shared.cpp.


The documentation for this class was generated from the following file: