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 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 }
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 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.
const uint16_t errNotSupported
@ OpaqueFile
Implementation dependent.

References 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

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.

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

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: