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

Public Member Functions

 BackendClass (const yazpp_1::GDU &init_request, int resultset_ttl, int resultset_max, int session_ttl, Odr_int preferredRecordSize, Odr_int maximumRecordSize)
 
 ~BackendClass ()
 

Private Member Functions

BackendInstancePtr create_backend (const Package &package, int &code, std::string &addinfo)
 
void remove_backend (BackendInstancePtr b)
 
BackendInstancePtr get_backend (const Package &package, int &code, std::string &addinfo)
 
void use_backend (BackendInstancePtr b)
 
void release_backend (BackendInstancePtr b)
 
bool expire_instances ()
 

Private Attributes

bool m_named_result_sets
 
BackendInstanceList m_backend_list
 
yazpp_1::GDU m_init_request
 
yazpp_1::GDU m_init_response
 
boost::mutex m_mutex_backend_class
 
boost::condition m_cond_set_ready
 
int m_sequence_top
 
time_t m_backend_set_ttl
 
time_t m_backend_expiry_ttl
 
size_t m_backend_set_max
 
Odr_int m_preferredMessageSize
 
Odr_int m_maximumRecordSize
 
int m_no_failed
 
int m_no_succeeded
 
int m_no_init
 

Friends

class Rep
 
struct Frontend
 

Detailed Description

Definition at line 118 of file filter_session_shared.cpp.

Constructor & Destructor Documentation

◆ BackendClass()

mp::filter::SessionShared::BackendClass::BackendClass ( const yazpp_1::GDU &  init_request,
int  resultset_ttl,
int  resultset_max,
int  session_ttl,
Odr_int  preferredRecordSize,
Odr_int  maximumRecordSize 
)

Definition at line 526 of file filter_session_shared.cpp.

532  : m_named_result_sets(false), m_init_request(init_request),
533  m_sequence_top(0), m_backend_set_ttl(resultset_ttl),
534  m_backend_expiry_ttl(session_ttl), m_backend_set_max(resultset_max),
535  m_preferredMessageSize(preferredMessageSize),
536  m_maximumRecordSize(maximumRecordSize),
538 {}

◆ ~BackendClass()

mp::filter::SessionShared::BackendClass::~BackendClass ( )

Definition at line 540 of file filter_session_shared.cpp.

541 {}

Member Function Documentation

◆ create_backend()

yf::SessionShared::BackendInstancePtr mp::filter::SessionShared::BackendClass::create_backend ( const Package &  package,
int &  code,
std::string &  addinfo 
)
private

Definition at line 394 of file filter_session_shared.cpp.

