CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
XrdAdaptor::RequestManager::OpenHandler Class Reference
Inheritance diagram for XrdAdaptor::RequestManager::OpenHandler:

Public Member Functions

std::string current_source ()
 
virtual void HandleResponseWithHosts (XrdCl::XRootDStatus *status, XrdCl::AnyObject *response, XrdCl::HostList *hostList) override
 
std::shared_future
< std::shared_ptr< Source > > 
open ()
 
 ~OpenHandler ()
 

Static Public Member Functions

static std::shared_ptr
< OpenHandler
getInstance (std::weak_ptr< RequestManager > manager)
 

Private Member Functions

 OpenHandler (std::weak_ptr< RequestManager > manager)
 

Private Attributes

std::unique_ptr< XrdCl::File > m_file
 
std::weak_ptr< RequestManagerm_manager
 
std::recursive_mutex m_mutex
 
std::promise< std::shared_ptr
< Source > > 
m_promise
 
std::shared_ptr< OpenHandlerm_self
 
std::weak_ptr< OpenHandlerm_self_weak
 
std::shared_future
< std::shared_ptr< Source > > 
m_shared_future
 

Detailed Description

Definition at line 220 of file XrdRequestManager.h.

Constructor & Destructor Documentation

XrdAdaptor::RequestManager::OpenHandler::~OpenHandler ( )

Definition at line 1000 of file XrdRequestManager.cc.

1001 {
1002 }
XrdAdaptor::RequestManager::OpenHandler::OpenHandler ( std::weak_ptr< RequestManager manager)
private

Definition at line 992 of file XrdRequestManager.cc.

Referenced by getInstance().

993  : m_manager(manager)
994 {
995 }
std::weak_ptr< RequestManager > m_manager

Member Function Documentation

std::string XrdAdaptor::RequestManager::OpenHandler::current_source ( )

Returns the current source server name. Useful primarily for debugging.

Definition at line 1060 of file XrdRequestManager.cc.

References AlCaHLTBitMon_QueryRunRegistry::string.

1061 {
1062  std::lock_guard<std::recursive_mutex> sentry(m_mutex);
1063 
1064  if (!m_file.get())
1065  {
1066  return "(no open in progress)";
1067  }
1068  std::string dataServer;
1069  m_file->GetProperty("DataServer", dataServer);
1070  if (!dataServer.size()) { return "(unknown source)"; }
1071  return dataServer;
1072 }
std::unique_ptr< XrdCl::File > m_file
static std::shared_ptr<OpenHandler> XrdAdaptor::RequestManager::OpenHandler::getInstance ( std::weak_ptr< RequestManager manager)
inlinestatic

Definition at line 224 of file XrdRequestManager.h.

References instance, m_self_weak, and OpenHandler().

Referenced by XrdAdaptor::RequestManager::initialize().

225  {
226  OpenHandler *instance_ptr = new OpenHandler(manager);
227  std::shared_ptr<OpenHandler> instance(instance_ptr);
228  instance_ptr->m_self_weak = instance;
229  return instance;
230  }
static PFTauRenderPlugin instance
OpenHandler(std::weak_ptr< RequestManager > manager)
void XrdAdaptor::RequestManager::OpenHandler::HandleResponseWithHosts ( XrdCl::XRootDStatus *  status,
XrdCl::AnyObject *  response,
XrdCl::HostList *  hostList 
)
overridevirtual

Handle the file-open response

Definition at line 1006 of file XrdRequestManager.cc.

References cms::Exception::addContext(), TauDecayModes::dec, XrdAdaptor::Source::determineHostExcludeString(), edm::errors::FileOpenError, GET_CLOCK_MONOTONIC, eostools::move(), fileCollector::now, SendMonitoringInfo(), source, popcon_last_value_cfg::Source, ntuplemaker::status, and AlCaHLTBitMon_QueryRunRegistry::string.

