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 127 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 130 of file XrdClEcHandler.hh.

132  : redir( redir ),
133  fs( redir, false ),
134  objcfg( objcfg ),
135  curroff( 0 ),
136  cksHelper( std::move( cksHelper ) )
137  {
139  }
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 141 of file XrdClEcHandler.hh.

142  {
143  }

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 198 of file XrdClEcHandler.hh.

200  {
201  if( writer )
202  {
203  writer->Close( ResponseHandler::Wrap( [this, handler]( XRootDStatus *st, AnyObject *rsp )
204  {
205  writer.reset();
206  if( st->IsOK() && bool( cksHelper ) )
207  {
208  std::string commit = redir.GetPath()
209  + "?xrdec.objid=" + objcfg->obj
210  + "&xrdec.close=true&xrdec.size=" + std::to_string( curroff );
211  if( cksHelper )
212  {
213  std::string ckstype = cksHelper->GetType();
214  std::string cksval;
215  auto st = cksHelper->GetCheckSum( cksval, ckstype );
216  if( !st.IsOK() )
217  {
218  handler->HandleResponse( new XRootDStatus( st ), nullptr );
219  return;
220  }
221  commit += "&xrdec.cksum=" + cksval;
222  }
223  Buffer arg; arg.FromString( commit );
224  auto st = fs.Query( QueryCode::OpaqueFile, arg, handler );
225  if( !st.IsOK() ) handler->HandleResponse( new XRootDStatus( st ), nullptr );
226  return;
227  }
228  handler->HandleResponse( st, rsp );
229  } ), timeout );
230  return XRootDStatus();
231  }
232 
233  if( reader )
234  {
235  reader->Close( ResponseHandler::Wrap( [this, handler]( XRootDStatus *st, AnyObject *rsp )
236  {
237  reader.reset();
238  handler->HandleResponse( st, rsp );
239  } ), timeout );
240  return XRootDStatus();
241  }
242 
243  return XRootDStatus( stError, errNotSupported );
244  }
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 357 of file XrdClEcHandler.hh.

358  {
359  return writer || reader;
360  }

◆ 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 184 of file XrdClEcHandler.hh.

189  {
190  (void)url; (void)mode;
191  return Open( flags, handler, timeout );
192  }
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 145 of file XrdClEcHandler.hh.

148  {
149  if( ( flags & OpenFlags::Write ) || ( flags & OpenFlags::Update ) )
150  {
151  if( !( flags & OpenFlags::New ) || // it has to be a new file
152  ( flags & OpenFlags::Delete ) || // truncation is not supported
153  ( flags & OpenFlags::Read ) ) // write + read is not supported
154  return XRootDStatus( stError, errNotSupported );
155 
156  if( objcfg->plgr.empty() )
157  {
158  XRootDStatus st = LoadPlacement();
159  if( !st.IsOK() ) return st;
160  }
161  writer.reset( new XrdEc::StrmWriter( *objcfg ) );
162  writer->Open( handler, timeout );
163  return XRootDStatus();
164  }
165 
166  if( flags & OpenFlags::Read )
167  {
168  if( flags & OpenFlags::Write )
169  return XRootDStatus( stError, errNotSupported );
170 
171  if( objcfg->plgr.empty() )
172  {
173  XRootDStatus st = LoadPlacement( redir.GetPath() );
174  if( !st.IsOK() ) return st;
175  }
176  reader.reset( new XrdEc::Reader( *objcfg ) );
177  reader->Open( handler, timeout );
178  return XRootDStatus();
179  }
180 
181  return XRootDStatus( stError, errNotSupported );
182  }
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 303 of file XrdClEcHandler.hh.

306  {
307  ResponseHandler *substitHandler = new EcPgReadResponseHandler( handler );
308  XRootDStatus st = Read(offset, size, buffer, substitHandler, timeout);
309  return st;
310  }
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 335 of file XrdClEcHandler.hh.

341  {
342  if(! cksums.empty() )
343  {
344  const char *data = static_cast<const char*>( buffer );
345  std::vector<uint32_t> local_cksums;
346  XrdOucPgrwUtils::csCalc( data, offset, size, local_cksums );
347  if (data) delete data;
348  if (local_cksums != cksums)
349  return XRootDStatus( stError, errInvalidArgs, 0, "data and crc32c digests do not match." );
350  }
351  return Write(offset, size, buffer, handler, timeout);
352  }
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 288 of file XrdClEcHandler.hh.

293  {
294  if( !reader ) return XRootDStatus( stError, errInternal );
295 
296  reader->Read( offset, size, buffer, handler, timeout );
297  return XRootDStatus();
298  }
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 249 of file XrdClEcHandler.hh.

252  {
253 
254  if( !objcfg->nomtfile )
255  return fs.Stat( redir.GetPath(), handler, timeout );
256 
257  if( !force && statcache )
258  {
259  auto rsp = StatRsp( statcache->GetSize() );
260  Schedule( handler, rsp );
261  return XRootDStatus();
262  }
263 
264  if( writer )
265  {
266  statcache.reset( new StatInfo() );
267  statcache->SetSize( writer->GetSize() );
268  auto rsp = StatRsp( statcache->GetSize() );
269  Schedule( handler, rsp );
270  return XRootDStatus();
271  }
272 
273  if( reader )
274  {
275  statcache.reset( new StatInfo() );
276  statcache->SetSize( reader->GetSize() );
277  auto rsp = StatRsp( statcache->GetSize() );
278  Schedule( handler, rsp );
279  return XRootDStatus();
280  }
281 
282  return XRootDStatus( stError, errInvalidOp, 0, "File not open." );
283  }
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 316 of file XrdClEcHandler.hh.

321  {
322  if( cksHelper )
323  cksHelper->Update( buffer, size );
324 
325  if( !writer ) return XRootDStatus( stError, errInternal );
326  if( offset != curroff ) return XRootDStatus( stError, errNotSupported );
327  writer->Write( size, buffer, handler );
328  curroff += size;
329  return XRootDStatus();
330  }

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


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