397 {
398  BackendInstancePtr null;
399  BackendInstancePtr bp(new BackendInstance);
400  bp->m_close_package =
401  new mp::Package(bp->m_session, frontend_package.origin());
402  bp->m_close_package->copy_filter(frontend_package);
403 
404  Package init_package(bp->m_session, frontend_package.origin());
405 
406  init_package.copy_filter(frontend_package);
407 
408  yazpp_1::GDU actual_init_request = m_init_request;
409  Z_GDU *init_pdu = actual_init_request.get();
410 
411  assert(init_pdu->which == Z_GDU_Z3950);
412  assert(init_pdu->u.z3950->which == Z_APDU_initRequest);
413 
414  Z_InitRequest *req = init_pdu->u.z3950->u.initRequest;
415  ODR_MASK_ZERO(req->options);
416 
417  ODR_MASK_SET(req->options, Z_Options_search);
418  ODR_MASK_SET(req->options, Z_Options_present);
419  ODR_MASK_SET(req->options, Z_Options_namedResultSets);
420  ODR_MASK_SET(req->options, Z_Options_scan);
421 
422  ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1);
423  ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
424  ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
425 
427  *req->preferredMessageSize = m_preferredMessageSize;
429  *req->maximumRecordSize = m_maximumRecordSize;
430 
431  init_package.request() = init_pdu;
432 
433  {
434  boost::mutex::scoped_lock lock(m_mutex_backend_class);
435  m_no_init++;
436  }
437 
438  init_package.move();
439 
440  boost::mutex::scoped_lock lock(m_mutex_backend_class);
441 
442  addinfo.clear();
443  code = 0;
444  m_named_result_sets = false;
445  Z_GDU *gdu = init_package.response().get();
446 
447  if (gdu && gdu->which == Z_GDU_Z3950
448  && gdu->u.z3950->which == Z_APDU_initResponse)
449  {
450  Z_InitResponse *res = gdu->u.z3950->u.initResponse;
451 
452  if (ODR_MASK_GET(res->options, Z_Options_namedResultSets))
453  {
454  m_named_result_sets = true;
455  }
456  // save init-response until we get one that succeeds
457  if (m_no_succeeded == 0)
458  m_init_response = gdu->u.z3950;
459  if (*gdu->u.z3950->u.initResponse->result
460  && !init_package.session().is_closed())
461  {
462  bp->m_in_use = true;
463  time(&bp->m_time_last_use);
464  bp->m_sequence_this = 0;
465  bp->m_result_set_sequence = 0;
466  m_backend_list.push_back(bp);
467  m_no_succeeded++;
468  return bp;
469  }
470  else
471  {
472  Z_External *uif =
473  gdu->u.z3950->u.initResponse->userInformationField;
474  if (uif && uif->which == Z_External_userInfo1)
475  {
476  Z_OtherInformation *ui = uif->u.userInfo1;
477  if (ui && ui->num_elements >= 1)
478  {
479  Z_OtherInformationUnit *unit = ui->list[0];
480  if (unit->which == Z_OtherInfo_externallyDefinedInfo &&
481  unit->information.externallyDefinedInfo &&
482  unit->information.externallyDefinedInfo->which ==
483  Z_External_diag1)
484  {
485  Z_DiagnosticFormat *diag =
486  unit->information.externallyDefinedInfo->u.diag1;
487  if (diag->num >= 1)
488  {
489  Z_DiagnosticFormat_s *ds = diag->elements[0];
490  if (ds->which ==
491  Z_DiagnosticFormat_s_defaultDiagRec)
492  {
493  Z_DefaultDiagFormat *e =
494  ds->u.defaultDiagRec;
495  code = *e->condition;
496  if (e->which == Z_DefaultDiagFormat_v2Addinfo
497  && e->u.v2Addinfo)
498  {
499  addinfo = e->u.v2Addinfo;
500  }
501  else if (
502  e->which == Z_DefaultDiagFormat_v3Addinfo
503  && e->u.v3Addinfo)
504  {
505  addinfo = e->u.v3Addinfo;
506  }
507  }
508  }
509  }
510  }
511  }
512  }
513  }
514  if (!init_package.session().is_closed())
515  {
516  init_package.copy_filter(frontend_package);
517  init_package.session().close();
518  init_package.move();
519  }
520  m_no_failed++;
521  m_cond_set_ready.notify_all();
522  return null;
523 }
boost::shared_ptr< BackendInstance > BackendInstancePtr

◆ expire_instances()

bool mp::filter::SessionShared::BackendClass::expire_instances ( )
private

Definition at line 1320 of file filter_session_shared.cpp.

1321 {
1322  time_t now;
1323  time(&now);
1324  boost::mutex::scoped_lock lock(m_mutex_backend_class);
1325  BackendInstanceList::iterator bit = m_backend_list.begin();
1326  while (bit != m_backend_list.end())
1327  {
1328  time_t last_use = (*bit)->m_time_last_use;
1329 
1330  if ((*bit)->m_in_use)
1331  {
1332  yaz_log(YLOG_LOG, "session_shared id=%ld in_use",
1333  (*bit)->m_session.id());
1334  bit++;
1335  }
1336  else if (now < last_use || now - last_use > m_backend_expiry_ttl)
1337  {
1338  yaz_log(YLOG_LOG, "session_shared id=%ld erase",
1339  (*bit)->m_session.id());
1340  bit = m_backend_list.erase(bit);
1341  }
1342  else
1343  {
1344  yaz_log(YLOG_LOG, "session_shared id=%ld skip now-last_use=%ld",
1345  (*bit)->m_session.id(), (long) (now - last_use));
1346  bit++;
1347  }
1348  }
1349  if (m_backend_list.empty())
1350  return true;
1351  return false;
1352 }

◆ get_backend()

yf::SessionShared::BackendInstancePtr mp::filter::SessionShared::BackendClass::get_backend ( const Package &  package,
int &  code,
std::string &  addinfo 
)
private

Definition at line 340 of file filter_session_shared.cpp.

343 {
344  {
345  boost::mutex::scoped_lock lock(m_mutex_backend_class);
346 
347  BackendInstanceList::const_iterator it = m_backend_list.begin();
348 
349  BackendInstancePtr backend1; // null
350 
351  for (; it != m_backend_list.end(); it++)
352  {
353  if (!(*it)->m_in_use)
354  {
355  if (!backend1
356  || (*it)->m_sequence_this < backend1->m_sequence_this)
357  backend1 = *it;
358  }
359  }
360  if (backend1)
361  {
362  use_backend(backend1);
363  return backend1;
364  }
365  }
366  return create_backend(frontend_package, code, addinfo);
367 }
BackendInstancePtr create_backend(const Package &package, int &code, std::string &addinfo)

