CMS 3D CMS Logo

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

Classes

struct  QueryAttrState
 

Public Member Functions

QueryAttrHandleroperator= (const QueryAttrHandler &)=delete
 
 QueryAttrHandler (const QueryAttrHandler &)=delete
 
 ~QueryAttrHandler () override=default
 

Static Public Member Functions

static XrdCl::XRootDStatus query (XrdCl::FileSystem &fs, const std::string &attr, std::chrono::milliseconds timeout, std::string &result)
 

Private Member Functions

void HandleResponse (XrdCl::XRootDStatus *status, XrdCl::AnyObject *response) override
 
 QueryAttrHandler ()
 

Private Attributes

std::weak_ptr< QueryAttrStatem_state
 

Friends

std::unique_ptr< QueryAttrHandlerstd::make_unique ()
 

Detailed Description

A handler for querying a XrdCl::FileSystem object which is safe to be invoked from an XrdCl callback (that is, we don't need an available callback thread to timeout).

Definition at line 82 of file XrdSource.cc.

Constructor & Destructor Documentation

QueryAttrHandler::~QueryAttrHandler ( )
overridedefault
QueryAttrHandler::QueryAttrHandler ( const QueryAttrHandler )
delete
QueryAttrHandler::QueryAttrHandler ( )
inlineprivate

Definition at line 124 of file XrdSource.cc.

124 {}

Member Function Documentation

void QueryAttrHandler::HandleResponse ( XrdCl::XRootDStatus *  status,
XrdCl::AnyObject *  response 
)
inlineoverrideprivate

Definition at line 126 of file XrdSource.cc.

126  {
127  // NOTE: we own the status and response pointers.
128  std::unique_ptr<XrdCl::AnyObject> response_mgr;
129  response_mgr.reset(response);
130 
131  // Lock our state information then dispose of our object.
132  auto l_state = m_state.lock();
133  delete this;
134  if (!l_state) {
135  return;
136  }
137 
138  // On function exit, notify any waiting threads.
139  std::unique_ptr<char, std::function<void(char *)>> notify_guard(nullptr,
140  [&](char *) { l_state->m_condvar.notify_all(); });
141 
142  {
143  // On exit from the block, make sure m_status is set; it needs to be set before we notify threads.
144  std::unique_ptr<char, std::function<void(char *)>> exit_guard(nullptr, [&](char *) {
145  if (!l_state->m_status)
146  l_state->m_status = std::make_unique<XrdCl::XRootDStatus>(XrdCl::stError, XrdCl::errInternal);
147  });
148  if (!status) {
149  return;
150  }
151  if (status->IsOK()) {
152  if (!response) {
153  return;
154  }
155  XrdCl::Buffer *buf_ptr;
156  response->Get(buf_ptr);
157  // AnyObject::Set lacks specialization for nullptr
158  response->Set(static_cast<int *>(nullptr));
159  l_state->m_response.reset(buf_ptr);
160  }
161  l_state->m_status.reset(status);
162  }
163  }
list status
Definition: mps_update.py:107
std::weak_ptr< QueryAttrState > m_state
Definition: XrdSource.cc:178
QueryAttrHandler& QueryAttrHandler::operator= ( const QueryAttrHandler )
delete
static XrdCl::XRootDStatus QueryAttrHandler::query ( XrdCl::FileSystem &  fs,
const std::string &  attr,
std::chrono::milliseconds  timeout,
std::string &  result 
)
inlinestatic

Definition at line 90 of file XrdSource.cc.

References helper::Config.

Referenced by XrdAdaptor::Source::getXrootdSiteFromURL().

93  {
94  auto handler = std::make_unique<QueryAttrHandler>();
95  auto l_state = std::make_shared<QueryAttrState>();
96  handler->m_state = l_state;
97  XrdCl::Buffer arg(attr.size());
98  arg.FromString(attr);
99 
100  XrdCl::XRootDStatus st = fs.Query(XrdCl::QueryCode::Config, arg, handler.get());
101  if (!st.IsOK()) {
102  return st;
103  }
104 
105  // Successfully registered the callback; it will always delete itself, so we shouldn't.
106  handler.release();
107 
108  std::unique_lock<std::mutex> guard(l_state->m_mutex);
109  // Wait until some status is available or a timeout.
110  l_state->m_condvar.wait_for(guard, timeout, [&] { return l_state->m_status.get(); });
111 
112  if (l_state->m_status) {
113  if (l_state->m_status->IsOK()) {
114  result = l_state->m_response->ToString();
115  }
116  return *(l_state->m_status);
117  } else { // We had a timeout; construct a reasonable message.
118  return XrdCl::XRootDStatus(
119  XrdCl::stError, XrdCl::errSocketTimeout, 1, "Timeout when waiting for query callback.");
120  }
121  }
int timeout
Definition: mps_check.py:53
A arg
Definition: Factorize.h:31
tuple result
Definition: mps_fire.py:311
tuple Config
Definition: helper.py:10

Friends And Related Function Documentation

std::unique_ptr<QueryAttrHandler> std::make_unique ( )
friend

Member Data Documentation

std::weak_ptr<QueryAttrState> QueryAttrHandler::m_state
private

Definition at line 178 of file XrdSource.cc.