XRootD
XrdCl::EcHandler Class Reference

#include <XrdClEcHandler.hh>

+ Inheritance diagram for XrdCl::EcHandler:
+ Collaboration diagram for XrdCl::EcHandler:

Public Member Functions

 EcHandler (const URL &redir, XrdEc::ObjCfg *objcfg, std::unique_ptr< CheckSumHelper > cksHelper)
 
virtual ~EcHandler ()
 
XRootDStatus Close (ResponseHandler *handler, uint16_t timeout)
 
bool IsOpen () const
 
XRootDStatus Open (const std::string &url, OpenFlags::Flags flags, Access::Mode mode, ResponseHandler *handler, uint16_t timeout)
 
XRootDStatus Open (uint16_t flags, ResponseHandler *handler, uint16_t timeout)
 
XRootDStatus PgRead (uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, uint16_t timeout)
 
XRootDStatus PgWrite (uint64_t offset, uint32_t size, const void *buffer, std::vector< uint32_t > &cksums, ResponseHandler *handler, uint16_t timeout=0)
 
XRootDStatus Read (uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, uint16_t timeout)
 
XRootDStatus Stat (bool force, ResponseHandler *handler, uint16_t timeout)
 
XRootDStatus Write (uint64_t offset, uint32_t size, const void *buffer, ResponseHandler *handler, uint16_t timeout)
 
- Public Member Functions inherited from XrdCl::FilePlugIn
virtual ~FilePlugIn ()
 Destructor. More...
 
virtual XRootDStatus Fcntl (const Buffer &arg, ResponseHandler *handler, uint16_t timeout)
 
virtual bool GetProperty (const std::string &name, std::string &value) const
 
virtual XRootDStatus Read (uint64_t offset, uint32_t size, Optional< uint64_t > fdoff, int fd, ResponseHandler *handler, uint16_t timeout=0)
 
virtual bool SetProperty (const std::string &name, const std::string &value)
 
virtual XRootDStatus Sync (ResponseHandler *handler, uint16_t timeout)
 
virtual XRootDStatus Truncate (uint64_t size, ResponseHandler *handler, uint16_t timeout)
 
virtual XRootDStatus VectorRead (const ChunkList &chunks, void *buffer, ResponseHandler *handler, uint16_t timeout)
 
virtual XRootDStatus VectorWrite (const ChunkList &chunks, ResponseHandler *handler, uint16_t timeout=0)
 
virtual XRootDStatus Visa (ResponseHandler *handler, uint16_t timeout)
 
virtual XRootDStatus Write (uint64_t offset, Buffer &&buffer, ResponseHandler *handler, uint16_t timeout=0)
 
virtual XRootDStatus Write (uint64_t offset, uint32_t size, Optional< uint64_t > fdoff, int fd, ResponseHandler *handler, uint16_t timeout=0)
 
virtual XRootDStatus WriteV (uint64_t offset, const struct iovec *iov, int iovcnt, ResponseHandler *handler, uint16_t timeout=0)
 

Detailed Description

Definition at line 122 of file XrdClEcHandler.hh.

Constructor & Destructor Documentation

◆ EcHandler()

XrdCl::EcHandler::EcHandler ( const URL redir,
XrdEc::ObjCfg objcfg,
std::unique_ptr< CheckSumHelper cksHelper 
)
inline

Definition at line 125 of file XrdClEcHandler.hh.

127  : redir( redir ),
128  fs( redir, false ),
129  objcfg( objcfg ),
130  curroff( 0 ),
131  cksHelper( std::move( cksHelper ) )
132  {
134  }
bool enable_plugins
Definition: XrdEcConfig.hh:77
static Config & Instance()
Singleton access.
Definition: XrdEcConfig.hh:46

References XrdEc::Config::enable_plugins, and XrdEc::Config::Instance().

+ Here is the call graph for this function:

◆ ~EcHandler()

virtual XrdCl::EcHandler::~EcHandler ( )
inlinevirtual

Definition at line 136 of file XrdClEcHandler.hh.

137  {
138  }

Member Function Documentation

◆ Close()

XRootDStatus XrdCl::EcHandler::Close ( ResponseHandler handler,
uint16_t  timeout 
)
inlinevirtual
See also
XrdCl::File::Close

Reimplemented from XrdCl::FilePlugIn.

Definition at line 193 of file XrdClEcHandler.hh.