◆ release_backend()

void mp::filter::SessionShared::BackendClass::release_backend ( BackendInstancePtr  b)
private

Definition at line 306 of file filter_session_shared.cpp.

307 {
308  boost::mutex::scoped_lock lock(m_mutex_backend_class);
309  m_cond_set_ready.notify_all();
310  b->m_in_use = false;
311 }

◆ remove_backend()

void mp::filter::SessionShared::BackendClass::remove_backend ( BackendInstancePtr  b)
private

Definition at line 314 of file filter_session_shared.cpp.

315 {
316  {
317  boost::mutex::scoped_lock lock(m_mutex_backend_class);
318  BackendInstanceList::iterator it = m_backend_list.begin();
319  for (;;)
320  {
321  if (it == m_backend_list.end())
322  return;
323  if (*it == b)
324  {
325  it = m_backend_list.erase(it);
326  break;
327  }
328  it++;
329  }
330  }
331  mp::odr odr;
332  b->m_close_package->response() = odr.create_close(
333  0, Z_Close_lackOfActivity, 0);
334  b->m_close_package->session().close();
335  b->m_close_package->move();
336 }

◆ use_backend()

void mp::filter::SessionShared::BackendClass::use_backend ( BackendInstancePtr  b)
private

Definition at line 369 of file filter_session_shared.cpp.

370 {
371  backend->m_in_use = true;
372  backend->m_sequence_this = m_sequence_top++;
373 }

Friends And Related Function Documentation

◆ Frontend

friend struct Frontend
friend

Definition at line 120 of file filter_session_shared.cpp.

◆ Rep

friend class Rep
friend

Definition at line 119 of file filter_session_shared.cpp.

Member Data Documentation

◆ m_backend_expiry_ttl

time_t metaproxy_1::filter::SessionShared::BackendClass::m_backend_expiry_ttl
private

Definition at line 137 of file filter_session_shared.cpp.

◆ m_backend_list

BackendInstanceList metaproxy_1::filter::SessionShared::BackendClass::m_backend_list
private

Definition at line 122 of file filter_session_shared.cpp.

◆ m_backend_set_max

size_t metaproxy_1::filter::SessionShared::BackendClass::m_backend_set_max
private

Definition at line 138 of file filter_session_shared.cpp.

◆ m_backend_set_ttl

time_t metaproxy_1::filter::SessionShared::BackendClass::m_backend_set_ttl
private

Definition at line 136 of file filter_session_shared.cpp.

◆ m_cond_set_ready

boost::condition metaproxy_1::filter::SessionShared::BackendClass::m_cond_set_ready
private

Definition at line 134 of file filter_session_shared.cpp.

◆ m_init_request

yazpp_1::GDU metaproxy_1::filter::SessionShared::BackendClass::m_init_request
private

Definition at line 131 of file filter_session_shared.cpp.

◆ m_init_response

yazpp_1::GDU metaproxy_1::filter::SessionShared::BackendClass::m_init_response
private

Definition at line 132 of file filter_session_shared.cpp.

◆ m_maximumRecordSize

Odr_int metaproxy_1::filter::SessionShared::BackendClass::m_maximumRecordSize
private

Definition at line 140 of file filter_session_shared.cpp.

◆ m_mutex_backend_class

boost::mutex metaproxy_1::filter::SessionShared::BackendClass::m_mutex_backend_class
private

Definition at line 133 of file filter_session_shared.cpp.

◆ m_named_result_sets

bool metaproxy_1::filter::SessionShared::BackendClass::m_named_result_sets
private

Definition at line 121 of file filter_session_shared.cpp.

◆ m_no_failed

int metaproxy_1::filter::SessionShared::BackendClass::m_no_failed
private

Definition at line 141 of file filter_session_shared.cpp.

◆ m_no_init

int metaproxy_1::filter::SessionShared::BackendClass::m_no_init
private

Definition at line 143 of file filter_session_shared.cpp.

◆ m_no_succeeded

int metaproxy_1::filter::SessionShared::BackendClass::m_no_succeeded
private

Definition at line 142 of file filter_session_shared.cpp.

◆ m_preferredMessageSize

Odr_int metaproxy_1::filter::SessionShared::BackendClass::m_preferredMessageSize
private

Definition at line 139 of file filter_session_shared.cpp.

◆ m_sequence_top

int metaproxy_1::filter::SessionShared::BackendClass::m_sequence_top
private

Definition at line 135 of file filter_session_shared.cpp.


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