XRootD
Loading...
Searching...
No Matches
XrdCl::FileStateHandler Class Reference

Handle the stateful operations. More...

#include <XrdClFileStateHandler.hh>

+ Collaboration diagram for XrdCl::FileStateHandler:

Public Types

enum  FileStatus {
  Closed ,
  Opened ,
  Error ,
  Recovering ,
  OpenInProgress ,
  CloseInProgress
}
 State of the file. More...
 

Public Member Functions

 FileStateHandler (bool useVirtRedirector, FilePlugIn *&plugin)
 
 FileStateHandler (FilePlugIn *&plugin)
 Constructor.
 
 ~FileStateHandler ()
 Destructor.
 
void AfterForkChild ()
 Called in the child process after the fork.
 
bool GetProperty (const std::string &name, std::string &value) const
 
bool IsOpen () const
 Check if the file is open.
 
bool IsSecure () const
 Check if the file is using an encrypted connection.
 
void Lock ()
 Lock the internal lock.
 
bool NeedFileTempl () const
 Checks if we need to set a file template.
 
void OnClose (const XRootDStatus *status)
 Process the results of the closing operation.
 
void OnOpen (const XRootDStatus *status, const OpenInfo *openInfo, const HostList *hostList)
 Process the results of the opening operation.
 
bool SetProperty (const std::string &name, const std::string &value)
 
void Tick (time_t now)
 Tick.
 
void TimeOutRequests (time_t now)
 Declare timeout on requests being recovered.
 
void UnLock ()
 Unlock the internal lock.
 

Static Public Member Functions