195  {
196  if( writer )
197  {
198  writer->Close( ResponseHandler::Wrap( [this, handler]( XRootDStatus *st, AnyObject *rsp )
199  {
200  writer.reset();
201  if( st->IsOK() && bool( cksHelper ) )
202  {
203  std::string commit = redir.GetPath()
204  + "?xrdec.objid=" + objcfg->obj
205  + "&xrdec.close=true&xrdec.size=" + std::to_string( curroff );
206  if( cksHelper )
207  {
208  std::string ckstype = cksHelper->GetType();
209  std::string cksval;
210  auto st = cksHelper->GetCheckSum( cksval, ckstype );
211  if( !st.IsOK() )
212  {
213  handler->HandleResponse( new XRootDStatus( st ), nullptr );
214  return;
215  }
216  commit += "&xrdec.cksum=" + cksval;
217  }
218  Buffer arg; arg.FromString( commit );
219  auto st = fs.Query( QueryCode::OpaqueFile, arg, handler );
220  if( !st.IsOK() ) handler->HandleResponse( new XRootDStatus( st ), nullptr );
221  return;
222  }
223  handler->HandleResponse( st, rsp );
224  } ), timeout );
225  return XRootDStatus();
226  }
227 
228  if( reader )
229  {
230  reader->Close( ResponseHandler::Wrap( [this, handler]( XRootDStatus *st, AnyObject *rsp )
231  {
232  reader.reset();
233  handler->HandleResponse( st, rsp );
234  } ), timeout );
235  return XRootDStatus();
236  }
237 
238  return XRootDStatus( stError, errNotSupported );
239  }
XRootDStatus Query(QueryCode::Code queryCode, const Buffer &arg, ResponseHandler *handler, uint16_t timeout=0) XRD_WARN_UNUSED_RESULT
static ResponseHandler * Wrap(std::function< void(XRootDStatus &, AnyObject &)> func)
const uint16_t stError
An error occurred that could potentially be retried.
Definition: XrdClStatus.hh:32
const uint16_t errNotSupported
Definition: XrdClStatus.hh:62
@ OpaqueFile
Implementation dependent.

References XrdCl::Buffer::FromString(), XrdCl::ResponseHandler::HandleResponse(), XrdCl::Status::IsOK(), XrdCl::QueryCode::OpaqueFile, XrdCl::FileSystem::Query(), and XrdCl::ResponseHandler::Wrap().

+ Here is the call graph for this function:

◆ IsOpen()

bool XrdCl::EcHandler::IsOpen ( ) const
inlinevirtual
See also
XrdCl::File::IsOpen

Reimplemented from XrdCl::FilePlugIn.

Definition at line 352 of file XrdClEcHandler.hh.

353  {
354  return writer || reader;
355  }

◆ Open() [1/2]

XRootDStatus XrdCl::EcHandler::Open ( const std::string &  url,
OpenFlags::Flags  flags,
Access::Mode  mode,
ResponseHandler handler,
uint16_t  timeout 
)
inlinevirtual
See also
XrdCl::File::Open

Reimplemented from XrdCl::FilePlugIn.

Definition at line 179 of file XrdClEcHandler.hh.

184  {
185  (void)url; (void)mode;
186  return Open( flags, handler, timeout );
187  }
XRootDStatus Open(uint16_t flags, ResponseHandler *handler, uint16_t timeout)

References Open().

+ Here is the call graph for this function:

◆ Open() [2/2]

XRootDStatus XrdCl::EcHandler::Open ( uint16_t  flags,
ResponseHandler handler,
uint16_t  timeout 
)
inline

Definition at line 140 of file XrdClEcHandler.hh.

143  {
144  if( ( flags & OpenFlags::Write ) || ( flags & OpenFlags::Update ) )
145  {
146  if( !( flags & OpenFlags::New ) || // it has to be a new file
147  ( flags & OpenFlags::Delete ) || // truncation is not supported
148  ( flags & OpenFlags::Read ) ) // write + read is not supported
149  return XRootDStatus( stError, errNotSupported );
150 
151  if( objcfg->plgr.empty() )
152  {
153  XRootDStatus st = LoadPlacement();
154  if( !st.IsOK() ) return st;
155  }
156  writer.reset( new XrdEc::StrmWriter( *objcfg ) );
157  writer->Open( handler, timeout );
158  return XRootDStatus();
159  }
160 
161  if( flags & OpenFlags::Read )
162  {
163  if( flags & OpenFlags::Write )
164  return XRootDStatus( stError, errNotSupported );
165 
166  if( objcfg->plgr.empty() )
167  {
168  XRootDStatus st = LoadPlacement( redir.GetPath() );
169  if( !st.IsOK() ) return st;
170  }
171  reader.reset( new XrdEc::Reader( *objcfg ) );
172  reader->Open( handler, timeout );
173  return XRootDStatus();
174  }
175 
176  return XRootDStatus( stError, errNotSupported );
177  }
const std::string & GetPath() const
Get the path.
Definition: XrdClURL.hh:217
@ Read
Open only for reading.
@ Write
Open only for writing.
@ Update
Open for reading and writing.

References XrdCl::OpenFlags::Delete, XrdCl::errNotSupported, XrdCl::URL::GetPath(), XrdCl::Status::IsOK(), XrdCl::OpenFlags::New, XrdCl::OpenFlags::Read, XrdCl::stError, XrdCl::OpenFlags::Update, and XrdCl::OpenFlags::Write.

Referenced by Open().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ PgRead()

XRootDStatus XrdCl::EcHandler::PgRead ( uint64_t  offset,
uint32_t  size,
void *  buffer,
ResponseHandler handler,
uint16_t  timeout 
)
inlinevirtual
See also
XrdCl::File::PgRead - async