1007 {
1008  std::shared_ptr<Source> source;
1009  std::unique_ptr<XrdCl::XRootDStatus> status(status_ptr);
1010  std::unique_ptr<XrdCl::HostList> hostList(hostList_ptr);
1011 
1012  // Make sure we get rid of the strong self-reference when the callback finishes.
1013  std::shared_ptr<OpenHandler> self = m_self;
1014  m_self.reset();
1015 
1016  auto manager = m_manager.lock();
1017  // Manager object has already been deleted. Cleanup the
1018  // response objects, remove our self-reference, and ignore the response.
1019  if (!manager)
1020  {
1021  return;
1022  }
1023  //if we need to delete the File object we must do it outside
1024  // of the lock to avoid a potential deadlock
1025  std::unique_ptr<XrdCl::File> releaseFile;
1026  {
1027  std::lock_guard<std::recursive_mutex> sentry(m_mutex);
1028 
1029  if (status->IsOK())
1030  {
1032  timespec now;
1033  GET_CLOCK_MONOTONIC(now);
1034 
1035  std::string excludeString;
1036  Source::determineHostExcludeString(*m_file, hostList.get(), excludeString);
1037 
1038  source.reset(new Source(now, std::move(m_file), excludeString));
1039  m_promise.set_value(source);
1040  }
1041  else
1042  {
1043  releaseFile = std::move(m_file);
1045  ex << "XrdCl::File::Open(name='" << manager->m_name
1046  << "', flags=0x" << std::hex << manager->m_flags
1047  << ", permissions=0" << std::oct << manager->m_perms << std::dec
1048  << ") => error '" << status->ToStr()
1049  << "' (errno=" << status->errNo << ", code=" << status->code << ")";
1050  ex.addContext("In XrdAdaptor::RequestManager::OpenHandler::HandleResponseWithHosts()");
1051  manager->addConnections(ex);
1052 
1053  m_promise.set_exception(std::make_exception_ptr(ex));
1054  }
1055  }
1056  manager->handleOpen(*status, source);
1057 }
#define GET_CLOCK_MONOTONIC(ts)
static void determineHostExcludeString(XrdCl::File &file, const XrdCl::HostList *hostList, std::string &exclude)
Definition: XrdSource.cc:196
std::shared_ptr< OpenHandler > m_self
static void SendMonitoringInfo(XrdCl::File &file)
std::weak_ptr< RequestManager > m_manager
def move
Definition: eostools.py:510
std::unique_ptr< XrdCl::File > m_file
tuple status
Definition: ntuplemaker.py:245
std::promise< std::shared_ptr< Source > > m_promise
static std::string const source
Definition: EdmProvDump.cc:42
std::shared_future< std::shared_ptr< Source > > XrdAdaptor::RequestManager::OpenHandler::open ( )

Future-based version of the handler If called while a file-open is in progress, we will not start a new file-open. Instead, the callback will be fired for the ongoing open.

NOTE NOTE: This function is not thread-safe due to a lock-ordering issue. The caller must ensure it is not called from multiple threads at once for this object.

Definition at line 1075 of file XrdRequestManager.cc.

References XrdAdaptor::RequestManager::addConnections(), cms::Exception::addContext(), TauDecayModes::dec, reco_application_tbsim_DetSim-Digi_cfg::File, edm::errors::FileOpenError, edm::errors::LogicError, XrdAdaptor::RequestManager::m_flags, XrdAdaptor::RequestManager::m_name, XrdAdaptor::RequestManager::m_perms, XrdAdaptor::RequestManager::prepareOpaqueString(), ntuplemaker::status, and AlCaHLTBitMon_QueryRunRegistry::string.

