XRootD
Loading...
Searching...
No Matches
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.
 
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 }
static Config & Instance()
Singleton access.

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)
void Close(XrdCl::ResponseHandler *handler, uint16_t timeout=0)
Close the data object.
void Close(XrdCl::ResponseHandler *handler, uint16_t timeout=0)
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errNotSupported
@ OpaqueFile
Implementation dependent.

References XrdEc::StrmWriter::Close(), 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:212
void Open(XrdCl::ResponseHandler *handler, uint16_t timeout=0)
void Open(XrdCl::ResponseHandler *handler, uint16_t timeout=0)
@ Read
Open only for reading.
@ Write
Open only for writing.
@ Update
Open for reading and writing.
std::vector< std::string > plgr

References XrdCl::OpenFlags::Delete, XrdCl::errNotSupported, XrdCl::URL::GetPath(), XrdCl::Status::IsOK(), XrdCl::OpenFlags::New, XrdEc::Reader::Open(), XrdEc::StrmWriter::Open(), XrdEc::ObjCfg::plgr, 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

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 }
void Read(uint64_t offset, uint32_t length, void *buffer, XrdCl::ResponseHandler *handler, uint16_t timeout)
const uint16_t errInternal
Internal error.

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
uint64_t GetSize()
const uint16_t errInvalidOp

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 }
void Write(uint32_t size, const void *buff, XrdCl::ResponseHandler *handler)

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


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