Reimplemented from XrdCl::FilePlugIn.

Definition at line 298 of file XrdClEcHandler.hh.

301  {
302  ResponseHandler *substitHandler = new EcPgReadResponseHandler( handler );
303  XRootDStatus st = Read(offset, size, buffer, substitHandler, timeout);
304  return st;
305  }
XRootDStatus Read(uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, uint16_t timeout)

References XrdCl::Read().

+ Here is the call graph for this function:

◆ PgWrite()

XRootDStatus XrdCl::EcHandler::PgWrite ( uint64_t  offset,
uint32_t  size,
const void *  buffer,
std::vector< uint32_t > &  cksums,
ResponseHandler handler,
uint16_t  timeout = 0 
)
inlinevirtual
See also
XrdCl::File::PgWrite - async

Reimplemented from XrdCl::FilePlugIn.

Definition at line 330 of file XrdClEcHandler.hh.

336  {
337  if(! cksums.empty() )
338  {
339  const char *data = static_cast<const char*>( buffer );
340  std::vector<uint32_t> local_cksums;
341  XrdOucPgrwUtils::csCalc( data, offset, size, local_cksums );
342  if (data) delete data;
343  if (local_cksums != cksums)
344  return XRootDStatus( stError, errInvalidArgs, 0, "data and crc32c digests do not match." );
345  }
346  return Write(offset, size, buffer, handler, timeout);
347  }
XRootDStatus Write(uint64_t offset, uint32_t size, const void *buffer, ResponseHandler *handler, uint16_t timeout)
static void csCalc(const char *data, off_t offs, size_t count, uint32_t *csval)
const uint16_t errInvalidArgs
Definition: XrdClStatus.hh:58

References XrdOucPgrwUtils::csCalc(), XrdCl::errInvalidArgs, XrdCl::stError, and XrdCl::Write().

+ Here is the call graph for this function:

◆ Read()

XRootDStatus XrdCl::EcHandler::Read ( uint64_t  offset,
uint32_t  size,
void *  buffer,
ResponseHandler handler,
uint16_t  timeout 
)
inlinevirtual
See also
XrdCl::File::Read

Reimplemented from XrdCl::FilePlugIn.

Definition at line 283 of file XrdClEcHandler.hh.

288  {
289  if( !reader ) return XRootDStatus( stError, errInternal );
290 
291  reader->Read( offset, size, buffer, handler, timeout );
292  return XRootDStatus();
293  }
const uint16_t errInternal
Internal error.
Definition: XrdClStatus.hh:56

References XrdCl::errInternal, and XrdCl::stError.

◆ Stat()

XRootDStatus XrdCl::EcHandler::Stat ( bool  force,
ResponseHandler handler,
uint16_t  timeout 
)
inlinevirtual
See also
XrdCl::File::Stat

Reimplemented from XrdCl::FilePlugIn.

Definition at line 244 of file XrdClEcHandler.hh.

247  {
248 
249  if( !objcfg->nomtfile )
250  return fs.Stat( redir.GetPath(), handler, timeout );
251 
252  if( !force && statcache )
253  {
254  auto rsp = StatRsp( statcache->GetSize() );
255  Schedule( handler, rsp );
256  return XRootDStatus();
257  }
258 
259  if( writer )
260  {
261  statcache.reset( new StatInfo() );
262  statcache->SetSize( writer->GetSize() );
263  auto rsp = StatRsp( statcache->GetSize() );
264  Schedule( handler, rsp );
265  return XRootDStatus();
266  }
267 
268  if( reader )
269  {
270  statcache.reset( new StatInfo() );
271  statcache->SetSize( reader->GetSize() );
272  auto rsp = StatRsp( statcache->GetSize() );
273  Schedule( handler, rsp );
274  return XRootDStatus();
275  }
276 
277  return XRootDStatus( stError, errInvalidOp, 0, "File not open." );
278  }
XRootDStatus Stat(const std::string &path, ResponseHandler *handler, uint16_t timeout=0) XRD_WARN_UNUSED_RESULT
const uint16_t errInvalidOp
Definition: XrdClStatus.hh:51

References XrdCl::errInvalidOp, and XrdCl::stError.

◆ Write()

XRootDStatus XrdCl::EcHandler::Write ( uint64_t  offset,
uint32_t  size,
const void *  buffer,
ResponseHandler handler,
uint16_t  timeout 
)
inlinevirtual
See also
File::Write

Reimplemented from XrdCl::FilePlugIn.

Definition at line 311 of file XrdClEcHandler.hh.

316  {
317  if( cksHelper )
318  cksHelper->Update( buffer, size );
319 
320  if( !writer ) return XRootDStatus( stError, errInternal );
321  if( offset != curroff ) return XRootDStatus( stError, errNotSupported );
322  writer->Write( size, buffer, handler );
323  curroff += size;
324  return XRootDStatus();
325  }

References XrdCl::errInternal, XrdCl::errNotSupported, and XrdCl::stError.


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