diff --git a/Utilities/XrdAdaptor/src/XrdHostHandler.hh b/Utilities/XrdAdaptor/src/XrdHostHandler.hh index ad39873a2994d..26490e69fe7cc 100644 --- a/Utilities/XrdAdaptor/src/XrdHostHandler.hh +++ b/Utilities/XrdAdaptor/src/XrdHostHandler.hh @@ -39,7 +39,7 @@ public: virtual void HandleResponseWithHosts(XrdCl::XRootDStatus *status, XrdCl::AnyObject *response, - XrdCl::HostList *hostList) + XrdCl::HostList *hostList) override { pStatus.reset(status); pResponse.reset(response); diff --git a/Utilities/XrdAdaptor/src/XrdRequestManager.cc b/Utilities/XrdAdaptor/src/XrdRequestManager.cc index e2b23f16f76db..ebf1a1f211602 100644 --- a/Utilities/XrdAdaptor/src/XrdRequestManager.cc +++ b/Utilities/XrdAdaptor/src/XrdRequestManager.cc @@ -139,7 +139,24 @@ RequestManager::initialize(std::weak_ptr self) auto opaque = prepareOpaqueString(); std::string new_filename = m_name + (opaque.size() ? ((m_name.find("?") == m_name.npos) ? "?" : "&") + opaque : ""); SyncHostResponseHandler handler; - file->Open(new_filename, m_flags, m_perms, &handler); + XrdCl::XRootDStatus openStatus = file->Open(new_filename, m_flags, m_perms, &handler); + if (!openStatus.IsOK()) + { // In this case, we failed immediately - this indicates we have previously tried to talk to this + // server and it was marked bad - xrootd couldn't even queue up the request internally! + // In practice, we obsere this happening when the call to getXrootdSiteFromURL fails due to the + // redirector being down or authentication failures. + ex.clearMessage(); + ex.clearContext(); + ex.clearAdditionalInfo(); + ex << "XrdCl::File::Open(name='" << m_name + << "', flags=0x" << std::hex << m_flags + << ", permissions=0" << std::oct << m_perms << std::dec + << ") => error '" << openStatus.ToStr() + << "' (errno=" << openStatus.errNo << ", code=" << openStatus.code << ")"; + ex.addContext("Calling XrdFile::open()"); + ex.addAdditionalInfo("Remote server already encountered a fatal error; no redirections were performed."); + throw ex; + } handler.WaitForResponse(); std::unique_ptr status = handler.GetStatus(); std::unique_ptr hostList = handler.GetHosts();