1076 {
1077  auto manager_ptr = m_manager.lock();
1078  if (!manager_ptr)
1079  {
1081  ex << "XrdCl::File::Open() =>"
1082  << " error: OpenHandler called within an invalid RequestManager context."
1083  << " This is a logic error and should be reported to the CMSSW developers.";
1084  ex.addContext("Calling XrdAdaptor::RequestManager::OpenHandler::open()");
1085  throw ex;
1086  }
1087  RequestManager &manager = *manager_ptr;
1088  auto self_ptr = m_self_weak.lock();
1089  if (!self_ptr)
1090  {
1092  ex << "XrdCl::File::Open() => error: "
1093  << "OpenHandler called after it was deleted. This is a logic error "
1094  << "and should be reported to the CMSSW developers.";
1095  ex.addContext("Calling XrdAdapter::RequestManager::OpenHandler::open()");
1096  throw ex;
1097  }
1098 
1099  // NOTE NOTE: we look at this variable *without* the lock. This means the method
1100  // is not thread-safe; the caller is responsible to verify it is not called from
1101  // multiple threads simultaneously.
1102  //
1103  // This is done because ::open may be called from a Xrootd callback; if we
1104  // tried to hold m_mutex here, this object's callback may also be active, hold m_mutex,
1105  // and make a call into xrootd (when it invokes m_file.reset()). Hence, our callback
1106  // holds our mutex and attempts to grab an Xrootd mutex; RequestManager::requestFailure holds
1107  // an Xrootd mutex and tries to hold m_mutex. This is a classic deadlock.
1108  if (m_file.get())
1109  {
1110  return m_shared_future;
1111  }
1112  std::lock_guard<std::recursive_mutex> sentry(m_mutex);
1113  std::promise<std::shared_ptr<Source> > new_promise;
1114  m_promise.swap(new_promise);
1115  m_shared_future = m_promise.get_future().share();
1116 
1117  auto opaque = manager.prepareOpaqueString();
1118  std::string new_name = manager.m_name + ((manager.m_name.find("?") == manager.m_name.npos) ? "?" : "&") + opaque;
1119  edm::LogVerbatim("XrdAdaptorInternal") << "Trying to open URL: " << new_name;
1120  m_file.reset(new XrdCl::File());
1121  XrdCl::XRootDStatus status;
1122  if (!(status = m_file->Open(new_name, manager.m_flags, manager.m_perms, this)).IsOK())
1123  {
1125  ex << "XrdCl::File::Open(name='" << new_name
1126  << "', flags=0x" << std::hex << manager.m_flags
1127  << ", permissions=0" << std::oct << manager.m_perms << std::dec
1128  << ") => error '" << status.ToStr()
1129  << "' (errno=" << status.errNo << ", code=" << status.code << ")";
1130  ex.addContext("Calling XrdAdaptor::RequestManager::OpenHandler::open()");
1131  manager.addConnections(ex);
1132  throw ex;
1133  }
1134  // Have a strong self-reference for as long as the callback is in-progress.
1135  m_self = self_ptr;
1136  return m_shared_future;
1137 }
std::shared_ptr< OpenHandler > m_self
std::weak_ptr< OpenHandler > m_self_weak
std::shared_future< std::shared_ptr< Source > > m_shared_future
void addConnections(cms::Exception &)
std::weak_ptr< RequestManager > m_manager
XrdCl::OpenFlags::Flags m_flags
XrdCl::Access::Mode m_perms
std::unique_ptr< XrdCl::File > m_file
tuple status
Definition: ntuplemaker.py:245
std::promise< std::shared_ptr< Source > > m_promise

Member Data Documentation

std::unique_ptr<XrdCl::File> XrdAdaptor::RequestManager::OpenHandler::m_file
private

Definition at line 262 of file XrdRequestManager.h.

std::weak_ptr<RequestManager> XrdAdaptor::RequestManager::OpenHandler::m_manager
private

Definition at line 270 of file XrdRequestManager.h.

std::recursive_mutex XrdAdaptor::RequestManager::OpenHandler::m_mutex
private

Definition at line 263 of file XrdRequestManager.h.

std::promise<std::shared_ptr<Source> > XrdAdaptor::RequestManager::OpenHandler::m_promise
private

Definition at line 259 of file XrdRequestManager.h.

std::shared_ptr<OpenHandler> XrdAdaptor::RequestManager::OpenHandler::m_self
private

Definition at line 264 of file XrdRequestManager.h.

std::weak_ptr<OpenHandler> XrdAdaptor::RequestManager::OpenHandler::m_self_weak
private

Definition at line 269 of file XrdRequestManager.h.

Referenced by getInstance().

std::shared_future<std::shared_ptr<Source> > XrdAdaptor::RequestManager::OpenHandler::m_shared_future
private

Definition at line 258 of file XrdRequestManager.h.