static XRootDStatus Checkpoint (std::shared_ptr< FileStateHandler > &self, kXR_char code, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus ChkptWrt (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus ChkptWrtV (std::shared_ptr< FileStateHandler > &self, uint64_t offset, const struct iovec *iov, int iovcnt, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Clone (std::shared_ptr< FileStateHandler > &self, const CloneLocations &locs, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Close (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus DelXAttr (std::shared_ptr< FileStateHandler > &self, const std::vector< std::string > &attrs, ResponseHandler *handler, time_t timeout=0)
 
static std::unique_ptr< ExportedFileTemplateExportTemplate (std::shared_ptr< FileStateHandler > &self)
 
static XRootDStatus Fcntl (std::shared_ptr< FileStateHandler > &self, QueryCode::Code queryCode, const Buffer &arg, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus GetXAttr (std::shared_ptr< FileStateHandler > &self, const std::vector< std::string > &attrs, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus ListXAttr (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, time_t timeout=0)
 
static void OnStateError (std::shared_ptr< FileStateHandler > &self, XRootDStatus *status, Message *message, ResponseHandler *userHandler, MessageSendParams &sendParams)
 Handle an error while sending a stateful message.
 
static void OnStateRedirection (std::shared_ptr< FileStateHandler > &self, const std::string &redirectUrl, Message *message, ResponseHandler *userHandler, MessageSendParams &sendParams)
 Handle stateful redirect.
 
static void OnStateResponse (std::shared_ptr< FileStateHandler > &self, XRootDStatus *status, Message *message, AnyObject *response, HostList *hostList)
 Handle stateful response.
 
static XRootDStatus Open (std::shared_ptr< FileStateHandler > &self, const std::string &url, OpenFlags::Flags flags, uint16_t mode, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus OpenUsingTemplate (std::shared_ptr< FileStateHandler > &self, ExportedFileTemplate *templ, const std::string &url, OpenFlags::Flags flags, uint16_t mode, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus PgRead (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus PgReadImpl (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, uint16_t flags, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus PgReadRetry (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, size_t pgnb, void *buffer, PgReadHandler *handler, time_t timeout=0)
 
static XRootDStatus PgWrite (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, std::vector< uint32_t > &cksums, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus PgWriteImpl (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, std::vector< uint32_t > &cksums, kXR_char flags, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus PgWriteRetry (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, uint32_t digest, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus PreRead (std::shared_ptr< FileStateHandler > &self, const TractList &tracts, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Read (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus ReadV (std::shared_ptr< FileStateHandler > &self, uint64_t offset, struct iovec *iov, int iovcnt, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus SetXAttr (std::shared_ptr< FileStateHandler > &self, const std::vector< xattr_t > &attrs, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Stat (std::shared_ptr< FileStateHandler > &self, bool force, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Sync (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Truncate (std::shared_ptr< FileStateHandler > &self, uint64_t size, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus TryOtherServer (std::shared_ptr< FileStateHandler > &self, time_t timeout)
 Try other data server.
 
static XRootDStatus VectorRead (std::shared_ptr< FileStateHandler > &self, const ChunkList &chunks, void *buffer, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus VectorWrite (std::shared_ptr< FileStateHandler > &self, const ChunkList &chunks, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Visa (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Write (std::shared_ptr< FileStateHandler > &self, uint64_t offset, Buffer &&buffer, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Write (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus Write (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, Optional< uint64_t > fdoff, int fd, ResponseHandler *handler, time_t timeout=0)
 
static XRootDStatus WriteV (std::shared_ptr< FileStateHandler > &self, uint64_t offset, const struct iovec *iov, int iovcnt, ResponseHandler *handler, time_t timeout=0)
 

Friends

class ::OpenHandler
 
class ::PgReadHandler
 
class ::PgReadRetryHandler
 
class ::PgReadSubstitutionHandler
 

Detailed Description

Handle the stateful operations.

Definition at line 95 of file XrdClFileStateHandler.hh.

Member Enumeration Documentation

◆ FileStatus

State of the file.

Enumerator
Closed 

The file is closed.

Opened 

Opening has succeeded.

Error 

Opening has failed.

Recovering 

Recovering from an error.

OpenInProgress 

Opening is in progress.

CloseInProgress 

Closing operation is in progress.

Definition at line 106 of file XrdClFileStateHandler.hh.

107 {
108 Closed,
109 Opened,
110 Error,
111 Recovering,
114 };
@ OpenInProgress
Opening is in progress.
@ CloseInProgress
Closing operation is in progress.
@ Opened
Opening has succeeded.
@ Recovering
Recovering from an error.

Constructor & Destructor Documentation

◆ FileStateHandler() [1/2]

XrdCl::FileStateHandler::FileStateHandler ( FilePlugIn *& plugin)

Constructor.

Definition at line 657 of file XrdClFileStateHandler.cc.

657 :
658 pFileState( Closed ),
659 pStatInfo( 0 ),
660 pFileUrl( 0 ),
661 pDataServer( 0 ),
662 pLoadBalancer( 0 ),
663 pStateRedirect( 0 ),
664 pWrtRecoveryRedir( 0 ),
665 pFileHandle( 0 ),
666 pOpenMode( 0 ),
667 pOpenFlags( OpenFlags::None ),
668 pSessionId( 0 ),
669 pDoRecoverRead( true ),
670 pDoRecoverWrite( true ),
671 pFollowRedirects( true ),
672 pUseVirtRedirector( true ),
673 pIsChannelEncrypted( false ),
674 pAllowBundledClose( false ),
675 pPlugin( plugin )
676 {
677 pFileHandle = new uint8_t[4];
678 ResetMonitoringVars();
681 pLFileHandler = new LocalFileHandler();
682 }
static FileTimer * GetFileTimer()
Get file timer task.
static ForkHandler * GetForkHandler()
Get the fork handler.
void RegisterFileObject(FileStateHandler *file)
Register a file state handler.
void RegisterFileObject(FileStateHandler *file)
Register a file object.

References Closed, XrdCl::DefaultEnv::GetFileTimer(), XrdCl::DefaultEnv::GetForkHandler(), XrdCl::FileTimer::RegisterFileObject(), and XrdCl::ForkHandler::RegisterFileObject().

+ Here is the call graph for this function:

◆ FileStateHandler() [2/2]

XrdCl::FileStateHandler::FileStateHandler ( bool useVirtRedirector,
FilePlugIn *& plugin )

Constructor

Parameters
useVirtRedirectorif true Metalink files will be treated as a VirtualRedirectors

Definition at line 690 of file XrdClFileStateHandler.cc.

690 :
691 pFileState( Closed ),
692 pStatInfo( 0 ),
693 pFileUrl( 0 ),
694 pDataServer( 0 ),
695 pLoadBalancer( 0 ),
696 pStateRedirect( 0 ),
697 pWrtRecoveryRedir( 0 ),
698 pFileHandle( 0 ),
699 pOpenMode( 0 ),
700 pOpenFlags( OpenFlags::None ),
701 pSessionId( 0 ),
702 pDoRecoverRead( true ),
703 pDoRecoverWrite( true ),
704 pFollowRedirects( true ),
705 pUseVirtRedirector( useVirtRedirector ),
706 pAllowBundledClose( false ),
707 pPlugin( plugin )
708 {
709 pFileHandle = new uint8_t[4];
710 ResetMonitoringVars();
713 pLFileHandler = new LocalFileHandler();
714 }

References Closed, XrdCl::DefaultEnv::GetFileTimer(), XrdCl::DefaultEnv::GetForkHandler(), XrdCl::FileTimer::RegisterFileObject(), and XrdCl::ForkHandler::RegisterFileObject().

+ Here is the call graph for this function:

◆ ~FileStateHandler()

XrdCl::FileStateHandler::~FileStateHandler ( )

Destructor.

Definition at line 719 of file XrdClFileStateHandler.cc.

720 {
721 //--------------------------------------------------------------------------
722 // This, in principle, should never ever happen. Except for the case
723 // when we're interfaced with ROOT that may call this desctructor from
724 // its garbage collector, from its __cxa_finalize, ie. after the XrdCl lib
725 // has been finalized by the linker. So, if we don't have the log object
726 // at this point we just give up the hope.
727 //--------------------------------------------------------------------------
728 if( DefaultEnv::GetLog() && pSessionId && !pDataServer->IsLocalFile() ) // if the file object was bound to a physical connection
729 DefaultEnv::GetPostMaster()->DecFileInstCnt( *pDataServer );
730
733
736
737 if( pFileState != Closed && DefaultEnv::GetLog() )
738 {
739 XRootDStatus st;
740 MonitorClose( &st );
741 ResetMonitoringVars();
742 }
743
744 // check if the logger is still there, this is only for root, as root might
745 // have unload us already so in this case we don't want to do anything
746 if( DefaultEnv::GetLog() && pUseVirtRedirector && pFileUrl && pFileUrl->IsMetalink() )
747 {
748 RedirectorRegistry& registry = RedirectorRegistry::Instance();
749 registry.Release( *pFileUrl );
750 }
751
752 delete pStatInfo;
753 delete pFileUrl;
754 delete pDataServer;
755 delete pLoadBalancer;
756 delete [] pFileHandle;
757 delete pLFileHandler;
758 }
static Log * GetLog()
Get default log.
static PostMaster * GetPostMaster()
Get default post master.
void UnRegisterFileObject(FileStateHandler *file)
Un-register a file state handler.
void UnRegisterFileObject(FileStateHandler *file)
void DecFileInstCnt(const URL &url)
Decrement file object instance count bound to this channel.
static RedirectorRegistry & Instance()
Returns reference to the single instance.

References Closed, XrdCl::PostMaster::DecFileInstCnt(), XrdCl::DefaultEnv::GetFileTimer(), XrdCl::DefaultEnv::GetForkHandler(), XrdCl::DefaultEnv::GetLog(), XrdCl::DefaultEnv::GetPostMaster(), XrdCl::RedirectorRegistry::Instance(), XrdCl::RedirectorRegistry::Release(), XrdCl::FileTimer::UnRegisterFileObject(), and XrdCl::ForkHandler::UnRegisterFileObject().

+ Here is the call graph for this function:

Member Function Documentation

◆ AfterForkChild()

void XrdCl::FileStateHandler::AfterForkChild ( )

Called in the child process after the fork.

Definition at line 2882 of file XrdClFileStateHandler.cc.

2883 {
2884 Log *log = DefaultEnv::GetLog();
2885
2886 if( pFileState == Closed || pFileState == Error )
2887 return;
2888
2889 if( (IsReadOnly() && pDoRecoverRead) ||
2890 (!IsReadOnly() && pDoRecoverWrite) )
2891 {
2892 log->Debug( FileMsg, "[%p@%s] Putting the file in recovery state in "
2893 "process %d", (void*)this, pFileUrl->GetObfuscatedURL().c_str(), getpid() );
2894 pFileState = Recovering;
2895 pInTheFly.clear();
2896 pToBeRecovered.clear();
2897 }
2898 else
2899 pFileState = Error;
2900 }
const uint64_t FileMsg
XrdSysError Log
Definition XrdConfig.cc:113

References Closed, XrdCl::Log::Debug(), Error, XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), and Recovering.

+ Here is the call graph for this function:

◆ Checkpoint()

XRootDStatus XrdCl::FileStateHandler::Checkpoint ( std::shared_ptr< FileStateHandler > & self,
kXR_char code,
ResponseHandler * handler,
time_t timeout = 0 )
static

Create a checkpoint

Parameters
handler: handler to be notified when the response arrives, the response parameter will hold a std::vector of XAttr objects
timeout: timeout value, if 0 the environment default will be used
Returns
: status of the operation

Definition at line 2191 of file XrdClFileStateHandler.cc.

2195 {
2196 XrdSysMutexHelper scopedLock( self->pMutex );
2197
2198 if( self->pFileState == Error ) return self->pStatus;
2199
2200 if( self->pFileState != Opened && self->pFileState != Recovering )
2201 return XRootDStatus( stError, errInvalidOp );
2202
2203 Log *log = DefaultEnv::GetLog();
2204 log->Debug( FileMsg, "[%p@%s] Sending a checkpoint command for handle %#x to %s",
2205 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2206 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2207
2208 Message *msg;
2209 ClientChkPointRequest *req;
2210 MessageUtils::CreateRequest( msg, req );
2211
2212 req->requestid = kXR_chkpoint;
2213 req->opcode = code;
2214 memcpy( req->fhandle, self->pFileHandle, 4 );
2215
2216 MessageSendParams params;
2217 params.timeout = timeout;
2218 params.followRedirects = false;
2219 params.stateful = true;
2220
2222
2224 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2225
2226 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2227 }
@ kXR_chkpoint
Definition XProtocol.hh:125
static void ProcessSendParams(MessageSendParams &sendParams)
Process sending params.
static void CreateRequest(Message *&msg, Request *&req, uint32_t payloadSize=0)
Create a message.
static void SetDescription(Message *msg)
Get the description of a message.
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errInvalidOp

References XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, ClientChkPointRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_chkpoint, ClientChkPointRequest::opcode, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientChkPointRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

+ Here is the call graph for this function:

◆ ChkptWrt()

XRootDStatus XrdCl::FileStateHandler::ChkptWrt ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
const void * buffer,
ResponseHandler * handler,
time_t timeout = 0 )
static

Checkpointed write - async

Parameters
offsetoffset from the beginning of the file
sizenumber of bytes to be written
buffera pointer to the buffer holding the data to be written
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 2240 of file XrdClFileStateHandler.cc.

2246 {
2247 XrdSysMutexHelper scopedLock( self->pMutex );
2248
2249 if( self->pFileState == Error ) return self->pStatus;
2250
2251 if( self->pFileState != Opened && self->pFileState != Recovering )
2252 return XRootDStatus( stError, errInvalidOp );
2253
2254 Log *log = DefaultEnv::GetLog();
2255 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
2256 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2257 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2258
2259 Message *msg;
2260 ClientChkPointRequest *req;
2261 MessageUtils::CreateRequest( msg, req, sizeof( ClientWriteRequest ) );
2262
2263 req->requestid = kXR_chkpoint;
2264 req->opcode = kXR_ckpXeq;
2265 req->dlen = 24; // as specified in the protocol specification
2266 memcpy( req->fhandle, self->pFileHandle, 4 );
2267
2268 ClientWriteRequest *wrtreq = (ClientWriteRequest*)msg->GetBuffer( sizeof(ClientChkPointRequest) );
2269 wrtreq->requestid = kXR_write;
2270 wrtreq->offset = offset;
2271 wrtreq->dlen = size;
2272 memcpy( wrtreq->fhandle, self->pFileHandle, 4 );
2273
2274 ChunkList *list = new ChunkList();
2275 list->push_back( ChunkInfo( 0, size, (char*)buffer ) );
2276
2277 MessageSendParams params;
2278 params.timeout = timeout;
2279 params.followRedirects = false;
2280 params.stateful = true;
2281 params.chunkList = list;
2282
2284
2286 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2287
2288 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2289 }
kXR_unt16 requestid
Definition XProtocol.hh:847
kXR_char fhandle[4]
Definition XProtocol.hh:848
static const int kXR_ckpXeq
Definition XProtocol.hh:218
@ kXR_write
Definition XProtocol.hh:132
std::vector< ChunkInfo > ChunkList
List of chunks.

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientChkPointRequest::dlen, ClientWriteRequest::dlen, XrdCl::errInvalidOp, Error, ClientChkPointRequest::fhandle, ClientWriteRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), kXR_chkpoint, kXR_ckpXeq, kXR_write, ClientWriteRequest::offset, ClientChkPointRequest::opcode, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientChkPointRequest::requestid, ClientWriteRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

+ Here is the call graph for this function:

◆ ChkptWrtV()

XRootDStatus XrdCl::FileStateHandler::ChkptWrtV ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
const struct iovec * iov,
int iovcnt,
ResponseHandler * handler,
time_t timeout = 0 )
static

Checkpointed WriteV - async

Parameters
offsetoffset from the beginning of the file
iovlist of the buffers to be written
iovcntnumber of buffers
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 then the environment default will be used
Returns
status of the operation

Write scattered buffers in one operation - async

Parameters
offsetoffset from the beginning of the file
iovlist of the buffers to be written
iovcntnumber of buffers
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 then the environment default will be used
Returns
status of the operation

Definition at line 2302 of file XrdClFileStateHandler.cc.

2308 {
2309 XrdSysMutexHelper scopedLock( self->pMutex );
2310
2311 if( self->pFileState == Error ) return self->pStatus;
2312
2313 if( self->pFileState != Opened && self->pFileState != Recovering )
2314 return XRootDStatus( stError, errInvalidOp );
2315
2316 Log *log = DefaultEnv::GetLog();
2317 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
2318 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2319 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2320
2321 Message *msg;
2322 ClientChkPointRequest *req;
2323 MessageUtils::CreateRequest( msg, req, sizeof( ClientWriteRequest ) );
2324
2325 req->requestid = kXR_chkpoint;
2326 req->opcode = kXR_ckpXeq;
2327 req->dlen = 24; // as specified in the protocol specification
2328 memcpy( req->fhandle, self->pFileHandle, 4 );
2329
2330 ChunkList *list = new ChunkList();
2331 uint32_t size = 0;
2332 for( int i = 0; i < iovcnt; ++i )
2333 {
2334 if( iov[i].iov_len == 0 ) continue;
2335 size += iov[i].iov_len;
2336 list->push_back( ChunkInfo( 0, iov[i].iov_len,
2337 (char*)iov[i].iov_base ) );
2338 }
2339
2340 ClientWriteRequest *wrtreq = (ClientWriteRequest*)msg->GetBuffer( sizeof(ClientChkPointRequest) );
2341 wrtreq->requestid = kXR_write;
2342 wrtreq->offset = offset;
2343 wrtreq->dlen = size;
2344 memcpy( wrtreq->fhandle, self->pFileHandle, 4 );
2345
2346 MessageSendParams params;
2347 params.timeout = timeout;
2348 params.followRedirects = false;
2349 params.stateful = true;
2350 params.chunkList = list;
2351
2353
2355 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2356
2357 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2358 }

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientChkPointRequest::dlen, ClientWriteRequest::dlen, XrdCl::errInvalidOp, Error, ClientChkPointRequest::fhandle, ClientWriteRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), kXR_chkpoint, kXR_ckpXeq, kXR_write, ClientWriteRequest::offset, ClientChkPointRequest::opcode, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientChkPointRequest::requestid, ClientWriteRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

+ Here is the call graph for this function:

◆ Clone()

XRootDStatus XrdCl::FileStateHandler::Clone ( std::shared_ptr< FileStateHandler > & self,
const CloneLocations & locs,
ResponseHandler * handler,
time_t timeout = 0 )
static

Clone ranges of files into the current file

Parameters
handler: handler to be notified when the response arrives.
timeout: timeout value, if 0 the environment default will be used
Returns
: status of the operation

Definition at line 3497 of file XrdClFileStateHandler.cc.

3501 {
3502 XrdSysMutexHelper scopedLock( self->pMutex );
3503
3504 if( self->pFileState == Error ) return self->pStatus;
3505
3506 if( self->pFileState != Opened && self->pFileState != Recovering )
3507 return XRootDStatus( stError, errInvalidOp );
3508
3509 if( !Utils::HasKSameFS( *self->pDataServer ) )
3510 return XRootDStatus( stError, errNotSupported );
3511
3512 Log *log = DefaultEnv::GetLog();
3513 log->Debug( FileMsg, "[%p@%s] Sending a clone command for handle %#x to %s",
3514 self.get(), self->pFileUrl->GetURL().c_str(),
3515 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
3516
3517 Message *msg;
3518 ClientReadRequest *req;
3519
3520 size_t nrange = locs.locations.size();
3521
3522 MessageUtils::CreateRequest( msg, req, sizeof(XrdProto::clone_list)*nrange );
3523
3524 req->requestid = kXR_clone;
3525 req->dlen = sizeof(XrdProto::clone_list)*nrange;
3526 memcpy( req->fhandle, self->pFileHandle, 4 );
3527
3528 XrdProto::clone_list *cl = (XrdProto::clone_list*)msg->GetBuffer( 24 );
3529 int idx=0;
3530 for(auto &loc: locs.locations)
3531 {
3532 if( !loc.file )
3533 return XRootDStatus( stError, errInvalidOp, 0,
3534 "Template file not available" );
3535
3536 FileStateHandlerTemplate *fht = dynamic_cast<FileStateHandlerTemplate*>(loc.file.get());
3537 if( !fht )
3538 return XRootDStatus( stError, errInvalidOp, 0,
3539 "Template file invalid" );
3540
3541 std::shared_ptr<FileStateHandler> tfp = fht->pTemplateFileWp.lock();
3542 if( !tfp )
3543 return XRootDStatus( stError, errInvalidOp, 0,
3544 "Template file object does not exist" );
3545
3546 XrdSysMutexHelper scopedLock( tfp->pMutex );
3547 if( tfp->pFileState != Opened )
3548 return XRootDStatus( stError, errInvalidOp, 0,
3549 "Template file not open" );
3550
3551 if( tfp->pSessionId != self->pSessionId )
3552 return XRootDStatus( stError, errInvalidOp, 0,
3553 "Clone source not at same location as destination" );
3554
3555 memcpy( cl[idx].srcFH, tfp->pFileHandle, 4 );
3556 cl[idx].srcOffs = loc.srcOffs;
3557 cl[idx].srcLen = loc.srcLen;
3558 cl[idx].dstOffs = loc.dstOffs;
3559 ++idx;
3560 }
3561
3563 MessageSendParams params;
3564 params.timeout = timeout;
3565 params.followRedirects = false;
3566 params.stateful = true;
3568 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
3569
3570 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
3571 }
kXR_unt16 requestid
Definition XProtocol.hh:680
kXR_char fhandle[4]
Definition XProtocol.hh:681
@ kXR_clone
Definition XProtocol.hh:145
static bool HasKSameFS(const XrdCl::URL &url)
Check if given server supports kXR_clone and kXR_samefs.
const uint16_t errNotSupported

References XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientReadRequest::dlen, XrdProto::clone_list::dstOffs, XrdCl::errInvalidOp, XrdCl::errNotSupported, Error, ClientReadRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), XrdCl::Utils::HasKSameFS(), kXR_clone, XrdCl::CloneLocations::locations, Opened, XrdCl::MessageUtils::ProcessSendParams(), XrdCl::FileStateHandlerTemplate::pTemplateFileWp, Recovering, ClientReadRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdProto::clone_list::srcLen, XrdProto::clone_list::srcOffs, XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

+ Here is the call graph for this function:

◆ Close()

XRootDStatus XrdCl::FileStateHandler::Close ( std::shared_ptr< FileStateHandler > & self,
ResponseHandler * handler,
time_t timeout = 0 )
static

Close the file object

Parameters
handlerhandler to be notified about the status of the operation
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 937 of file XrdClFileStateHandler.cc.

940 {
941 XrdSysMutexHelper scopedLock( self->pMutex );
942
943 //--------------------------------------------------------------------------
944 // Check if we can proceed
945 //--------------------------------------------------------------------------
946 if( self->pFileState == Error )
947 return self->pStatus;
948
949 if( self->pFileState == CloseInProgress )
950 return XRootDStatus( stError, errInProgress );
951
952 if( self->pFileState == Closed )
953 return XRootDStatus( stOK, suAlreadyDone );
954
955 if( self->pFileState == OpenInProgress || self->pFileState == Recovering )
956 return XRootDStatus( stError, errInvalidOp );
957
958 if( !self->pAllowBundledClose && !self->pInTheFly.empty() )
959 return XRootDStatus( stError, errInvalidOp );
960
961 self->pFileState = CloseInProgress;
962
963 Log *log = DefaultEnv::GetLog();
964 log->Debug( FileMsg, "[%p@%s] Sending a close command for handle %#x to %s",
965 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
966 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
967
968 //--------------------------------------------------------------------------
969 // Close the file
970 //--------------------------------------------------------------------------
971 Message *msg;
972 ClientCloseRequest *req;
973 MessageUtils::CreateRequest( msg, req );
974
975 req->requestid = kXR_close;
976 memcpy( req->fhandle, self->pFileHandle, 4 );
977
979 msg->SetSessionId( self->pSessionId );
980 CloseHandler *closeHandler = new CloseHandler( self, handler, msg );
981 MessageSendParams params;
982 params.timeout = timeout;
983 params.followRedirects = false;
984 params.stateful = true;
986
987 XRootDStatus st = self->IssueRequest( *self->pDataServer, msg, closeHandler, params );
988
989 if( !st.IsOK() )
990 {
991 // an invalid-session error means the connection to the server has been
992 // closed, which in turn means that the server closed the file already
993 if( st.code == errInvalidSession || st.code == errSocketDisconnected ||
994 st.code == errConnectionError || st.code == errSocketOptError ||
995 st.code == errPollerError || st.code == errSocketError )
996 {
997 self->pFileState = Closed;
998 ResponseJob *job = new ResponseJob( closeHandler, new XRootDStatus(),
999 nullptr, nullptr );
1001 return XRootDStatus();
1002 }
1003
1004 delete closeHandler;
1005 self->pStatus = st;
1006 self->pFileState = Error;
1007 return st;
1008 }
1009 return st;
1010 }
kXR_unt16 requestid
Definition XProtocol.hh:257
kXR_char fhandle[4]
Definition XProtocol.hh:258
@ kXR_close
Definition XProtocol.hh:116
void QueueJob(Job *job, void *arg=0)
Add a job to be run.
JobManager * GetJobManager()
Get the job manager object user by the post master.
const uint16_t errSocketOptError
const uint16_t errPollerError
const uint16_t errInProgress
const uint16_t stOK
Everything went OK.
const uint16_t suAlreadyDone
const uint16_t errConnectionError
const uint16_t errSocketError
const uint16_t errInvalidSession
const uint16_t errSocketDisconnected

References Closed, CloseInProgress, XrdCl::Status::code, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errConnectionError, XrdCl::errInProgress, XrdCl::errInvalidOp, XrdCl::errInvalidSession, Error, XrdCl::errPollerError, XrdCl::errSocketDisconnected, XrdCl::errSocketError, XrdCl::errSocketOptError, ClientCloseRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::PostMaster::GetJobManager(), XrdCl::DefaultEnv::GetLog(), XrdCl::DefaultEnv::GetPostMaster(), XrdCl::Status::IsOK(), kXR_close, OpenInProgress, XrdCl::MessageUtils::ProcessSendParams(), XrdCl::JobManager::QueueJob(), Recovering, ClientCloseRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::Message::SetSessionId(), XrdCl::MessageSendParams::stateful, XrdCl::stError, XrdCl::stOK, XrdCl::suAlreadyDone, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::Close().

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

◆ DelXAttr()

XRootDStatus XrdCl::FileStateHandler::DelXAttr ( std::shared_ptr< FileStateHandler > & self,
const std::vector< std::string > & attrs,
ResponseHandler * handler,
time_t timeout = 0 )
static

Delete extended attributes - async

Parameters
attrs: list of extended attributes to set
handler: handler to be notified when the response arrives, the response parameter will hold a std::vector of XAttrStatus objects
timeout: timeout value, if 0 the environment default will be used
Returns
: status of the operation

Definition at line 2130 of file XrdClFileStateHandler.cc.

2134 {
2135 XrdSysMutexHelper scopedLock( self->pMutex );
2136
2137 if( self->pFileState == Error ) return self->pStatus;
2138
2139 if( self->pFileState != Opened && self->pFileState != Recovering )
2140 return XRootDStatus( stError, errInvalidOp );
2141
2142 Log *log = DefaultEnv::GetLog();
2143 log->Debug( FileMsg, "[%p@%s] Sending a fattr del command for handle %#x to %s",
2144 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2145 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2146
2147 //--------------------------------------------------------------------------
2148 // Issue a new fattr del request
2149 //--------------------------------------------------------------------------
2150 return XAttrOperationImpl( self, kXR_fattrDel, 0, attrs, handler, timeout );
2151 }
@ kXR_fattrDel
Definition XProtocol.hh:300

References XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), kXR_fattrDel, Opened, Recovering, and XrdCl::stError.

Referenced by XrdCl::File::DelXAttr().

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

◆ ExportTemplate()

static std::unique_ptr< ExportedFileTemplate > XrdCl::FileStateHandler::ExportTemplate ( std::shared_ptr< FileStateHandler > & self)
inlinestatic

Provides an object that carries the infromation required by another FileStateHandler to clone the file.

Definition at line 788 of file XrdClFileStateHandler.hh.

790 {
791 return std::make_unique<FileStateHandlerTemplate>(self);
792 }

◆ Fcntl()

XRootDStatus XrdCl::FileStateHandler::Fcntl ( std::shared_ptr< FileStateHandler > & self,
QueryCode::Code queryCode,
const Buffer & arg,
ResponseHandler * handler,
time_t timeout = 0 )
static

Performs a custom operation on an open file, server implementation dependent - async

Parameters
queryCodequery code
argquery argument
handlerhandler to be notified when the response arrives, the response parameter will hold a Buffer object if the procedure is successful
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1996 of file XrdClFileStateHandler.cc.

2001 {
2002 XrdSysMutexHelper scopedLock( self->pMutex );
2003
2004 if( self->pFileState == Error ) return self->pStatus;
2005
2006 if( self->pFileState != Opened && self->pFileState != Recovering )
2007 return XRootDStatus( stError, errInvalidOp );
2008
2009 Log *log = DefaultEnv::GetLog();
2010 log->Debug( FileMsg, "[%p@%s] Sending a fcntl command for handle %#x to %s",
2011 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2012 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2013
2014 Message *msg;
2015 ClientQueryRequest *req;
2016 MessageUtils::CreateRequest( msg, req, arg.GetSize() );
2017
2018 req->requestid = kXR_query;
2019 req->infotype = queryCode;
2020 req->dlen = arg.GetSize();
2021 memcpy( req->fhandle, self->pFileHandle, 4 );
2022 msg->Append( arg.GetBuffer(), arg.GetSize(), sizeof(ClientQueryRequest) );
2023
2024 MessageSendParams params;
2025 params.timeout = timeout;
2026 params.followRedirects = false;
2027 params.stateful = true;
2029
2031 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2032
2033 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2034 }
kXR_unt16 requestid
Definition XProtocol.hh:666
kXR_char fhandle[4]
Definition XProtocol.hh:669
@ kXR_query
Definition XProtocol.hh:114

References XrdCl::Buffer::Append(), XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientQueryRequest::dlen, XrdCl::errInvalidOp, Error, ClientQueryRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), XrdCl::Buffer::GetSize(), ClientQueryRequest::infotype, kXR_query, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientQueryRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::Fcntl(), and XrdCl::File::Fcntl().

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

◆ GetProperty()

bool XrdCl::FileStateHandler::GetProperty ( const std::string & name,
std::string & value ) const

Get file property

See also
File::SetProperty for property list

Definition at line 2409 of file XrdClFileStateHandler.cc.

2411 {
2412 XrdSysMutexHelper scopedLock( pMutex );
2413 if( name == "ReadRecovery" )
2414 {
2415 if( pDoRecoverRead ) value = "true";
2416 else value = "false";
2417 return true;
2418 }
2419 else if( name == "WriteRecovery" )
2420 {
2421 if( pDoRecoverWrite ) value = "true";
2422 else value = "false";
2423 return true;
2424 }
2425 else if( name == "FollowRedirects" )
2426 {
2427 if( pFollowRedirects ) value = "true";
2428 else value = "false";
2429 return true;
2430 }
2431 else if( name == "DataServer" && pDataServer )
2432 { value = pDataServer->GetHostId(); return true; }
2433 else if( name == "LastURL" && pDataServer )
2434 { value = pDataServer->GetURL(); return true; }
2435 else if( name == "WrtRecoveryRedir" && pWrtRecoveryRedir )
2436 { value = pWrtRecoveryRedir->GetHostId(); return true; }
2437 value = "";
2438 return false;
2439 }

◆ GetXAttr()

XRootDStatus XrdCl::FileStateHandler::GetXAttr ( std::shared_ptr< FileStateHandler > & self,
const std::vector< std::string > & attrs,
ResponseHandler * handler,
time_t timeout = 0 )
static

Get extended attributes - async

Parameters
attrs: list of extended attributes to get
handler: handler to be notified when the response arrives, the response parameter will hold a std::vector of XAttr objects
timeout: timeout value, if 0 the environment default will be used
Returns
: status of the operation

Definition at line 2104 of file XrdClFileStateHandler.cc.

2108 {
2109 XrdSysMutexHelper scopedLock( self->pMutex );
2110
2111 if( self->pFileState == Error ) return self->pStatus;
2112
2113 if( self->pFileState != Opened && self->pFileState != Recovering )
2114 return XRootDStatus( stError, errInvalidOp );
2115
2116 Log *log = DefaultEnv::GetLog();
2117 log->Debug( FileMsg, "[%p@%s] Sending a fattr get command for handle %#x to %s",
2118 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2119 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2120
2121 //--------------------------------------------------------------------------
2122 // Issue a new fattr get request
2123 //--------------------------------------------------------------------------
2124 return XAttrOperationImpl( self, kXR_fattrGet, 0, attrs, handler, timeout );
2125 }
@ kXR_fattrGet
Definition XProtocol.hh:301

References XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), kXR_fattrGet, Opened, Recovering, and XrdCl::stError.

Referenced by XrdCl::File::GetXAttr().

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

◆ IsOpen()

bool XrdCl::FileStateHandler::IsOpen ( ) const

Check if the file is open.

Definition at line 2363 of file XrdClFileStateHandler.cc.

2364 {
2365 XrdSysMutexHelper scopedLock( pMutex );
2366
2367 if( pFileState == Opened || pFileState == Recovering )
2368 return true;
2369 return false;
2370 }

References Opened, and Recovering.

◆ IsSecure()

bool XrdCl::FileStateHandler::IsSecure ( ) const
inline

Check if the file is using an encrypted connection.

Definition at line 728 of file XrdClFileStateHandler.hh.

729 {
730 return pIsChannelEncrypted;
731 }

◆ ListXAttr()

XRootDStatus XrdCl::FileStateHandler::ListXAttr ( std::shared_ptr< FileStateHandler > & self,
ResponseHandler * handler,
time_t timeout = 0 )
static

List extended attributes - async

Parameters
handler: handler to be notified when the response arrives, the response parameter will hold a std::vector of XAttr objects
timeout: timeout value, if 0 the environment default will be used
Returns
: status of the operation

Definition at line 2156 of file XrdClFileStateHandler.cc.

2159 {
2160 XrdSysMutexHelper scopedLock( self->pMutex );
2161
2162 if( self->pFileState == Error ) return self->pStatus;
2163
2164 if( self->pFileState != Opened && self->pFileState != Recovering )
2165 return XRootDStatus( stError, errInvalidOp );
2166
2167 Log *log = DefaultEnv::GetLog();
2168 log->Debug( FileMsg, "[%p@%s] Sending a fattr list command for handle %#x to %s",
2169 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2170 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2171
2172 //--------------------------------------------------------------------------
2173 // Issue a new fattr get request
2174 //--------------------------------------------------------------------------
2175 static const std::vector<std::string> nothing;
2176 return XAttrOperationImpl( self, kXR_fattrList, ClientFattrRequest::aData,
2177 nothing, handler, timeout );
2178 }
@ kXR_fattrList
Definition XProtocol.hh:302
static const int aData
Definition XProtocol.hh:328

References ClientFattrRequest::aData, XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), kXR_fattrList, Opened, Recovering, and XrdCl::stError.

Referenced by XrdCl::File::ListXAttr().

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

◆ Lock()

void XrdCl::FileStateHandler::Lock ( )
inline

Lock the internal lock.

Definition at line 750 of file XrdClFileStateHandler.hh.

751 {
752 pMutex.Lock();
753 }

◆ NeedFileTempl()

bool XrdCl::FileStateHandler::NeedFileTempl ( ) const
inline

Checks if we need to set a file template.

Definition at line 797 of file XrdClFileStateHandler.hh.

798 {
799 if( (pOpenFlags & OpenFlags::Dup) || (pOpenFlags & OpenFlags::Samefs) )
800 return true;
801 return false;
802 }
@ Samefs
Open file on the same filesystem as another.
@ Dup
Open file duplicating content from another.

References XrdCl::OpenFlags::Dup, and XrdCl::OpenFlags::Samefs.

◆ OnClose()

void XrdCl::FileStateHandler::OnClose ( const XRootDStatus * status)

Process the results of the closing operation.

Definition at line 2591 of file XrdClFileStateHandler.cc.

2592 {
2593 Log *log = DefaultEnv::GetLog();
2594 XrdSysMutexHelper scopedLock( pMutex );
2595
2596 log->Debug(FileMsg, "[%p@%s] Close returned from %s with: %s", (void*)this,
2597 pFileUrl->GetObfuscatedURL().c_str(), pDataServer->GetHostId().c_str(),
2598 status->ToStr().c_str() );
2599
2600 log->Dump(FileMsg, "[%p@%s] Items in the fly %zu, queued for recovery %zu",
2601 (void*)this, pFileUrl->GetObfuscatedURL().c_str(), pInTheFly.size(), pToBeRecovered.size() );
2602
2603 MonitorClose( status );
2604 ResetMonitoringVars();
2605
2606 pStatus = *status;
2607 pFileState = Closed;
2608 }

References Closed, XrdCl::Log::Debug(), XrdCl::Log::Dump(), XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), and XrdCl::XRootDStatus::ToStr().

+ Here is the call graph for this function:

◆ OnOpen()

void XrdCl::FileStateHandler::OnOpen ( const XRootDStatus * status,
const OpenInfo * openInfo,
const HostList * hostList )

Process the results of the opening operation.

Definition at line 2444 of file XrdClFileStateHandler.cc.

2447 {
2448 Log *log = DefaultEnv::GetLog();
2449 XrdSysMutexHelper scopedLock( pMutex );
2450
2451 //--------------------------------------------------------------------------
2452 // Assign the data server and the load balancer
2453 //--------------------------------------------------------------------------
2454 std::string lastServer = pFileUrl->GetHostId();
2455 if( hostList )
2456 {
2457 delete pDataServer;
2458 delete pLoadBalancer;
2459 pLoadBalancer = 0;
2460 delete pWrtRecoveryRedir;
2461 pWrtRecoveryRedir = 0;
2462
2463 pDataServer = new URL( hostList->back().url );
2464 pDataServer->SetParams( pFileUrl->GetParams() );
2465 if( !( pUseVirtRedirector && pFileUrl->IsMetalink() ) ) pDataServer->SetPath( pFileUrl->GetPath() );
2466 lastServer = pDataServer->GetHostId();
2467 HostList::const_iterator itC;
2468 URL::ParamsMap params = pDataServer->GetParams();
2469 for( itC = hostList->begin(); itC != hostList->end(); ++itC )
2470 {
2471 MessageUtils::MergeCGI( params,
2472 itC->url.GetParams(),
2473 true );
2474 }
2475 pDataServer->SetParams( params );
2476
2477 HostList::const_reverse_iterator it;
2478 for( it = hostList->rbegin(); it != hostList->rend(); ++it )
2479 if( it->loadBalancer )
2480 {
2481 pLoadBalancer = new URL( it->url );
2482 break;
2483 }
2484
2485 for( it = hostList->rbegin(); it != hostList->rend(); ++it )
2486 if( it->flags & kXR_recoverWrts )
2487 {
2488 pWrtRecoveryRedir = new URL( it->url );
2489 break;
2490 }
2491 }
2492
2493 log->Debug(FileMsg, "[%p@%s] Open has returned with status %s",
2494 (void*)this, pFileUrl->GetObfuscatedURL().c_str(), status->ToStr().c_str() );
2495
2496 if( pDataServer && !pDataServer->IsLocalFile() )
2497 {
2498 //------------------------------------------------------------------------
2499 // Check if we are using a secure connection
2500 //------------------------------------------------------------------------
2501 XrdCl::AnyObject isencobj;
2502 XrdCl::XRootDStatus st = XrdCl::DefaultEnv::GetPostMaster()->
2503 QueryTransport( *pDataServer, XRootDQuery::IsEncrypted, isencobj );
2504 if( st.IsOK() )
2505 {
2506 bool *isenc;
2507 isencobj.Get( isenc );
2508 pIsChannelEncrypted = isenc ? *isenc : false;
2509 delete isenc;
2510 }
2511 }
2512
2513 //--------------------------------------------------------------------------
2514 // We have failed
2515 //--------------------------------------------------------------------------
2516 pStatus = *status;
2517 if( !pStatus.IsOK() || !openInfo )
2518 {
2519 log->Debug(FileMsg, "[%p@%s] Error while opening at %s: %s",
2520 (void*)this, pFileUrl->GetObfuscatedURL().c_str(), lastServer.c_str(),
2521 pStatus.ToStr().c_str() );
2522 FailQueuedMessages( pStatus );
2523 pFileState = Error;
2524
2525 //------------------------------------------------------------------------
2526 // Report to monitoring
2527 //------------------------------------------------------------------------
2528 Monitor *mon = DefaultEnv::GetMonitor();
2529 if( mon )
2530 {
2531 Monitor::ErrorInfo i;
2532 i.file = pFileUrl;
2533 i.status = status;
2534 i.opCode = Monitor::ErrorInfo::ErrOpen;
2535 mon->Event( Monitor::EvErrIO, &i );
2536 }
2537 }
2538 //--------------------------------------------------------------------------
2539 // We have succeeded
2540 //--------------------------------------------------------------------------
2541 else
2542 {
2543 //------------------------------------------------------------------------
2544 // if requested file colocation or dup was done, don't do again on reopen
2545 //------------------------------------------------------------------------
2546 pOpenFlags &= ~(OpenFlags::Dup | OpenFlags::Samefs);
2547
2548 //------------------------------------------------------------------------
2549 // Store the response info
2550 //------------------------------------------------------------------------
2551 openInfo->GetFileHandle( pFileHandle );
2552 pSessionId = openInfo->GetSessionId();
2553 if( openInfo->GetStatInfo() )
2554 {
2555 delete pStatInfo;
2556 pStatInfo = new StatInfo( *openInfo->GetStatInfo() );
2557 }
2558
2559 log->Debug( FileMsg, "[%p@%s] successfully opened at %s, handle: %#x, "
2560 "session id: %llu", (void*)this, pFileUrl->GetObfuscatedURL().c_str(),
2561 pDataServer->GetHostId().c_str(), *((uint32_t*)pFileHandle),
2562 (unsigned long long) pSessionId );
2563
2564 //------------------------------------------------------------------------
2565 // Inform the monitoring about opening success
2566 //------------------------------------------------------------------------
2567 gettimeofday( &pOpenTime, 0 );
2568 Monitor *mon = DefaultEnv::GetMonitor();
2569 if( mon )
2570 {
2571 Monitor::OpenInfo i;
2572 i.file = pFileUrl;
2573 i.dataServer = pDataServer->GetHostId();
2574 i.oFlags = pOpenFlags;
2575 i.oFlags2 = pOpenFlags>>16;
2576 i.fSize = pStatInfo ? pStatInfo->GetSize() : 0;
2577 mon->Event( Monitor::EvOpen, &i );
2578 }
2579
2580 //------------------------------------------------------------------------
2581 // Resend the queued messages if any
2582 //------------------------------------------------------------------------
2583 ReSendQueuedMessages();
2584 pFileState = Opened;
2585 }
2586 }
#define kXR_recoverWrts
void Get(Type &object)
Retrieve the object being held.
static Monitor * GetMonitor()
Get the monitor object.
static void MergeCGI(URL::ParamsMap &cgi1, const URL::ParamsMap &cgi2, bool replace)
Merge cgi2 into cgi1.
@ EvErrIO
ErrorInfo: An I/O error occurred.
@ EvOpen
OpenInfo: File opened.
std::map< std::string, std::string > ParamsMap
Definition XrdClURL.hh:33
bool IsOK() const
We're fine.
static const uint16_t IsEncrypted
returns true if the channel is encrypted

References XrdCl::Monitor::OpenInfo::dataServer, XrdCl::Log::Debug(), XrdCl::OpenFlags::Dup, XrdCl::Monitor::ErrorInfo::ErrOpen, Error, XrdCl::Monitor::Event(), XrdCl::Monitor::EvErrIO, XrdCl::Monitor::EvOpen, XrdCl::Monitor::ErrorInfo::file, XrdCl::Monitor::OpenInfo::file, XrdCl::FileMsg, XrdCl::Monitor::OpenInfo::fSize, XrdCl::AnyObject::Get(), XrdCl::OpenInfo::GetFileHandle(), XrdCl::DefaultEnv::GetLog(), XrdCl::DefaultEnv::GetMonitor(), XrdCl::DefaultEnv::GetPostMaster(), XrdCl::OpenInfo::GetSessionId(), XrdCl::OpenInfo::GetStatInfo(), XrdCl::XRootDQuery::IsEncrypted, XrdCl::Status::IsOK(), kXR_recoverWrts, XrdCl::MessageUtils::MergeCGI(), XrdCl::Monitor::OpenInfo::oFlags, XrdCl::Monitor::OpenInfo::oFlags2, XrdCl::Monitor::ErrorInfo::opCode, Opened, XrdCl::OpenFlags::Samefs, XrdCl::Monitor::ErrorInfo::status, and XrdCl::XRootDStatus::ToStr().

+ Here is the call graph for this function:

◆ OnStateError()

void XrdCl::FileStateHandler::OnStateError ( std::shared_ptr< FileStateHandler > & self,
XRootDStatus * status,
Message * message,
ResponseHandler * userHandler,
MessageSendParams & sendParams )
static

Handle an error while sending a stateful message.

Definition at line 2613 of file XrdClFileStateHandler.cc.

2618 {
2619 //--------------------------------------------------------------------------
2620 // It may be a redirection
2621 //--------------------------------------------------------------------------
2622 if( !status->IsOK() && status->code == errRedirect && self->pFollowRedirects )
2623 {
2624 static const std::string root = "root", xroot = "xroot", file = "file",
2625 roots = "roots", xroots = "xroots";
2626 std::string msg = status->GetErrorMessage();
2627 if( !msg.compare( 0, root.size(), root ) ||
2628 !msg.compare( 0, xroot.size(), xroot ) ||
2629 !msg.compare( 0, file.size(), file ) ||
2630 !msg.compare( 0, roots.size(), roots ) ||
2631 !msg.compare( 0, xroots.size(), xroots ) )
2632 {
2633 FileStateHandler::OnStateRedirection( self, msg, message, userHandler, sendParams );
2634 return;
2635 }
2636 }
2637
2638 //--------------------------------------------------------------------------
2639 // Handle error
2640 //--------------------------------------------------------------------------
2641 Log *log = DefaultEnv::GetLog();
2642 XrdSysMutexHelper scopedLock( self->pMutex );
2643 self->pInTheFly.erase( message );
2644
2645 log->Dump( FileMsg, "[%p@%s] File state error encountered. Message %s "
2646 "returned with %s", (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2647 message->GetObfuscatedDescription().c_str(), status->ToStr().c_str() );
2648
2649 //--------------------------------------------------------------------------
2650 // Report to monitoring
2651 //--------------------------------------------------------------------------
2652 Monitor *mon = DefaultEnv::GetMonitor();
2653 if( mon )
2654 {
2655 Monitor::ErrorInfo i;
2656 i.file = self->pFileUrl;
2657 i.status = status;
2658
2659 ClientRequest *req = (ClientRequest*)message->GetBuffer();
2660 switch( req->header.requestid )
2661 {
2662 case kXR_read: i.opCode = Monitor::ErrorInfo::ErrRead; break;
2663 case kXR_readv: i.opCode = Monitor::ErrorInfo::ErrReadV; break;
2664 case kXR_pgread: i.opCode = Monitor::ErrorInfo::ErrRead; break;
2665 case kXR_write: i.opCode = Monitor::ErrorInfo::ErrWrite; break;
2666 case kXR_writev: i.opCode = Monitor::ErrorInfo::ErrWriteV; break;
2667 case kXR_pgwrite: i.opCode = Monitor::ErrorInfo::ErrWrite; break;
2668 default: i.opCode = Monitor::ErrorInfo::ErrUnc;
2669 }
2670
2671 mon->Event( Monitor::EvErrIO, &i );
2672 }
2673
2674 //--------------------------------------------------------------------------
2675 // The message is not recoverable
2676 // (message using a kernel buffer is not recoverable by definition)
2677 //--------------------------------------------------------------------------
2678 if( !self->IsRecoverable( *status ) || sendParams.kbuff )
2679 {
2680 log->Error( FileMsg, "[%p@%s] Fatal file state error. Message %s "
2681 "returned with %s", (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2682 message->GetObfuscatedDescription().c_str(), status->ToStr().c_str() );
2683
2684 self->FailMessage( RequestData( message, userHandler, sendParams ), *status );
2685 delete status;
2686 return;
2687 }
2688
2689 //--------------------------------------------------------------------------
2690 // Insert the message to the recovery queue and start the recovery
2691 // procedure if we don't have any more message in the fly
2692 //--------------------------------------------------------------------------
2693 self->pCloseReason = *status;
2694 RecoverMessage( self, RequestData( message, userHandler, sendParams ) );
2695 delete status;
2696 }
struct ClientRequestHdr header
Definition XProtocol.hh:887
kXR_unt16 requestid
Definition XProtocol.hh:159
@ kXR_read
Definition XProtocol.hh:126
@ kXR_writev
Definition XProtocol.hh:144
@ kXR_readv
Definition XProtocol.hh:138
@ kXR_pgread
Definition XProtocol.hh:143
@ kXR_pgwrite
Definition XProtocol.hh:139
static void OnStateRedirection(std::shared_ptr< FileStateHandler > &self, const std::string &redirectUrl, Message *message, ResponseHandler *userHandler, MessageSendParams &sendParams)
Handle stateful redirect.
const uint16_t errRedirect
@ ErrUnc
Unclassified operation.

References XrdCl::Status::code, XrdCl::Log::Dump(), XrdCl::Log::Error(), XrdCl::Monitor::ErrorInfo::ErrRead, XrdCl::Monitor::ErrorInfo::ErrReadV, XrdCl::errRedirect, XrdCl::Monitor::ErrorInfo::ErrUnc, XrdCl::Monitor::ErrorInfo::ErrWrite, XrdCl::Monitor::ErrorInfo::ErrWriteV, XrdCl::Monitor::Event(), XrdCl::Monitor::EvErrIO, XrdCl::Monitor::ErrorInfo::file, XrdCl::FileMsg, XrdCl::Buffer::GetBuffer(), XrdCl::XRootDStatus::GetErrorMessage(), XrdCl::DefaultEnv::GetLog(), XrdCl::DefaultEnv::GetMonitor(), XrdCl::Message::GetObfuscatedDescription(), ClientRequest::header, XrdCl::Status::IsOK(), XrdCl::MessageSendParams::kbuff, kXR_pgread, kXR_pgwrite, kXR_read, kXR_readv, kXR_write, kXR_writev, OnStateRedirection(), XrdCl::Monitor::ErrorInfo::opCode, ClientRequestHdr::requestid, XrdCl::Monitor::ErrorInfo::status, and XrdCl::XRootDStatus::ToStr().

+ Here is the call graph for this function:

◆ OnStateRedirection()

void XrdCl::FileStateHandler::OnStateRedirection ( std::shared_ptr< FileStateHandler > & self,
const std::string & redirectUrl,
Message * message,
ResponseHandler * userHandler,
MessageSendParams & sendParams )
static

Handle stateful redirect.

Definition at line 2701 of file XrdClFileStateHandler.cc.

2706 {
2707 XrdSysMutexHelper scopedLock( self->pMutex );
2708 self->pInTheFly.erase( message );
2709
2710 //--------------------------------------------------------------------------
2711 // Register the state redirect url and append the new cgi information to
2712 // the file URL
2713 //--------------------------------------------------------------------------
2714 if( !self->pStateRedirect )
2715 {
2716 std::ostringstream o;
2717 self->pStateRedirect = new URL( redirectUrl );
2718 URL::ParamsMap params = self->pFileUrl->GetParams();
2719 MessageUtils::MergeCGI( params,
2720 self->pStateRedirect->GetParams(),
2721 false );
2722 self->pFileUrl->SetParams( params );
2723 }
2724
2725 RecoverMessage( self, RequestData( message, userHandler, sendParams ) );
2726 }

References XrdCl::MessageUtils::MergeCGI().

Referenced by OnStateError().

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

◆ OnStateResponse()

void XrdCl::FileStateHandler::OnStateResponse ( std::shared_ptr< FileStateHandler > & self,
XRootDStatus * status,
Message * message,
AnyObject * response,
HostList * hostList )
static

Handle stateful response.

Definition at line 2731 of file XrdClFileStateHandler.cc.

2736 {
2737 Log *log = DefaultEnv::GetLog();
2738 XrdSysMutexHelper scopedLock( self->pMutex );
2739
2740 log->Dump( FileMsg, "[%p@%s] Got state response for message %s",
2741 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2742 message->GetObfuscatedDescription().c_str() );
2743
2744 //--------------------------------------------------------------------------
2745 // Since this message may be the last "in-the-fly" and no recovery
2746 // is done if messages are in the fly, we may need to trigger recovery
2747 //--------------------------------------------------------------------------
2748 self->pInTheFly.erase( message );
2749 RunRecovery( self );
2750
2751 //--------------------------------------------------------------------------
2752 // Play with the actual response before returning it. This is a good
2753 // place to do caching in the future.
2754 //--------------------------------------------------------------------------
2755 ClientRequest *req = (ClientRequest*)message->GetBuffer();
2756 switch( req->header.requestid )
2757 {
2758 //------------------------------------------------------------------------
2759 // Cache the stat response
2760 //------------------------------------------------------------------------
2761 case kXR_stat:
2762 {
2763 StatInfo *info = 0;
2764 response->Get( info );
2765 delete self->pStatInfo;
2766 self->pStatInfo = new StatInfo( *info );
2767 break;
2768 }
2769
2770 //------------------------------------------------------------------------
2771 // Handle read response
2772 //------------------------------------------------------------------------
2773 case kXR_read:
2774 {
2775 ++self->pRCount;
2776 self->pRBytes += req->read.rlen;
2777 break;
2778 }
2779
2780 //------------------------------------------------------------------------
2781 // Handle read response
2782 //------------------------------------------------------------------------
2783 case kXR_pgread:
2784 {
2785 ++self->pRCount;
2786 self->pRBytes += req->pgread.rlen;
2787 break;
2788 }
2789
2790 //------------------------------------------------------------------------
2791 // Handle readv response
2792 //------------------------------------------------------------------------
2793 case kXR_readv:
2794 {
2795 ++self->pVRCount;
2796 size_t segs = req->header.dlen/sizeof(readahead_list);
2797 readahead_list *dataChunk = (readahead_list*)message->GetBuffer( 24 );
2798 for( size_t i = 0; i < segs; ++i )
2799 self->pVRBytes += dataChunk[i].rlen;
2800 self->pVSegs += segs;
2801 break;
2802 }
2803
2804 //------------------------------------------------------------------------
2805 // Handle write response
2806 //------------------------------------------------------------------------
2807 case kXR_write:
2808 {
2809 ++self->pWCount;
2810 self->pWBytes += req->write.dlen;
2811 break;
2812 }
2813
2814 //------------------------------------------------------------------------
2815 // Handle write response
2816 //------------------------------------------------------------------------
2817 case kXR_pgwrite:
2818 {
2819 ++self->pWCount;
2820 self->pWBytes += req->pgwrite.dlen;
2821 break;
2822 }
2823
2824 //------------------------------------------------------------------------
2825 // Handle writev response
2826 //------------------------------------------------------------------------
2827 case kXR_writev:
2828 {
2829 ++self->pVWCount;
2830 size_t size = req->header.dlen/sizeof(readahead_list);
2831 XrdProto::write_list *wrtList =
2832 reinterpret_cast<XrdProto::write_list*>( message->GetBuffer( 24 ) );
2833 for( size_t i = 0; i < size; ++i )
2834 self->pVWBytes += wrtList[i].wlen;
2835 break;
2836 }
2837 };
2838 }
struct ClientPgReadRequest pgread
Definition XProtocol.hh:903
struct ClientPgWriteRequest pgwrite
Definition XProtocol.hh:904
@ kXR_stat
Definition XProtocol.hh:130
struct ClientReadRequest read
Definition XProtocol.hh:909
struct ClientWriteRequest write
Definition XProtocol.hh:918

References ClientPgWriteRequest::dlen, ClientRequestHdr::dlen, ClientWriteRequest::dlen, XrdCl::Log::Dump(), XrdCl::FileMsg, XrdCl::AnyObject::Get(), XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), XrdCl::Message::GetObfuscatedDescription(), ClientRequest::header, kXR_pgread, kXR_pgwrite, kXR_read, kXR_readv, kXR_stat, kXR_write, kXR_writev, ClientRequest::pgread, ClientRequest::pgwrite, ClientRequest::read, ClientRequestHdr::requestid, ClientPgReadRequest::rlen, ClientReadRequest::rlen, readahead_list::rlen, XrdProto::write_list::wlen, and ClientRequest::write.

+ Here is the call graph for this function:

◆ Open()

XRootDStatus XrdCl::FileStateHandler::Open ( std::shared_ptr< FileStateHandler > & self,
const std::string & url,
OpenFlags::Flags flags,
uint16_t mode,
ResponseHandler * handler,
time_t timeout = 0 )
static

Open the file pointed to by the given URL

Parameters
urlurl of the file to be opened
flagsOpenFlags::Flags
modeAccess::Mode for new files, 0 otherwise
handlerhandler to be notified about the status of the operation
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 787 of file XrdClFileStateHandler.cc.

793 {
794 self->pTemplateFileWp.reset();
795 return OpenImpl( self, url, flags, mode, handler, timeout );
796 }

Referenced by XrdCl::File::Open().

+ Here is the caller graph for this function:

◆ OpenUsingTemplate()

XRootDStatus XrdCl::FileStateHandler::OpenUsingTemplate ( std::shared_ptr< FileStateHandler > & self,
ExportedFileTemplate * templ,
const std::string & url,
OpenFlags::Flags flags,
uint16_t mode,
ResponseHandler * handler,
time_t timeout = 0 )
static

Open the file pointed to by the given URL Alows one to specify template file. Required if using Dup or Samefs flags.

Parameters
urlurl of the file to be opened
templTemplate of file to colocate with or duplicate
flagsOpenFlags::Flags
modeAccess::Mode for new files, 0 otherwise
handlerhandler to be notified about the status of the operation
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 763 of file XrdClFileStateHandler.cc.

771 {
772 if( !templ )
773 return XRootDStatus( stError, errInvalidArgs, 0, "Template file not available" );
774
775 FileStateHandlerTemplate *fht = dynamic_cast<FileStateHandlerTemplate*>( templ );
776 if( !fht )
777 return XRootDStatus( stError, errInvalidArgs, 0, "Template file invalid" );
778
779 self->pTemplateFileWp = fht->pTemplateFileWp;
780
781 return OpenImpl( self, url, flags, mode, handler, timeout );
782 }
const uint16_t errInvalidArgs

References XrdCl::errInvalidArgs, XrdCl::FileStateHandlerTemplate::pTemplateFileWp, and XrdCl::stError.

Referenced by XrdCl::File::OpenUsingTemplate().

+ Here is the caller graph for this function:

◆ PgRead()

XRootDStatus XrdCl::FileStateHandler::PgRead ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
void * buffer,
ResponseHandler * handler,
time_t timeout = 0 )
static

Read data pages at a given offset

Parameters
offset: offset from the beginning of the file (Note: has to 4KB aligned)
size: buffer size
buffer: a pointer to buffer big enough to hold the data
handler: handler to be notified when the response arrives, the response parameter will hold a PgReadInfo object if the procedure was successful
timeout: timeout value, if 0 environment default will be used
Returns
: status of the operation

Definition at line 1185 of file XrdClFileStateHandler.cc.

1191 {
1192 int issupported = true;
1193 AnyObject obj;
1194 XRootDStatus st1 = DefaultEnv::GetPostMaster()->QueryTransport( *self->pDataServer, XRootDQuery::ServerFlags, obj );
1195 int protver = 0;
1196 XRootDStatus st2 = Utils::GetProtocolVersion( *self->pDataServer, protver );
1197 if( st1.IsOK() && st2.IsOK() )
1198 {
1199 int *ptr = 0;
1200 obj.Get( ptr );
1201 issupported = ( ptr && (*ptr & kXR_suppgrw) ) && ( protver >= kXR_PROTPGRWVERSION );
1202 delete ptr;
1203 }
1204 else
1205 issupported = false;
1206
1207 if( !issupported )
1208 {
1209 DefaultEnv::GetLog()->Debug( FileMsg, "[%p@%s] PgRead not supported; substituting with Read.",
1210 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str() );
1211 ResponseHandler *substitHandler = new PgReadSubstitutionHandler( self, handler );
1212 auto st = Read( self, offset, size, buffer, substitHandler, timeout );
1213 if( !st.IsOK() ) delete substitHandler;
1214 return st;
1215 }
1216
1217 ResponseHandler* pgHandler = new PgReadHandler( self, handler, offset );
1218 auto st = PgReadImpl( self, offset, size, buffer, PgReadFlags::None, pgHandler, timeout );
1219 if( !st.IsOK() ) delete pgHandler;
1220 return st;
1221 }
#define kXR_suppgrw
#define kXR_PROTPGRWVERSION
Definition XProtocol.hh:73
static XRootDStatus Read(std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, time_t timeout=0)
static XRootDStatus PgReadImpl(std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, uint16_t flags, ResponseHandler *handler, time_t timeout=0)
void Debug(uint64_t topic, const char *format,...)
Print a debug message.
Definition XrdClLog.cc:282
Status QueryTransport(const URL &url, uint16_t query, AnyObject &result)
static XrdCl::XRootDStatus GetProtocolVersion(const XrdCl::URL url, int &protver)
static const uint16_t ServerFlags
returns server flags

References ::PgReadHandler, ::PgReadSubstitutionHandler, XrdCl::Log::Debug(), XrdCl::FileMsg, XrdCl::AnyObject::Get(), XrdCl::DefaultEnv::GetLog(), XrdCl::DefaultEnv::GetPostMaster(), XrdCl::Utils::GetProtocolVersion(), XrdCl::Status::IsOK(), kXR_PROTPGRWVERSION, kXR_suppgrw, XrdCl::PgReadFlags::None, PgReadImpl(), XrdCl::PostMaster::QueryTransport(), Read(), and XrdCl::XRootDQuery::ServerFlags.

Referenced by XrdCl::File::PgRead().

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

◆ PgReadImpl()

XRootDStatus XrdCl::FileStateHandler::PgReadImpl ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
void * buffer,
uint16_t flags,
ResponseHandler * handler,
time_t timeout = 0 )
static

Read data pages at a given offset (actual implementation)

Parameters
offset: offset from the beginning of the file (Note: has to 4KB aligned)
size: buffer size
buffer: a pointer to buffer big enough to hold the data
flags: PgRead flags
handler: handler to be notified when the response arrives, the response parameter will hold a PgReadInfo object if the procedure was successful
timeout: timeout value, if 0 environment default will be used
Returns
: status of the operation

Definition at line 1241 of file XrdClFileStateHandler.cc.

1248 {
1249 XrdSysMutexHelper scopedLock( self->pMutex );
1250
1251 if( self->pFileState == Error ) return self->pStatus;
1252
1253 if( self->pFileState != Opened && self->pFileState != Recovering )
1254 return XRootDStatus( stError, errInvalidOp );
1255
1256 Log *log = DefaultEnv::GetLog();
1257 log->Debug( FileMsg, "[%p@%s] Sending a pgread command for handle %#x to %s",
1258 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1259 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1260
1261 Message *msg;
1262 ClientPgReadRequest *req;
1263 MessageUtils::CreateRequest( msg, req, sizeof( ClientPgReadReqArgs ) );
1264
1265 req->requestid = kXR_pgread;
1266 req->offset = offset;
1267 req->rlen = size;
1268 memcpy( req->fhandle, self->pFileHandle, 4 );
1269
1270 //--------------------------------------------------------------------------
1271 // Now adjust the message size so it can hold PgRead arguments
1272 //--------------------------------------------------------------------------
1273 req->dlen = sizeof( ClientPgReadReqArgs );
1274 void *newBuf = msg->GetBuffer( sizeof( ClientPgReadRequest ) );
1275 memset( newBuf, 0, sizeof( ClientPgReadReqArgs ) );
1276 ClientPgReadReqArgs *args = reinterpret_cast<ClientPgReadReqArgs*>(
1277 msg->GetBuffer( sizeof( ClientPgReadRequest ) ) );
1278 args->reqflags = flags;
1279
1280 ChunkList *list = new ChunkList();
1281 list->push_back( ChunkInfo( offset, size, buffer ) );
1282
1284 MessageSendParams params;
1285 params.timeout = timeout;
1286 params.followRedirects = false;
1287 params.stateful = true;
1288 params.chunkList = list;
1290 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1291
1292 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1293 }
kXR_char fhandle[4]
Definition XProtocol.hh:543

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientPgReadRequest::dlen, XrdCl::errInvalidOp, Error, ClientPgReadRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), kXR_pgread, ClientPgReadRequest::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientPgReadReqArgs::reqflags, ClientPgReadRequest::requestid, ClientPgReadRequest::rlen, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by PgRead(), and PgReadRetry().

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

◆ PgReadRetry()

XRootDStatus XrdCl::FileStateHandler::PgReadRetry ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
size_t pgnb,
void * buffer,
PgReadHandler * handler,
time_t timeout = 0 )
static

Retry reading one page of data at a given offset

Parameters
offset: offset from the beginning of the file (Note: has to 4KB aligned)
size: buffer size
buffer: a pointer to buffer big enough to hold the data
handler: handler to be notified when the response arrives
timeout: timeout value, if 0 environment default will be used
Returns
: status of the operation

Definition at line 1223 of file XrdClFileStateHandler.cc.

1230 {
1231 if( size > (uint32_t)XrdSys::PageSize )
1232 return XRootDStatus( stError, errInvalidArgs, EINVAL,
1233 "PgRead retry size exceeded 4KB." );
1234
1235 ResponseHandler *retryHandler = new PgReadRetryHandler( handler, pgnb );
1236 XRootDStatus st = PgReadImpl( self, offset, size, buffer, PgReadFlags::Retry, retryHandler, timeout );
1237 if( !st.IsOK() ) delete retryHandler;
1238 return st;
1239 }
static const int PageSize

References ::PgReadHandler, ::PgReadRetryHandler, XrdCl::errInvalidArgs, XrdCl::Status::IsOK(), XrdSys::PageSize, PgReadImpl(), XrdCl::PgReadFlags::Retry, and XrdCl::stError.

+ Here is the call graph for this function:

◆ PgWrite()

XRootDStatus XrdCl::FileStateHandler::PgWrite ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
const void * buffer,
std::vector< uint32_t > & cksums,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write number of pages at a given offset - async

Parameters
offsetoffset from the beginning of the file
sizebuffer size
buffera pointer to a buffer holding data pages
cksumsthe crc32c checksums for each 4KB page
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1422 of file XrdClFileStateHandler.cc.

1429 {
1430 //--------------------------------------------------------------------------
1431 // Resolve timeout value
1432 //--------------------------------------------------------------------------
1433 if( timeout == 0 )
1434 {
1435 int val = DefaultRequestTimeout;
1436 XrdCl::DefaultEnv::GetEnv()->GetInt( "RequestTimeout", val );
1437 timeout = val;
1438 }
1439
1440 //--------------------------------------------------------------------------
1441 // Validate the digest vector size
1442 //--------------------------------------------------------------------------
1443 if( cksums.empty() )
1444 {
1445 const char *data = static_cast<const char*>( buffer );
1446 XrdOucPgrwUtils::csCalc( data, offset, size, cksums );
1447 }
1448 else
1449 {
1450 size_t crc32cCnt = XrdOucPgrwUtils::csNum( offset, size );
1451 if( crc32cCnt != cksums.size() )
1452 return XRootDStatus( stError, errInvalidArgs, 0, "Wrong number of crc32c digests." );
1453 }
1454
1455 //--------------------------------------------------------------------------
1456 // Create a context for PgWrite operation
1457 //--------------------------------------------------------------------------
1458 struct pgwrt_t
1459 {
1460 pgwrt_t( ResponseHandler *h ) : handler( h ), status( nullptr )
1461 {
1462 }
1463
1464 ~pgwrt_t()
1465 {
1466 if( handler )
1467 {
1468 // if all retries were successful no error status was set
1469 if( !status ) status = new XRootDStatus();
1470 handler->HandleResponse( status, nullptr );
1471 }
1472 }
1473
1474 static size_t GetPgNb( uint64_t pgoff, uint64_t offset, uint32_t fstpglen )
1475 {
1476 if( pgoff == offset ) return 0; // we need this if statement because we operate on unsigned integers
1477 return ( pgoff - ( offset + fstpglen ) ) / XrdSys::PageSize + 1;
1478 }
1479
1480 inline void SetStatus( XRootDStatus* s )
1481 {
1482 if( !status ) status = s;
1483 else delete s;
1484 }
1485
1486 ResponseHandler *handler;
1487 XRootDStatus *status;
1488 };
1489 auto pgwrt = std::make_shared<pgwrt_t>( handler );
1490
1491 int fLen, lLen;
1492 XrdOucPgrwUtils::csNum( offset, size, fLen, lLen );
1493 uint32_t fstpglen = fLen;
1494
1495 time_t start = ::time( nullptr );
1496 auto h = ResponseHandler::Wrap( [=]( XrdCl::XRootDStatus *s, XrdCl::AnyObject *r ) mutable
1497 {
1498 std::unique_ptr<AnyObject> scoped( r );
1499 // if the request failed simply pass the status to the
1500 // user handler
1501 if( !s->IsOK() )
1502 {
1503 pgwrt->SetStatus( s );
1504 return; // pgwrt destructor will call the handler
1505 }
1506 // also if the request was sucessful and there were no
1507 // corrupted pages pass the status to the user handler
1508 RetryInfo *inf = nullptr;
1509 r->Get( inf );
1510 if( !inf->NeedRetry() )
1511 {
1512 pgwrt->SetStatus( s );
1513 return; // pgwrt destructor will call the handler
1514 }
1515 delete s;
1516 // first adjust the timeout value
1517 time_t elapsed = ::time( nullptr ) - start;
1518 if( elapsed >= timeout )
1519 {
1520 pgwrt->SetStatus( new XRootDStatus( stError, errOperationExpired ) );
1521 return; // pgwrt destructor will call the handler
1522 }
1523 else timeout -= elapsed;
1524 // retransmit the corrupted pages
1525 for( size_t i = 0; i < inf->Size(); ++i )
1526 {
1527 auto tpl = inf->At( i );
1528 uint64_t pgoff = std::get<0>( tpl );
1529 uint32_t pglen = std::get<1>( tpl );
1530 const void *pgbuf = static_cast<const char*>( buffer ) + ( pgoff - offset );
1531 uint32_t pgdigest = cksums[pgwrt_t::GetPgNb( pgoff, offset, fstpglen )];
1532 auto h = ResponseHandler::Wrap( [=]( XrdCl::XRootDStatus *s, XrdCl::AnyObject *r ) mutable
1533 {
1534 std::unique_ptr<AnyObject> scoped( r );
1535 // if we failed simply set the status
1536 if( !s->IsOK() )
1537 {
1538 pgwrt->SetStatus( s );
1539 return; // the destructor will call the handler
1540 }
1541 delete s;
1542 // otherwise check if the data were not corrupted again
1543 RetryInfo *inf = nullptr;
1544 r->Get( inf );
1545 if( inf->NeedRetry() ) // so we failed in the end
1546 {
1547 DefaultEnv::GetLog()->Warning( FileMsg, "[%p@%s] Failed retransmitting corrupted "
1548 "page: pgoff=%llu, pglen=%u, pgdigest=%u", (void*)self.get(),
1549 self->pFileUrl->GetObfuscatedURL().c_str(), (unsigned long long) pgoff, pglen, pgdigest );
1550 pgwrt->SetStatus( new XRootDStatus( stError, errDataError, 0,
1551 "Failed to retransmit corrupted page" ) );
1552 }
1553 else
1554 DefaultEnv::GetLog()->Info( FileMsg, "[%p@%s] Succesfuly retransmitted corrupted "
1555 "page: pgoff=%llu, pglen=%u, pgdigest=%u", (void*)self.get(),
1556 self->pFileUrl->GetObfuscatedURL().c_str(), (unsigned long long) pgoff, pglen, pgdigest );
1557 } );
1558 auto st = PgWriteRetry( self, pgoff, pglen, pgbuf, pgdigest, h, timeout );
1559 if( !st.IsOK() ) pgwrt->SetStatus( new XRootDStatus( st ) );
1560 DefaultEnv::GetLog()->Info( FileMsg, "[%p@%s] Retransmitting corrupted page: "
1561 "pgoff=%llu, pglen=%u, pgdigest=%u", (void*)self.get(),
1562 self->pFileUrl->GetObfuscatedURL().c_str(), (unsigned long long) pgoff, pglen, pgdigest );
1563 }
1564 } );
1565
1566 auto st = PgWriteImpl( self, offset, size, buffer, cksums, 0, h, timeout );
1567 if( !st.IsOK() )
1568 {
1569 pgwrt->handler = nullptr;
1570 delete h;
1571 }
1572 return st;
1573 }
static Env * GetEnv()
Get default client environment.
bool GetInt(const std::string &key, int &value)
Definition XrdClEnv.cc:89
static XRootDStatus PgWriteImpl(std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, std::vector< uint32_t > &cksums, kXR_char flags, ResponseHandler *handler, time_t timeout=0)
static XRootDStatus PgWriteRetry(std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, uint32_t digest, ResponseHandler *handler, time_t timeout=0)
void Warning(uint64_t topic, const char *format,...)
Report a warning.
Definition XrdClLog.cc:248
void Info(uint64_t topic, const char *format,...)
Print an info.
Definition XrdClLog.cc:265
static ResponseHandler * Wrap(std::function< void(XRootDStatus &, AnyObject &)> func)
static void csCalc(const char *data, off_t offs, size_t count, uint32_t *csval)
static int csNum(off_t offs, int count)
Compute the required size of a checksum vector based on offset & length.
const uint16_t errOperationExpired
const uint16_t errDataError
data is corrupted
const int DefaultRequestTimeout

References XrdCl::RetryInfo::At(), XrdOucPgrwUtils::csCalc(), XrdOucPgrwUtils::csNum(), XrdCl::DefaultRequestTimeout, XrdCl::errDataError, XrdCl::errInvalidArgs, XrdCl::errOperationExpired, XrdCl::FileMsg, XrdCl::AnyObject::Get(), XrdCl::DefaultEnv::GetEnv(), XrdCl::Env::GetInt(), XrdCl::DefaultEnv::GetLog(), XrdCl::ResponseHandler::HandleResponse(), XrdCl::Log::Info(), XrdCl::Status::IsOK(), XrdCl::RetryInfo::NeedRetry(), XrdSys::PageSize, PgWriteImpl(), PgWriteRetry(), XrdCl::RetryInfo::Size(), XrdCl::stError, XrdCl::Log::Warning(), and XrdCl::ResponseHandler::Wrap().

Referenced by XrdCl::File::PgWrite().

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

◆ PgWriteImpl()

XRootDStatus XrdCl::FileStateHandler::PgWriteImpl ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
const void * buffer,
std::vector< uint32_t > & cksums,
kXR_char flags,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write number of pages at a given offset - async

Parameters
offsetoffset from the beginning of the file
sizebuffer size
buffera pointer to a buffer holding data pages
cksumsthe crc32c checksums for each 4KB page
flagsPgWrite flags
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1593 of file XrdClFileStateHandler.cc.

1601 {
1602 XrdSysMutexHelper scopedLock( self->pMutex );
1603
1604 if( self->pFileState == Error ) return self->pStatus;
1605
1606 if( self->pFileState != Opened && self->pFileState != Recovering )
1607 return XRootDStatus( stError, errInvalidOp );
1608
1609 Log *log = DefaultEnv::GetLog();
1610 log->Debug( FileMsg, "[%p@%s] Sending a pgwrite command for handle %#x to %s",
1611 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1612 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1613
1614 //--------------------------------------------------------------------------
1615 // Create the message
1616 //--------------------------------------------------------------------------
1617 Message *msg;
1618 ClientPgWriteRequest *req;
1619 MessageUtils::CreateRequest( msg, req );
1620
1621 req->requestid = kXR_pgwrite;
1622 req->offset = offset;
1623 req->dlen = size + cksums.size() * sizeof( uint32_t );
1624 req->reqflags = flags;
1625 memcpy( req->fhandle, self->pFileHandle, 4 );
1626
1627 ChunkList *list = new ChunkList();
1628 list->push_back( ChunkInfo( offset, size, (char*)buffer ) );
1629
1630 MessageSendParams params;
1631 params.timeout = timeout;
1632 params.followRedirects = false;
1633 params.stateful = true;
1634 params.chunkList = list;
1635 params.crc32cDigests.swap( cksums );
1636
1638
1640 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1641
1642 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1643 }
kXR_char fhandle[4]
Definition XProtocol.hh:565

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageSendParams::crc32cDigests, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientPgWriteRequest::dlen, XrdCl::errInvalidOp, Error, ClientPgWriteRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_pgwrite, ClientPgWriteRequest::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientPgWriteRequest::reqflags, ClientPgWriteRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by PgWrite(), and PgWriteRetry().

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

◆ PgWriteRetry()

XRootDStatus XrdCl::FileStateHandler::PgWriteRetry ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
const void * buffer,
uint32_t digest,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write number of pages at a given offset - async

Parameters
offsetoffset from the beginning of the file
sizebuffer size
buffera pointer to a buffer holding data pages
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1578 of file XrdClFileStateHandler.cc.

1585 {
1586 std::vector<uint32_t> cksums{ digest };
1587 return PgWriteImpl( self, offset, size, buffer, cksums, PgReadFlags::Retry, handler, timeout );
1588 }

References PgWriteImpl(), and XrdCl::PgReadFlags::Retry.

Referenced by PgWrite().

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

◆ PreRead()

XRootDStatus XrdCl::FileStateHandler::PreRead ( std::shared_ptr< FileStateHandler > & self,
const TractList & tracts,
ResponseHandler * handler,
time_t timeout = 0 )
static

Preread data tracts at given offsets - async

Parameters
tractsA vector of offset/lengths of data tracts to preread.
handlerhandler to be notified when the response arrives. Since no data is transmitted, there is no response parameter.
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1072 of file XrdClFileStateHandler.cc.

1076 {
1077 //--------------------------------------------------------------------------
1078 // Sanity check
1079 //--------------------------------------------------------------------------
1080 XrdSysMutexHelper scopedLock( self->pMutex );
1081
1082 if( self->pFileState == Error ) return self->pStatus;
1083
1084 if( self->pFileState != Opened && self->pFileState != Recovering )
1085 return XRootDStatus( stError, errInvalidOp );
1086
1087 Log *log = DefaultEnv::GetLog();
1088 log->Debug( FileMsg, "[%p@%s] Sending an read+preread command for handle %#x to %s",
1089 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1090 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1091
1092 //--------------------------------------------------------------------------
1093 // Build the message
1094 //--------------------------------------------------------------------------
1095 Message *msg;
1096 ClientReadRequest *req;
1097 MessageUtils::CreateRequest( msg, req, sizeof(readahead_list)*tracts.size() + 8 );
1098
1099 req->requestid = kXR_read;
1100 req->offset = 0;
1101 req->rlen = 0;
1102 memcpy( req->fhandle, self->pFileHandle, 4 );
1103 req->dlen = sizeof(readahead_list)*tracts.size() + 8;
1104
1105 static char dummyBuff[8];
1106 ChunkList *list = new ChunkList();
1107 list->push_back( ChunkInfo( 0, 0, dummyBuff ) );
1108
1109 //--------------------------------------------------------------------------
1110 // Copy the tract info
1111 //--------------------------------------------------------------------------
1112 readahead_list *dataTract = (readahead_list*)msg->GetBuffer( 24 + 8 );
1113 for( size_t i = 0; i < tracts.size(); ++i )
1114 {
1115 dataTract[i].rlen = tracts[i].length;
1116 dataTract[i].offset = tracts[i].offset;
1117 memcpy( dataTract[i].fhandle, req->fhandle, 4 );
1118 }
1119
1120 //--------------------------------------------------------------------------
1121 // Send the message
1122 //--------------------------------------------------------------------------
1123 MessageSendParams params;
1124 params.timeout = timeout;
1125 params.followRedirects = false;
1126 params.stateful = true;
1127 params.chunkList = list;
1129
1131 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1132
1133 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1134 }
kXR_int32 rlen
Definition XProtocol.hh:696
kXR_int64 offset
Definition XProtocol.hh:697

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientReadRequest::dlen, XrdCl::errInvalidOp, Error, ClientReadRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), kXR_read, ClientReadRequest::offset, readahead_list::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientReadRequest::requestid, ClientReadRequest::rlen, readahead_list::rlen, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

+ Here is the call graph for this function:

◆ Read()

XRootDStatus XrdCl::FileStateHandler::Read ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
void * buffer,
ResponseHandler * handler,
time_t timeout = 0 )
static

Read a data chunk at a given offset - sync

Parameters
offsetoffset from the beginning of the file
sizenumber of bytes to be read
buffera pointer to a buffer big enough to hold the data or 0 if the buffer should be allocated by the system
handlerhandler to be notified when the response arrives, the response parameter will hold a buffer object if the procedure was successful, if a preallocated buffer was specified then the buffer object will "wrap" this buffer
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1139 of file XrdClFileStateHandler.cc.

1145 {
1146 XrdSysMutexHelper scopedLock( self->pMutex );
1147
1148 if( self->pFileState == Error ) return self->pStatus;
1149
1150 if( self->pFileState != Opened && self->pFileState != Recovering )
1151 return XRootDStatus( stError, errInvalidOp );
1152
1153 Log *log = DefaultEnv::GetLog();
1154 log->Debug( FileMsg, "[%p@%s] Sending a read command for handle %#x to %s",
1155 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1156 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1157
1158 Message *msg;
1159 ClientReadRequest *req;
1160 MessageUtils::CreateRequest( msg, req );
1161
1162 req->requestid = kXR_read;
1163 req->offset = offset;
1164 req->rlen = size;
1165 memcpy( req->fhandle, self->pFileHandle, 4 );
1166
1167 ChunkList *list = new ChunkList();
1168 list->push_back( ChunkInfo( offset, size, buffer ) );
1169
1171 MessageSendParams params;
1172 params.timeout = timeout;
1173 params.followRedirects = false;
1174 params.stateful = true;
1175 params.chunkList = list;
1177 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1178
1179 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1180 }

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, ClientReadRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_read, ClientReadRequest::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientReadRequest::requestid, ClientReadRequest::rlen, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by PgRead(), and XrdCl::File::Read().

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

◆ ReadV()

XRootDStatus XrdCl::FileStateHandler::ReadV ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
struct iovec * iov,
int iovcnt,
ResponseHandler * handler,
time_t timeout = 0 )
static

Read data into scattered buffers in one operation - async

Parameters
offsetoffset from the beginning of the file
iovlist of the buffers to be written
iovcntnumber of buffers
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 then the environment default will be used
Returns
status of the operation

Definition at line 1936 of file XrdClFileStateHandler.cc.

1942 {
1943 XrdSysMutexHelper scopedLock( self->pMutex );
1944
1945 if( self->pFileState == Error ) return self->pStatus;
1946
1947 if( self->pFileState != Opened && self->pFileState != Recovering )
1948 return XRootDStatus( stError, errInvalidOp );
1949
1950 Log *log = DefaultEnv::GetLog();
1951 log->Debug( FileMsg, "[%p@%s] Sending a read command for handle %#x to %s",
1952 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1953 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1954
1955 Message *msg;
1956 ClientReadRequest *req;
1957 MessageUtils::CreateRequest( msg, req );
1958
1959 // calculate the total read size
1960 size_t size = std::accumulate( iov, iov + iovcnt, 0, []( size_t acc, iovec &rhs )
1961 {
1962 return acc + rhs.iov_len;
1963 } );
1964 req->requestid = kXR_read;
1965 req->offset = offset;
1966 req->rlen = size;
1967 msg->SetVirtReqID( kXR_virtReadv );
1968 memcpy( req->fhandle, self->pFileHandle, 4 );
1969
1970 ChunkList *list = new ChunkList();
1971 list->reserve( iovcnt );
1972 uint64_t choff = offset;
1973 for( int i = 0; i < iovcnt; ++i )
1974 {
1975 list->emplace_back( choff, iov[i].iov_len, iov[i].iov_base );
1976 choff += iov[i].iov_len;
1977 }
1978
1980 MessageSendParams params;
1981 params.timeout = timeout;
1982 params.followRedirects = false;
1983 params.stateful = true;
1984 params.chunkList = list;
1986 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1987
1988 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1989 }
@ kXR_virtReadv
Definition XProtocol.hh:152

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, ClientReadRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_read, kXR_virtReadv, ClientReadRequest::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientReadRequest::requestid, ClientReadRequest::rlen, XrdCl::XRootDTransport::SetDescription(), XrdCl::Message::SetVirtReqID(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::ReadV().

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

◆ SetProperty()

bool XrdCl::FileStateHandler::SetProperty ( const std::string & name,
const std::string & value )

Set file property

See also
File::GetProperty for propert list

Definition at line 2375 of file XrdClFileStateHandler.cc.

2377 {
2378 XrdSysMutexHelper scopedLock( pMutex );
2379 if( name == "ReadRecovery" )
2380 {
2381 if( value == "true" ) pDoRecoverRead = true;
2382 else pDoRecoverRead = false;
2383 return true;
2384 }
2385 else if( name == "WriteRecovery" )
2386 {
2387 if( value == "true" ) pDoRecoverWrite = true;
2388 else pDoRecoverWrite = false;
2389 return true;
2390 }
2391 else if( name == "FollowRedirects" )
2392 {
2393 if( value == "true" ) pFollowRedirects = true;
2394 else pFollowRedirects = false;
2395 return true;
2396 }
2397 else if( name == "BundledClose" )
2398 {
2399 if( value == "true" ) pAllowBundledClose = true;
2400 else pAllowBundledClose = false;
2401 return true;
2402 }
2403 return false;
2404 }

◆ SetXAttr()

XRootDStatus XrdCl::FileStateHandler::SetXAttr ( std::shared_ptr< FileStateHandler > & self,
const std::vector< xattr_t > & attrs,
ResponseHandler * handler,
time_t timeout = 0 )
static

Set extended attributes - async

Parameters
attrs: list of extended attributes to set
handler: handler to be notified when the response arrives, the response parameter will hold a std::vector of XAttrStatus objects
timeout: timeout value, if 0 the environment default will be used
Returns
: status of the operation

Definition at line 2078 of file XrdClFileStateHandler.cc.

2082 {
2083 XrdSysMutexHelper scopedLock( self->pMutex );
2084
2085 if( self->pFileState == Error ) return self->pStatus;
2086
2087 if( self->pFileState != Opened && self->pFileState != Recovering )
2088 return XRootDStatus( stError, errInvalidOp );
2089
2090 Log *log = DefaultEnv::GetLog();
2091 log->Debug( FileMsg, "[%p@%s] Sending a fattr set command for handle %#x to %s",
2092 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2093 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2094
2095 //--------------------------------------------------------------------------
2096 // Issue a new fattr get request
2097 //--------------------------------------------------------------------------
2098 return XAttrOperationImpl( self, kXR_fattrSet, 0, attrs, handler, timeout );
2099 }
@ kXR_fattrSet
Definition XProtocol.hh:303

References XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), kXR_fattrSet, Opened, Recovering, and XrdCl::stError.

Referenced by XrdCl::File::SetXAttr().

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

◆ Stat()

XRootDStatus XrdCl::FileStateHandler::Stat ( std::shared_ptr< FileStateHandler > & self,
bool force,
ResponseHandler * handler,
time_t timeout = 0 )
static

Obtain status information for this file - async

Parameters
forcedo not use the cached information, force re-stating
handlerhandler to be notified when the response arrives, the response parameter will hold a StatInfo object if the procedure is successful
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1015 of file XrdClFileStateHandler.cc.

1019 {
1020 XrdSysMutexHelper scopedLock( self->pMutex );
1021
1022 if( self->pFileState == Error ) return self->pStatus;
1023
1024 if( self->pFileState != Opened && self->pFileState != Recovering )
1025 return XRootDStatus( stError, errInvalidOp );
1026
1027 //--------------------------------------------------------------------------
1028 // Return the cached info
1029 //--------------------------------------------------------------------------
1030 if( !force )
1031 {
1032 AnyObject *obj = new AnyObject();
1033 obj->Set( new StatInfo( *self->pStatInfo ) );
1034 if (handler)
1035 handler->HandleResponseWithHosts( new XRootDStatus(), obj, new HostList() );
1036 return XRootDStatus();
1037 }
1038
1039 Log *log = DefaultEnv::GetLog();
1040 log->Debug( FileMsg, "[%p@%s] Sending a stat command for handle %#x to %s",
1041 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1042 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1043
1044 //--------------------------------------------------------------------------
1045 // Issue a new stat request
1046 // stating a file handle doesn't work (fixed in 3.2.0) so we need to
1047 // stat the pat
1048 //--------------------------------------------------------------------------
1049 Message *msg;
1050 ClientStatRequest *req;
1051 std::string path = self->pFileUrl->GetPath();
1052 MessageUtils::CreateRequest( msg, req );
1053
1054 req->requestid = kXR_stat;
1055 memcpy( req->fhandle, self->pFileHandle, 4 );
1056
1057 MessageSendParams params;
1058 params.timeout = timeout;
1059 params.followRedirects = false;
1060 params.stateful = true;
1062
1064 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1065
1066 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1067 }
kXR_char fhandle[4]
Definition XProtocol.hh:812
kXR_unt16 requestid
Definition XProtocol.hh:808
std::vector< HostInfo > HostList

References XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, ClientStatRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), XrdCl::ResponseHandler::HandleResponseWithHosts(), kXR_stat, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientStatRequest::requestid, XrdCl::AnyObject::Set(), XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::Stat().

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

◆ Sync()

XRootDStatus XrdCl::FileStateHandler::Sync ( std::shared_ptr< FileStateHandler > & self,
ResponseHandler * handler,
time_t timeout = 0 )
static

Commit all pending disk writes - async

Parameters
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1648 of file XrdClFileStateHandler.cc.

1651 {
1652 XrdSysMutexHelper scopedLock( self->pMutex );
1653
1654 if( self->pFileState == Error ) return self->pStatus;
1655
1656 if( self->pFileState != Opened && self->pFileState != Recovering )
1657 return XRootDStatus( stError, errInvalidOp );
1658
1659 Log *log = DefaultEnv::GetLog();
1660 log->Debug( FileMsg, "[%p@%s] Sending a sync command for handle %#x to %s",
1661 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1662 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1663
1664 Message *msg;
1665 ClientSyncRequest *req;
1666 MessageUtils::CreateRequest( msg, req );
1667
1668 req->requestid = kXR_sync;
1669 memcpy( req->fhandle, self->pFileHandle, 4 );
1670
1671 MessageSendParams params;
1672 params.timeout = timeout;
1673 params.followRedirects = false;
1674 params.stateful = true;
1676
1678 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1679
1680 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1681 }
kXR_char fhandle[4]
Definition XProtocol.hh:823
@ kXR_sync
Definition XProtocol.hh:129
kXR_unt16 requestid
Definition XProtocol.hh:822

References XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, ClientSyncRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_sync, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientSyncRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::Sync().

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

◆ Tick()

void XrdCl::FileStateHandler::Tick ( time_t now)

Tick.

Definition at line 2843 of file XrdClFileStateHandler.cc.

2844 {
2845 if (pMutex.CondLock())
2846 {TimeOutRequests( now );
2847 pMutex.UnLock();
2848 }
2849 }
void TimeOutRequests(time_t now)
Declare timeout on requests being recovered.

References TimeOutRequests().

+ Here is the call graph for this function:

◆ TimeOutRequests()

void XrdCl::FileStateHandler::TimeOutRequests ( time_t now)

Declare timeout on requests being recovered.

Definition at line 2854 of file XrdClFileStateHandler.cc.

2855 {
2856 if( !pToBeRecovered.empty() )
2857 {
2858 Log *log = DefaultEnv::GetLog();
2859 log->Dump( FileMsg, "[%p@%s] Got a timer event", (void*)this,
2860 pFileUrl->GetObfuscatedURL().c_str() );
2861 RequestList::iterator it;
2862 JobManager *jobMan = DefaultEnv::GetPostMaster()->GetJobManager();
2863 for( it = pToBeRecovered.begin(); it != pToBeRecovered.end(); )
2864 {
2865 if( it->params.expires <= now )
2866 {
2867 jobMan->QueueJob( new ResponseJob(
2868 it->handler,
2869 new XRootDStatus( stError, errOperationExpired ),
2870 0, it->params.hostList ) );
2871 it = pToBeRecovered.erase( it );
2872 }
2873 else
2874 ++it;
2875 }
2876 }
2877 }

References XrdCl::Log::Dump(), XrdCl::errOperationExpired, XrdCl::FileMsg, XrdCl::PostMaster::GetJobManager(), XrdCl::DefaultEnv::GetLog(), XrdCl::DefaultEnv::GetPostMaster(), XrdCl::JobManager::QueueJob(), and XrdCl::stError.

Referenced by Tick().

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

◆ Truncate()

XRootDStatus XrdCl::FileStateHandler::Truncate ( std::shared_ptr< FileStateHandler > & self,
uint64_t size,
ResponseHandler * handler,
time_t timeout = 0 )
static

Truncate the file to a particular size - async

Parameters
sizedesired size of the file
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1686 of file XrdClFileStateHandler.cc.

1690 {
1691 XrdSysMutexHelper scopedLock( self->pMutex );
1692
1693 if( self->pFileState == Error ) return self->pStatus;
1694
1695 if( self->pFileState != Opened && self->pFileState != Recovering )
1696 return XRootDStatus( stError, errInvalidOp );
1697
1698 Log *log = DefaultEnv::GetLog();
1699 log->Debug( FileMsg, "[%p@%s] Sending a truncate command for handle %#x to %s",
1700 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1701 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1702
1703 Message *msg;
1704 ClientTruncateRequest *req;
1705 MessageUtils::CreateRequest( msg, req );
1706
1707 req->requestid = kXR_truncate;
1708 memcpy( req->fhandle, self->pFileHandle, 4 );
1709 req->offset = size;
1710
1711 MessageSendParams params;
1712 params.timeout = timeout;
1713 params.followRedirects = false;
1714 params.stateful = true;
1716
1718 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1719
1720 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1721 }
@ kXR_truncate
Definition XProtocol.hh:141

References XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, ClientTruncateRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_truncate, ClientTruncateRequest::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientTruncateRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::Truncate().

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

◆ TryOtherServer()

XRootDStatus XrdCl::FileStateHandler::TryOtherServer ( std::shared_ptr< FileStateHandler > & self,
time_t timeout )
static

Try other data server.

Definition at line 2905 of file XrdClFileStateHandler.cc.

2906 {
2907 XrdSysMutexHelper scopedLock( self->pMutex );
2908
2909 if( self->pFileState != Opened || !self->pLoadBalancer )
2910 return XRootDStatus( stError, errInvalidOp );
2911
2912 self->pFileState = Recovering;
2913
2914 Log *log = DefaultEnv::GetLog();
2915 log->Debug( FileMsg, "[%p@%s] Reopen file at next data server.",
2916 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str() );
2917
2918 // merge CGI
2919 auto lbcgi = self->pLoadBalancer->GetParams();
2920 auto dtcgi = self->pDataServer->GetParams();
2921 MessageUtils::MergeCGI( lbcgi, dtcgi, false );
2922 // update tried CGI
2923 auto itr = lbcgi.find( "tried" );
2924 if( itr == lbcgi.end() )
2925 lbcgi["tried"] = self->pDataServer->GetHostName();
2926 else
2927 {
2928 std::string tried = itr->second;
2929 tried += "," + self->pDataServer->GetHostName();
2930 lbcgi["tried"] = tried;
2931 }
2932 self->pLoadBalancer->SetParams( lbcgi );
2933
2934 return ReOpenFileAtServer( self, *self->pLoadBalancer, timeout );
2935 }

References XrdCl::Log::Debug(), XrdCl::errInvalidOp, XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), XrdCl::MessageUtils::MergeCGI(), Opened, Recovering, and XrdCl::stError.

Referenced by XrdCl::File::TryOtherServer().

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

◆ UnLock()

void XrdCl::FileStateHandler::UnLock ( )
inline

Unlock the internal lock.

Definition at line 758 of file XrdClFileStateHandler.hh.

759 {
760 pMutex.UnLock();
761 }

◆ VectorRead()

XRootDStatus XrdCl::FileStateHandler::VectorRead ( std::shared_ptr< FileStateHandler > & self,
const ChunkList & chunks,
void * buffer,
ResponseHandler * handler,
time_t timeout = 0 )
static

Read scattered data chunks in one operation - async

Parameters
chunkslist of the chunks to be read
buffera pointer to a buffer big enough to hold the data
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 then the environment default will be used
Returns
status of the operation

Definition at line 1726 of file XrdClFileStateHandler.cc.

1731 {
1732 //--------------------------------------------------------------------------
1733 // Sanity check
1734 //--------------------------------------------------------------------------
1735 XrdSysMutexHelper scopedLock( self->pMutex );
1736
1737 if( self->pFileState == Error ) return self->pStatus;
1738
1739 if( self->pFileState != Opened && self->pFileState != Recovering )
1740 return XRootDStatus( stError, errInvalidOp );
1741
1742 Log *log = DefaultEnv::GetLog();
1743 log->Debug( FileMsg, "[%p@%s] Sending a vector read command for handle %#x to %s",
1744 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1745 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1746
1747 //--------------------------------------------------------------------------
1748 // Build the message
1749 //--------------------------------------------------------------------------
1750 Message *msg;
1751 ClientReadVRequest *req;
1752 MessageUtils::CreateRequest( msg, req, sizeof(readahead_list)*chunks.size() );
1753
1754 req->requestid = kXR_readv;
1755 req->dlen = sizeof(readahead_list)*chunks.size();
1756
1757 ChunkList *list = new ChunkList();
1758 char *cursor = (char*)buffer;
1759
1760 //--------------------------------------------------------------------------
1761 // Copy the chunk info
1762 //--------------------------------------------------------------------------
1763 readahead_list *dataChunk = (readahead_list*)msg->GetBuffer( 24 );
1764 for( size_t i = 0; i < chunks.size(); ++i )
1765 {
1766 dataChunk[i].rlen = chunks[i].length;
1767 dataChunk[i].offset = chunks[i].offset;
1768 memcpy( dataChunk[i].fhandle, self->pFileHandle, 4 );
1769
1770 void *chunkBuffer;
1771 if( cursor )
1772 {
1773 chunkBuffer = cursor;
1774 cursor += chunks[i].length;
1775 }
1776 else
1777 chunkBuffer = chunks[i].buffer;
1778
1779 list->push_back( ChunkInfo( chunks[i].offset,
1780 chunks[i].length,
1781 chunkBuffer ) );
1782 }
1783
1784 //--------------------------------------------------------------------------
1785 // Send the message
1786 //--------------------------------------------------------------------------
1787 MessageSendParams params;
1788 params.timeout = timeout;
1789 params.followRedirects = false;
1790 params.stateful = true;
1791 params.chunkList = list;
1793
1795 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1796
1797 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1798 }
kXR_unt16 requestid
Definition XProtocol.hh:706

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientReadVRequest::dlen, XrdCl::errInvalidOp, Error, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), kXR_readv, readahead_list::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientReadVRequest::requestid, readahead_list::rlen, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::VectorRead().

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

◆ VectorWrite()

XRootDStatus XrdCl::FileStateHandler::VectorWrite ( std::shared_ptr< FileStateHandler > & self,
const ChunkList & chunks,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write scattered data chunks in one operation - async

Parameters
chunkslist of the chunks to be read
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 then the environment default will be used
Returns
status of the operation

Definition at line 1803 of file XrdClFileStateHandler.cc.

1807 {
1808 //--------------------------------------------------------------------------
1809 // Sanity check
1810 //--------------------------------------------------------------------------
1811 XrdSysMutexHelper scopedLock( self->pMutex );
1812
1813 if( self->pFileState == Error ) return self->pStatus;
1814
1815 if( self->pFileState != Opened && self->pFileState != Recovering )
1816 return XRootDStatus( stError, errInvalidOp );
1817
1818 Log *log = DefaultEnv::GetLog();
1819 log->Debug( FileMsg, "[%p@%s] Sending a vector write command for handle %#x to %s",
1820 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1821 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1822
1823 //--------------------------------------------------------------------------
1824 // Determine the size of the payload
1825 //--------------------------------------------------------------------------
1826
1827 // the size of write vector
1828 uint32_t payloadSize = sizeof(XrdProto::write_list) * chunks.size();
1829
1830 //--------------------------------------------------------------------------
1831 // Build the message
1832 //--------------------------------------------------------------------------
1833 Message *msg;
1834 ClientWriteVRequest *req;
1835 MessageUtils::CreateRequest( msg, req, payloadSize );
1836
1837 req->requestid = kXR_writev;
1838 req->dlen = sizeof(XrdProto::write_list) * chunks.size();
1839
1840 ChunkList *list = new ChunkList();
1841
1842 //--------------------------------------------------------------------------
1843 // Copy the chunk info
1844 //--------------------------------------------------------------------------
1845 XrdProto::write_list *writeList =
1846 reinterpret_cast<XrdProto::write_list*>( msg->GetBuffer( 24 ) );
1847
1848
1849
1850 for( size_t i = 0; i < chunks.size(); ++i )
1851 {
1852 writeList[i].wlen = chunks[i].length;
1853 writeList[i].offset = chunks[i].offset;
1854 memcpy( writeList[i].fhandle, self->pFileHandle, 4 );
1855
1856 list->push_back( ChunkInfo( chunks[i].offset,
1857 chunks[i].length,
1858 chunks[i].buffer ) );
1859 }
1860
1861 //--------------------------------------------------------------------------
1862 // Send the message
1863 //--------------------------------------------------------------------------
1864 MessageSendParams params;
1865 params.timeout = timeout;
1866 params.followRedirects = false;
1867 params.stateful = true;
1868 params.chunkList = list;
1870
1872 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1873
1874 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1875 }

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientWriteVRequest::dlen, XrdCl::errInvalidOp, Error, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::Buffer::GetBuffer(), XrdCl::DefaultEnv::GetLog(), kXR_writev, XrdProto::write_list::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientWriteVRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, XrdCl::MessageSendParams::timeout, and XrdProto::write_list::wlen.

Referenced by XrdCl::File::VectorWrite().

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

◆ Visa()

XRootDStatus XrdCl::FileStateHandler::Visa ( std::shared_ptr< FileStateHandler > & self,
ResponseHandler * handler,
time_t timeout = 0 )
static

Get access token to a file - async

Parameters
handlerhandler to be notified when the response arrives, the response parameter will hold a Buffer object if the procedure is successful
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 2039 of file XrdClFileStateHandler.cc.

2042 {
2043 XrdSysMutexHelper scopedLock( self->pMutex );
2044
2045 if( self->pFileState == Error ) return self->pStatus;
2046
2047 if( self->pFileState != Opened && self->pFileState != Recovering )
2048 return XRootDStatus( stError, errInvalidOp );
2049
2050 Log *log = DefaultEnv::GetLog();
2051 log->Debug( FileMsg, "[%p@%s] Sending a visa command for handle %#x to %s",
2052 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2053 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2054
2055 Message *msg;
2056 ClientQueryRequest *req;
2057 MessageUtils::CreateRequest( msg, req );
2058
2059 req->requestid = kXR_query;
2060 req->infotype = kXR_Qvisa;
2061 memcpy( req->fhandle, self->pFileHandle, 4 );
2062
2063 MessageSendParams params;
2064 params.timeout = timeout;
2065 params.followRedirects = false;
2066 params.stateful = true;
2068
2070 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2071
2072 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2073 }
@ kXR_Qvisa
Definition XProtocol.hh:656

References XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), XrdCl::errInvalidOp, Error, ClientQueryRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), ClientQueryRequest::infotype, kXR_query, kXR_Qvisa, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientQueryRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::Visa().

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

◆ Write() [1/3]

XRootDStatus XrdCl::FileStateHandler::Write ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
Buffer && buffer,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write a data chunk at a given offset - async

Parameters
offsetoffset from the beginning of the file
bufferr-value reference to Buffer object, in this case XrdCl runtime takes ownership of the buffer
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1346 of file XrdClFileStateHandler.cc.

1351 {
1352 //--------------------------------------------------------------------------
1353 // If the memory is not page (4KB) aligned we cannot use the kernel buffer
1354 // so fall back to normal write
1355 //--------------------------------------------------------------------------
1356 if( !XrdSys::KernelBuffer::IsPageAligned( buffer.GetBuffer() ) || self->pIsChannelEncrypted )
1357 {
1358 Log *log = DefaultEnv::GetLog();
1359 log->Info( FileMsg, "[%p@%s] Buffer for handle %#x is not page aligned (4KB), "
1360 "cannot convert it to kernel space buffer.", (void*)self.get(),
1361 self->pFileUrl->GetObfuscatedURL().c_str(), *((uint32_t*)self->pFileHandle) );
1362
1363 void *buff = buffer.GetBuffer();
1364 uint32_t size = buffer.GetSize();
1365 ReleaseBufferHandler *wrtHandler =
1366 new ReleaseBufferHandler( std::move( buffer ), handler );
1367 XRootDStatus st = self->Write( self, offset, size, buff, wrtHandler, timeout );
1368 if( !st.IsOK() )
1369 {
1370 buffer = std::move( wrtHandler->GetBuffer() );
1371 delete wrtHandler;
1372 }
1373 return st;
1374 }
1375
1376 //--------------------------------------------------------------------------
1377 // Transfer the data from user space to kernel space
1378 //--------------------------------------------------------------------------
1379 uint32_t length = buffer.GetSize();
1380 char *ubuff = buffer.Release();
1381
1382 std::unique_ptr<XrdSys::KernelBuffer> kbuff( new XrdSys::KernelBuffer() );
1383 ssize_t ret = XrdSys::Move( ubuff, *kbuff, length );
1384 if( ret < 0 )
1385 return XRootDStatus( stError, errInternal, XProtocol::mapError( errno ) );
1386
1387 //--------------------------------------------------------------------------
1388 // Now create a write request and enqueue it
1389 //--------------------------------------------------------------------------
1390 return WriteKernelBuffer( self, offset, ret, std::move( kbuff ), handler, timeout );
1391 }
static int mapError(int rc)
static bool IsPageAligned(const void *ptr)
const uint16_t errInternal
Internal error.
ssize_t Move(KernelBuffer &kbuff, char *&ubuff)

References XrdCl::errInternal, XrdCl::FileMsg, XrdCl::DefaultEnv::GetLog(), XrdCl::Log::Info(), XrdCl::Status::IsOK(), XrdSys::KernelBuffer::IsPageAligned(), XProtocol::mapError(), XrdSys::Move(), and XrdCl::stError.

+ Here is the call graph for this function:

◆ Write() [2/3]

XRootDStatus XrdCl::FileStateHandler::Write ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
const void * buffer,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write a data chunk at a given offset - async

Parameters
offsetoffset from the beginning of the file
sizenumber of bytes to be written
buffera pointer to the buffer holding the data to be written
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1298 of file XrdClFileStateHandler.cc.

1304 {
1305 XrdSysMutexHelper scopedLock( self->pMutex );
1306
1307 if( self->pFileState == Error ) return self->pStatus;
1308
1309 if( self->pFileState != Opened && self->pFileState != Recovering )
1310 return XRootDStatus( stError, errInvalidOp );
1311
1312 Log *log = DefaultEnv::GetLog();
1313 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
1314 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1315 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1316
1317 Message *msg;
1318 ClientWriteRequest *req;
1319 MessageUtils::CreateRequest( msg, req );
1320
1321 req->requestid = kXR_write;
1322 req->offset = offset;
1323 req->dlen = size;
1324 memcpy( req->fhandle, self->pFileHandle, 4 );
1325
1326 ChunkList *list = new ChunkList();
1327 list->push_back( ChunkInfo( 0, size, (char*)buffer ) );
1328
1329 MessageSendParams params;
1330 params.timeout = timeout;
1331 params.followRedirects = false;
1332 params.stateful = true;
1333 params.chunkList = list;
1334
1336
1338 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1339
1340 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1341 }

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientWriteRequest::dlen, XrdCl::errInvalidOp, Error, ClientWriteRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_write, ClientWriteRequest::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientWriteRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::Write(), XrdCl::File::Write(), and XrdCl::File::Write().

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

◆ Write() [3/3]

XRootDStatus XrdCl::FileStateHandler::Write ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
Optional< uint64_t > fdoff,
int fd,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write a data from a given file descriptor at a given offset - async

Parameters
offsetoffset from the beginning of the file
sizenumber of bytes to be written
fdoffoffset of the data to be written from the file descriptor (optional, if not provided will copy data from the file descriptor at the current cursor position)
fdfile descriptor open for reading
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 the environment default will be used
Returns
status of the operation

Definition at line 1396 of file XrdClFileStateHandler.cc.

1403 {
1404 //--------------------------------------------------------------------------
1405 // Read the data from the file descriptor into a kernel buffer
1406 //--------------------------------------------------------------------------
1407 std::unique_ptr<XrdSys::KernelBuffer> kbuff( new XrdSys::KernelBuffer() );
1408 ssize_t ret = fdoff ? XrdSys::Read( fd, *kbuff, size, *fdoff ) :
1409 XrdSys::Read( fd, *kbuff, size );
1410 if( ret < 0 )
1411 return XRootDStatus( stError, errInternal, XProtocol::mapError( errno ) );
1412
1413 //--------------------------------------------------------------------------
1414 // Now create a write request and enqueue it
1415 //--------------------------------------------------------------------------
1416 return WriteKernelBuffer( self, offset, ret, std::move( kbuff ), handler, timeout );
1417 }
ssize_t Read(int fd, KernelBuffer &buffer, uint32_t length, int64_t offset)

References XrdCl::errInternal, XProtocol::mapError(), XrdSys::Read(), and XrdCl::stError.

+ Here is the call graph for this function:

◆ WriteV()

XRootDStatus XrdCl::FileStateHandler::WriteV ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
const struct iovec * iov,
int iovcnt,
ResponseHandler * handler,
time_t timeout = 0 )
static

Write scattered buffers in one operation - async

Parameters
offsetoffset from the beginning of the file
iovlist of the buffers to be written
iovcntnumber of buffers
handlerhandler to be notified when the response arrives
timeouttimeout value, if 0 then the environment default will be used
Returns
status of the operation

Definition at line 1880 of file XrdClFileStateHandler.cc.

1886 {
1887 XrdSysMutexHelper scopedLock( self->pMutex );
1888
1889 if( self->pFileState == Error ) return self->pStatus;
1890
1891 if( self->pFileState != Opened && self->pFileState != Recovering )
1892 return XRootDStatus( stError, errInvalidOp );
1893
1894 Log *log = DefaultEnv::GetLog();
1895 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
1896 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1897 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1898
1899 Message *msg;
1900 ClientWriteRequest *req;
1901 MessageUtils::CreateRequest( msg, req );
1902
1903 ChunkList *list = new ChunkList();
1904
1905 uint32_t size = 0;
1906 for( int i = 0; i < iovcnt; ++i )
1907 {
1908 if( iov[i].iov_len == 0 ) continue;
1909 size += iov[i].iov_len;
1910 list->push_back( ChunkInfo( 0, iov[i].iov_len,
1911 (char*)iov[i].iov_base ) );
1912 }
1913
1914 req->requestid = kXR_write;
1915 req->offset = offset;
1916 req->dlen = size;
1917 memcpy( req->fhandle, self->pFileHandle, 4 );
1918
1919 MessageSendParams params;
1920 params.timeout = timeout;
1921 params.followRedirects = false;
1922 params.stateful = true;
1923 params.chunkList = list;
1924
1926
1928 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1929
1930 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1931 }

References XrdCl::MessageSendParams::chunkList, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientWriteRequest::dlen, XrdCl::errInvalidOp, Error, ClientWriteRequest::fhandle, XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), kXR_write, ClientWriteRequest::offset, Opened, XrdCl::MessageUtils::ProcessSendParams(), Recovering, ClientWriteRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::MessageSendParams::stateful, XrdCl::stError, and XrdCl::MessageSendParams::timeout.

Referenced by XrdCl::File::WriteV().

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

Friends And Related Symbol Documentation

◆ ::OpenHandler

friend class ::OpenHandler
friend

Definition at line 100 of file XrdClFileStateHandler.hh.

◆ ::PgReadHandler

friend class ::PgReadHandler
friend

Definition at line 97 of file XrdClFileStateHandler.hh.

Referenced by PgRead(), and PgReadRetry().

◆ ::PgReadRetryHandler

friend class ::PgReadRetryHandler
friend

Definition at line 98 of file XrdClFileStateHandler.hh.

Referenced by PgReadRetry().

◆ ::PgReadSubstitutionHandler

friend class ::PgReadSubstitutionHandler
friend

Definition at line 99 of file XrdClFileStateHandler.hh.

Referenced by PgRead().


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