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.
 
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, uint16_t timeout=0)
 
static XRootDStatus ChkptWrt (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus ChkptWrtV (std::shared_ptr< FileStateHandler > &self, uint64_t offset, const struct iovec *iov, int iovcnt, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Close (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus DelXAttr (std::shared_ptr< FileStateHandler > &self, const std::vector< std::string > &attrs, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Fcntl (std::shared_ptr< FileStateHandler > &self, const Buffer &arg, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus GetXAttr (std::shared_ptr< FileStateHandler > &self, const std::vector< std::string > &attrs, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus ListXAttr (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, uint16_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, uint16_t flags, uint16_t mode, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus PgRead (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus PgReadImpl (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, uint16_t flags, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus PgReadRetry (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, size_t pgnb, void *buffer, PgReadHandler *handler, uint16_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, uint16_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, uint16_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, uint16_t timeout=0)
 
static XRootDStatus Read (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus ReadV (std::shared_ptr< FileStateHandler > &self, uint64_t offset, struct iovec *iov, int iovcnt, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus SetXAttr (std::shared_ptr< FileStateHandler > &self, const std::vector< xattr_t > &attrs, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Stat (std::shared_ptr< FileStateHandler > &self, bool force, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Sync (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Truncate (std::shared_ptr< FileStateHandler > &self, uint64_t size, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus TryOtherServer (std::shared_ptr< FileStateHandler > &self, uint16_t timeout)
 Try other data server.
 
static XRootDStatus VectorRead (std::shared_ptr< FileStateHandler > &self, const ChunkList &chunks, void *buffer, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus VectorWrite (std::shared_ptr< FileStateHandler > &self, const ChunkList &chunks, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Visa (std::shared_ptr< FileStateHandler > &self, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Write (std::shared_ptr< FileStateHandler > &self, uint64_t offset, Buffer &&buffer, ResponseHandler *handler, uint16_t timeout=0)
 
static XRootDStatus Write (std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, const void *buffer, ResponseHandler *handler, uint16_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, uint16_t timeout=0)
 
static XRootDStatus WriteV (std::shared_ptr< FileStateHandler > &self, uint64_t offset, const struct iovec *iov, int iovcnt, ResponseHandler *handler, uint16_t timeout=0)
 

Friends

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

Detailed Description

Handle the stateful operations.

Definition at line 79 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 90 of file XrdClFileStateHandler.hh.

91 {
92 Closed,
93 Opened,
94 Error,
98 };
@ 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 649 of file XrdClFileStateHandler.cc.

649 :
650 pFileState( Closed ),
651 pStatInfo( 0 ),
652 pFileUrl( 0 ),
653 pDataServer( 0 ),
654 pLoadBalancer( 0 ),
655 pStateRedirect( 0 ),
656 pWrtRecoveryRedir( 0 ),
657 pFileHandle( 0 ),
658 pOpenMode( 0 ),
659 pOpenFlags( 0 ),
660 pSessionId( 0 ),
661 pDoRecoverRead( true ),
662 pDoRecoverWrite( true ),
663 pFollowRedirects( true ),
664 pUseVirtRedirector( true ),
665 pIsChannelEncrypted( false ),
666 pAllowBundledClose( false ),
667 pPlugin( plugin )
668 {
669 pFileHandle = new uint8_t[4];
670 ResetMonitoringVars();
673 pLFileHandler = new LocalFileHandler();
674 }
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 682 of file XrdClFileStateHandler.cc.

682 :
683 pFileState( Closed ),
684 pStatInfo( 0 ),
685 pFileUrl( 0 ),
686 pDataServer( 0 ),
687 pLoadBalancer( 0 ),
688 pStateRedirect( 0 ),
689 pWrtRecoveryRedir( 0 ),
690 pFileHandle( 0 ),
691 pOpenMode( 0 ),
692 pOpenFlags( 0 ),
693 pSessionId( 0 ),
694 pDoRecoverRead( true ),
695 pDoRecoverWrite( true ),
696 pFollowRedirects( true ),
697 pUseVirtRedirector( useVirtRedirector ),
698 pAllowBundledClose( false ),
699 pPlugin( plugin )
700 {
701 pFileHandle = new uint8_t[4];
702 ResetMonitoringVars();
705 pLFileHandler = new LocalFileHandler();
706 }

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 711 of file XrdClFileStateHandler.cc.

712 {
713 //--------------------------------------------------------------------------
714 // This, in principle, should never ever happen. Except for the case
715 // when we're interfaced with ROOT that may call this desctructor from
716 // its garbage collector, from its __cxa_finalize, ie. after the XrdCl lib
717 // has been finalized by the linker. So, if we don't have the log object
718 // at this point we just give up the hope.
719 //--------------------------------------------------------------------------
720 if( DefaultEnv::GetLog() && pSessionId && !pDataServer->IsLocalFile() ) // if the file object was bound to a physical connection
721 DefaultEnv::GetPostMaster()->DecFileInstCnt( *pDataServer );
722
725
728
729 if( pFileState != Closed && DefaultEnv::GetLog() )
730 {
731 XRootDStatus st;
732 MonitorClose( &st );
733 ResetMonitoringVars();
734 }
735
736 // check if the logger is still there, this is only for root, as root might
737 // have unload us already so in this case we don't want to do anything
738 if( DefaultEnv::GetLog() && pUseVirtRedirector && pFileUrl && pFileUrl->IsMetalink() )
739 {
740 RedirectorRegistry& registry = RedirectorRegistry::Instance();
741 registry.Release( *pFileUrl );
742 }
743
744 delete pStatInfo;
745 delete pFileUrl;
746 delete pDataServer;
747 delete pLoadBalancer;
748 delete [] pFileHandle;
749 delete pLFileHandler;
750 }
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 2752 of file XrdClFileStateHandler.cc.

2753 {
2754 Log *log = DefaultEnv::GetLog();
2755
2756 if( pFileState == Closed || pFileState == Error )
2757 return;
2758
2759 if( (IsReadOnly() && pDoRecoverRead) ||
2760 (!IsReadOnly() && pDoRecoverWrite) )
2761 {
2762 log->Debug( FileMsg, "[%p@%s] Putting the file in recovery state in "
2763 "process %d", (void*)this, pFileUrl->GetObfuscatedURL().c_str(), getpid() );
2764 pFileState = Recovering;
2765 pInTheFly.clear();
2766 pToBeRecovered.clear();
2767 }
2768 else
2769 pFileState = Error;
2770 }
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,
uint16_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 2067 of file XrdClFileStateHandler.cc.

2071 {
2072 XrdSysMutexHelper scopedLock( self->pMutex );
2073
2074 if( self->pFileState == Error ) return self->pStatus;
2075
2076 if( self->pFileState != Opened && self->pFileState != Recovering )
2077 return XRootDStatus( stError, errInvalidOp );
2078
2079 Log *log = DefaultEnv::GetLog();
2080 log->Debug( FileMsg, "[%p@%s] Sending a checkpoint command for handle %#x to %s",
2081 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2082 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2083
2084 Message *msg;
2085 ClientChkPointRequest *req;
2086 MessageUtils::CreateRequest( msg, req );
2087
2088 req->requestid = kXR_chkpoint;
2089 req->opcode = code;
2090 memcpy( req->fhandle, self->pFileHandle, 4 );
2091
2092 MessageSendParams params;
2093 params.timeout = timeout;
2094 params.followRedirects = false;
2095 params.stateful = true;
2096
2098
2100 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2101
2102 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2103 }
@ kXR_chkpoint
Definition XProtocol.hh:124
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,
uint16_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 2116 of file XrdClFileStateHandler.cc.

2122 {
2123 XrdSysMutexHelper scopedLock( self->pMutex );
2124
2125 if( self->pFileState == Error ) return self->pStatus;
2126
2127 if( self->pFileState != Opened && self->pFileState != Recovering )
2128 return XRootDStatus( stError, errInvalidOp );
2129
2130 Log *log = DefaultEnv::GetLog();
2131 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
2132 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2133 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2134
2135 Message *msg;
2136 ClientChkPointRequest *req;
2137 MessageUtils::CreateRequest( msg, req, sizeof( ClientWriteRequest ) );
2138
2139 req->requestid = kXR_chkpoint;
2140 req->opcode = kXR_ckpXeq;
2141 req->dlen = 24; // as specified in the protocol specification
2142 memcpy( req->fhandle, self->pFileHandle, 4 );
2143
2144 ClientWriteRequest *wrtreq = (ClientWriteRequest*)msg->GetBuffer( sizeof(ClientChkPointRequest) );
2145 wrtreq->requestid = kXR_write;
2146 wrtreq->offset = offset;
2147 wrtreq->dlen = size;
2148 memcpy( wrtreq->fhandle, self->pFileHandle, 4 );
2149
2150 ChunkList *list = new ChunkList();
2151 list->push_back( ChunkInfo( 0, size, (char*)buffer ) );
2152
2153 MessageSendParams params;
2154 params.timeout = timeout;
2155 params.followRedirects = false;
2156 params.stateful = true;
2157 params.chunkList = list;
2158
2160
2162 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2163
2164 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2165 }
kXR_unt16 requestid
Definition XProtocol.hh:806
kXR_char fhandle[4]
Definition XProtocol.hh:807
static const int kXR_ckpXeq
Definition XProtocol.hh:216
@ kXR_write
Definition XProtocol.hh:131
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,
uint16_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 2178 of file XrdClFileStateHandler.cc.

2184 {
2185 XrdSysMutexHelper scopedLock( self->pMutex );
2186
2187 if( self->pFileState == Error ) return self->pStatus;
2188
2189 if( self->pFileState != Opened && self->pFileState != Recovering )
2190 return XRootDStatus( stError, errInvalidOp );
2191
2192 Log *log = DefaultEnv::GetLog();
2193 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
2194 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2195 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2196
2197 Message *msg;
2198 ClientChkPointRequest *req;
2199 MessageUtils::CreateRequest( msg, req, sizeof( ClientWriteRequest ) );
2200
2201 req->requestid = kXR_chkpoint;
2202 req->opcode = kXR_ckpXeq;
2203 req->dlen = 24; // as specified in the protocol specification
2204 memcpy( req->fhandle, self->pFileHandle, 4 );
2205
2206 ChunkList *list = new ChunkList();
2207 uint32_t size = 0;
2208 for( int i = 0; i < iovcnt; ++i )
2209 {
2210 if( iov[i].iov_len == 0 ) continue;
2211 size += iov[i].iov_len;
2212 list->push_back( ChunkInfo( 0, iov[i].iov_len,
2213 (char*)iov[i].iov_base ) );
2214 }
2215
2216 ClientWriteRequest *wrtreq = (ClientWriteRequest*)msg->GetBuffer( sizeof(ClientChkPointRequest) );
2217 wrtreq->requestid = kXR_write;
2218 wrtreq->offset = offset;
2219 wrtreq->dlen = size;
2220 memcpy( wrtreq->fhandle, self->pFileHandle, 4 );
2221
2222 MessageSendParams params;
2223 params.timeout = timeout;
2224 params.followRedirects = false;
2225 params.stateful = true;
2226 params.chunkList = list;
2227
2229
2231 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2232
2233 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2234 }

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:

◆ Close()

XRootDStatus XrdCl::FileStateHandler::Close ( std::shared_ptr< FileStateHandler > & self,
ResponseHandler * handler,
uint16_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 882 of file XrdClFileStateHandler.cc.

885 {
886 XrdSysMutexHelper scopedLock( self->pMutex );
887
888 //--------------------------------------------------------------------------
889 // Check if we can proceed
890 //--------------------------------------------------------------------------
891 if( self->pFileState == Error )
892 return self->pStatus;
893
894 if( self->pFileState == CloseInProgress )
895 return XRootDStatus( stError, errInProgress );
896
897 if( self->pFileState == Closed )
898 return XRootDStatus( stOK, suAlreadyDone );
899
900 if( self->pFileState == OpenInProgress || self->pFileState == Recovering )
901 return XRootDStatus( stError, errInvalidOp );
902
903 if( !self->pAllowBundledClose && !self->pInTheFly.empty() )
904 return XRootDStatus( stError, errInvalidOp );
905
906 self->pFileState = CloseInProgress;
907
908 Log *log = DefaultEnv::GetLog();
909 log->Debug( FileMsg, "[%p@%s] Sending a close command for handle %#x to %s",
910 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
911 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
912
913 //--------------------------------------------------------------------------
914 // Close the file
915 //--------------------------------------------------------------------------
916 Message *msg;
917 ClientCloseRequest *req;
918 MessageUtils::CreateRequest( msg, req );
919
920 req->requestid = kXR_close;
921 memcpy( req->fhandle, self->pFileHandle, 4 );
922
924 msg->SetSessionId( self->pSessionId );
925 CloseHandler *closeHandler = new CloseHandler( self, handler, msg );
926 MessageSendParams params;
927 params.timeout = timeout;
928 params.followRedirects = false;
929 params.stateful = true;
931
932 XRootDStatus st = self->IssueRequest( *self->pDataServer, msg, closeHandler, params );
933
934 if( !st.IsOK() )
935 {
936 // an invalid-session error means the connection to the server has been
937 // closed, which in turn means that the server closed the file already
938 if( st.code == errInvalidSession || st.code == errSocketDisconnected ||
939 st.code == errConnectionError || st.code == errSocketOptError ||
940 st.code == errPollerError || st.code == errSocketError )
941 {
942 self->pFileState = Closed;
943 ResponseJob *job = new ResponseJob( closeHandler, new XRootDStatus(),
944 nullptr, nullptr );
946 return XRootDStatus();
947 }
948
949 delete closeHandler;
950 self->pStatus = st;
951 self->pFileState = Error;
952 return st;
953 }
954 return st;
955 }
kXR_unt16 requestid
Definition XProtocol.hh:228
kXR_char fhandle[4]
Definition XProtocol.hh:229
@ kXR_close
Definition XProtocol.hh:115
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,
uint16_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 2006 of file XrdClFileStateHandler.cc.

2010 {
2011 XrdSysMutexHelper scopedLock( self->pMutex );
2012
2013 if( self->pFileState == Error ) return self->pStatus;
2014
2015 if( self->pFileState != Opened && self->pFileState != Recovering )
2016 return XRootDStatus( stError, errInvalidOp );
2017
2018 Log *log = DefaultEnv::GetLog();
2019 log->Debug( FileMsg, "[%p@%s] Sending a fattr del command for handle %#x to %s",
2020 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2021 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2022
2023 //--------------------------------------------------------------------------
2024 // Issue a new fattr del request
2025 //--------------------------------------------------------------------------
2026 return XAttrOperationImpl( self, kXR_fattrDel, 0, attrs, handler, timeout );
2027 }
@ kXR_fattrDel
Definition XProtocol.hh:270

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:

◆ Fcntl()

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

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

Parameters
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 1873 of file XrdClFileStateHandler.cc.

1877 {
1878 XrdSysMutexHelper scopedLock( self->pMutex );
1879
1880 if( self->pFileState == Error ) return self->pStatus;
1881
1882 if( self->pFileState != Opened && self->pFileState != Recovering )
1883 return XRootDStatus( stError, errInvalidOp );
1884
1885 Log *log = DefaultEnv::GetLog();
1886 log->Debug( FileMsg, "[%p@%s] Sending a fcntl command for handle %#x to %s",
1887 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1888 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1889
1890 Message *msg;
1891 ClientQueryRequest *req;
1892 MessageUtils::CreateRequest( msg, req, arg.GetSize() );
1893
1894 req->requestid = kXR_query;
1895 req->infotype = kXR_Qopaqug;
1896 req->dlen = arg.GetSize();
1897 memcpy( req->fhandle, self->pFileHandle, 4 );
1898 msg->Append( arg.GetBuffer(), arg.GetSize(), 24 );
1899
1900 MessageSendParams params;
1901 params.timeout = timeout;
1902 params.followRedirects = false;
1903 params.stateful = true;
1905
1907 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1908
1909 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1910 }
kXR_unt16 requestid
Definition XProtocol.hh:630
kXR_char fhandle[4]
Definition XProtocol.hh:633
@ kXR_query
Definition XProtocol.hh:113
@ kXR_Qopaqug
Definition XProtocol.hh:625

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_Qopaqug, 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().

+ 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 2285 of file XrdClFileStateHandler.cc.

2287 {
2288 XrdSysMutexHelper scopedLock( pMutex );
2289 if( name == "ReadRecovery" )
2290 {
2291 if( pDoRecoverRead ) value = "true";
2292 else value = "false";
2293 return true;
2294 }
2295 else if( name == "WriteRecovery" )
2296 {
2297 if( pDoRecoverWrite ) value = "true";
2298 else value = "false";
2299 return true;
2300 }
2301 else if( name == "FollowRedirects" )
2302 {
2303 if( pFollowRedirects ) value = "true";
2304 else value = "false";
2305 return true;
2306 }
2307 else if( name == "DataServer" && pDataServer )
2308 { value = pDataServer->GetHostId(); return true; }
2309 else if( name == "LastURL" && pDataServer )
2310 { value = pDataServer->GetURL(); return true; }
2311 else if( name == "WrtRecoveryRedir" && pWrtRecoveryRedir )
2312 { value = pWrtRecoveryRedir->GetHostId(); return true; }
2313 value = "";
2314 return false;
2315 }
Response NullRef< Response >::value

References XrdCl::NullRef< Response >::value.

◆ GetXAttr()

XRootDStatus XrdCl::FileStateHandler::GetXAttr ( std::shared_ptr< FileStateHandler > & self,
const std::vector< std::string > & attrs,
ResponseHandler * handler,
uint16_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 1980 of file XrdClFileStateHandler.cc.

1984 {
1985 XrdSysMutexHelper scopedLock( self->pMutex );
1986
1987 if( self->pFileState == Error ) return self->pStatus;
1988
1989 if( self->pFileState != Opened && self->pFileState != Recovering )
1990 return XRootDStatus( stError, errInvalidOp );
1991
1992 Log *log = DefaultEnv::GetLog();
1993 log->Debug( FileMsg, "[%p@%s] Sending a fattr get command for handle %#x to %s",
1994 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1995 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1996
1997 //--------------------------------------------------------------------------
1998 // Issue a new fattr get request
1999 //--------------------------------------------------------------------------
2000 return XAttrOperationImpl( self, kXR_fattrGet, 0, attrs, handler, timeout );
2001 }
@ kXR_fattrGet
Definition XProtocol.hh:271

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 2239 of file XrdClFileStateHandler.cc.

2240 {
2241 XrdSysMutexHelper scopedLock( pMutex );
2242
2243 if( pFileState == Opened || pFileState == Recovering )
2244 return true;
2245 return false;
2246 }

References Opened, and Recovering.

◆ IsSecure()

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

Check if the file is using an encrypted connection.

Definition at line 658 of file XrdClFileStateHandler.hh.

659 {
660 return pIsChannelEncrypted;
661 }

◆ ListXAttr()

XRootDStatus XrdCl::FileStateHandler::ListXAttr ( std::shared_ptr< FileStateHandler > & self,
ResponseHandler * handler,
uint16_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 2032 of file XrdClFileStateHandler.cc.

2035 {
2036 XrdSysMutexHelper scopedLock( self->pMutex );
2037
2038 if( self->pFileState == Error ) return self->pStatus;
2039
2040 if( self->pFileState != Opened && self->pFileState != Recovering )
2041 return XRootDStatus( stError, errInvalidOp );
2042
2043 Log *log = DefaultEnv::GetLog();
2044 log->Debug( FileMsg, "[%p@%s] Sending a fattr list command for handle %#x to %s",
2045 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2046 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2047
2048 //--------------------------------------------------------------------------
2049 // Issue a new fattr get request
2050 //--------------------------------------------------------------------------
2051 static const std::vector<std::string> nothing;
2052 return XAttrOperationImpl( self, kXR_fattrList, ClientFattrRequest::aData,
2053 nothing, handler, timeout );
2054 }
@ kXR_fattrList
Definition XProtocol.hh:272
static const int aData
Definition XProtocol.hh:298

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 680 of file XrdClFileStateHandler.hh.

681 {
682 pMutex.Lock();
683 }

◆ OnClose()

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

Process the results of the closing operation.

Definition at line 2461 of file XrdClFileStateHandler.cc.

2462 {
2463 Log *log = DefaultEnv::GetLog();
2464 XrdSysMutexHelper scopedLock( pMutex );
2465
2466 log->Debug(FileMsg, "[%p@%s] Close returned from %s with: %s", (void*)this,
2467 pFileUrl->GetObfuscatedURL().c_str(), pDataServer->GetHostId().c_str(),
2468 status->ToStr().c_str() );
2469
2470 log->Dump(FileMsg, "[%p@%s] Items in the fly %zu, queued for recovery %zu",
2471 (void*)this, pFileUrl->GetObfuscatedURL().c_str(), pInTheFly.size(), pToBeRecovered.size() );
2472
2473 MonitorClose( status );
2474 ResetMonitoringVars();
2475
2476 pStatus = *status;
2477 pFileState = Closed;
2478 }

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 2320 of file XrdClFileStateHandler.cc.

2323 {
2324 Log *log = DefaultEnv::GetLog();
2325 XrdSysMutexHelper scopedLock( pMutex );
2326
2327 //--------------------------------------------------------------------------
2328 // Assign the data server and the load balancer
2329 //--------------------------------------------------------------------------
2330 std::string lastServer = pFileUrl->GetHostId();
2331 if( hostList )
2332 {
2333 delete pDataServer;
2334 delete pLoadBalancer;
2335 pLoadBalancer = 0;
2336 delete pWrtRecoveryRedir;
2337 pWrtRecoveryRedir = 0;
2338
2339 pDataServer = new URL( hostList->back().url );
2340 pDataServer->SetParams( pFileUrl->GetParams() );
2341 if( !( pUseVirtRedirector && pFileUrl->IsMetalink() ) ) pDataServer->SetPath( pFileUrl->GetPath() );
2342 lastServer = pDataServer->GetHostId();
2343 HostList::const_iterator itC;
2344 URL::ParamsMap params = pDataServer->GetParams();
2345 for( itC = hostList->begin(); itC != hostList->end(); ++itC )
2346 {
2347 MessageUtils::MergeCGI( params,
2348 itC->url.GetParams(),
2349 true );
2350 }
2351 pDataServer->SetParams( params );
2352
2353 HostList::const_reverse_iterator it;
2354 for( it = hostList->rbegin(); it != hostList->rend(); ++it )
2355 if( it->loadBalancer )
2356 {
2357 pLoadBalancer = new URL( it->url );
2358 break;
2359 }
2360
2361 for( it = hostList->rbegin(); it != hostList->rend(); ++it )
2362 if( it->flags & kXR_recoverWrts )
2363 {
2364 pWrtRecoveryRedir = new URL( it->url );
2365 break;
2366 }
2367 }
2368
2369 log->Debug(FileMsg, "[%p@%s] Open has returned with status %s",
2370 (void*)this, pFileUrl->GetObfuscatedURL().c_str(), status->ToStr().c_str() );
2371
2372 if( pDataServer && !pDataServer->IsLocalFile() )
2373 {
2374 //------------------------------------------------------------------------
2375 // Check if we are using a secure connection
2376 //------------------------------------------------------------------------
2377 XrdCl::AnyObject isencobj;
2378 XrdCl::XRootDStatus st = XrdCl::DefaultEnv::GetPostMaster()->
2379 QueryTransport( *pDataServer, XRootDQuery::IsEncrypted, isencobj );
2380 if( st.IsOK() )
2381 {
2382 bool *isenc;
2383 isencobj.Get( isenc );
2384 pIsChannelEncrypted = isenc ? *isenc : false;
2385 delete isenc;
2386 }
2387 }
2388
2389 //--------------------------------------------------------------------------
2390 // We have failed
2391 //--------------------------------------------------------------------------
2392 pStatus = *status;
2393 if( !pStatus.IsOK() || !openInfo )
2394 {
2395 log->Debug(FileMsg, "[%p@%s] Error while opening at %s: %s",
2396 (void*)this, pFileUrl->GetObfuscatedURL().c_str(), lastServer.c_str(),
2397 pStatus.ToStr().c_str() );
2398 FailQueuedMessages( pStatus );
2399 pFileState = Error;
2400
2401 //------------------------------------------------------------------------
2402 // Report to monitoring
2403 //------------------------------------------------------------------------
2404 Monitor *mon = DefaultEnv::GetMonitor();
2405 if( mon )
2406 {
2407 Monitor::ErrorInfo i;
2408 i.file = pFileUrl;
2409 i.status = status;
2410 i.opCode = Monitor::ErrorInfo::ErrOpen;
2411 mon->Event( Monitor::EvErrIO, &i );
2412 }
2413 }
2414 //--------------------------------------------------------------------------
2415 // We have succeeded
2416 //--------------------------------------------------------------------------
2417 else
2418 {
2419 //------------------------------------------------------------------------
2420 // Store the response info
2421 //------------------------------------------------------------------------
2422 openInfo->GetFileHandle( pFileHandle );
2423 pSessionId = openInfo->GetSessionId();
2424 if( openInfo->GetStatInfo() )
2425 {
2426 delete pStatInfo;
2427 pStatInfo = new StatInfo( *openInfo->GetStatInfo() );
2428 }
2429
2430 log->Debug( FileMsg, "[%p@%s] successfully opened at %s, handle: %#x, "
2431 "session id: %llu", (void*)this, pFileUrl->GetObfuscatedURL().c_str(),
2432 pDataServer->GetHostId().c_str(), *((uint32_t*)pFileHandle),
2433 (unsigned long long) pSessionId );
2434
2435 //------------------------------------------------------------------------
2436 // Inform the monitoring about opening success
2437 //------------------------------------------------------------------------
2438 gettimeofday( &pOpenTime, 0 );
2439 Monitor *mon = DefaultEnv::GetMonitor();
2440 if( mon )
2441 {
2442 Monitor::OpenInfo i;
2443 i.file = pFileUrl;
2444 i.dataServer = pDataServer->GetHostId();
2445 i.oFlags = pOpenFlags;
2446 i.fSize = pStatInfo ? pStatInfo->GetSize() : 0;
2447 mon->Event( Monitor::EvOpen, &i );
2448 }
2449
2450 //------------------------------------------------------------------------
2451 // Resend the queued messages if any
2452 //------------------------------------------------------------------------
2453 ReSendQueuedMessages();
2454 pFileState = Opened;
2455 }
2456 }
#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::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::ErrorInfo::opCode, Opened, 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 2483 of file XrdClFileStateHandler.cc.

2488 {
2489 //--------------------------------------------------------------------------
2490 // It may be a redirection
2491 //--------------------------------------------------------------------------
2492 if( !status->IsOK() && status->code == errRedirect && self->pFollowRedirects )
2493 {
2494 static const std::string root = "root", xroot = "xroot", file = "file",
2495 roots = "roots", xroots = "xroots";
2496 std::string msg = status->GetErrorMessage();
2497 if( !msg.compare( 0, root.size(), root ) ||
2498 !msg.compare( 0, xroot.size(), xroot ) ||
2499 !msg.compare( 0, file.size(), file ) ||
2500 !msg.compare( 0, roots.size(), roots ) ||
2501 !msg.compare( 0, xroots.size(), xroots ) )
2502 {
2503 FileStateHandler::OnStateRedirection( self, msg, message, userHandler, sendParams );
2504 return;
2505 }
2506 }
2507
2508 //--------------------------------------------------------------------------
2509 // Handle error
2510 //--------------------------------------------------------------------------
2511 Log *log = DefaultEnv::GetLog();
2512 XrdSysMutexHelper scopedLock( self->pMutex );
2513 self->pInTheFly.erase( message );
2514
2515 log->Dump( FileMsg, "[%p@%s] File state error encountered. Message %s "
2516 "returned with %s", (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2517 message->GetObfuscatedDescription().c_str(), status->ToStr().c_str() );
2518
2519 //--------------------------------------------------------------------------
2520 // Report to monitoring
2521 //--------------------------------------------------------------------------
2522 Monitor *mon = DefaultEnv::GetMonitor();
2523 if( mon )
2524 {
2525 Monitor::ErrorInfo i;
2526 i.file = self->pFileUrl;
2527 i.status = status;
2528
2529 ClientRequest *req = (ClientRequest*)message->GetBuffer();
2530 switch( req->header.requestid )
2531 {
2532 case kXR_read: i.opCode = Monitor::ErrorInfo::ErrRead; break;
2533 case kXR_readv: i.opCode = Monitor::ErrorInfo::ErrReadV; break;
2534 case kXR_pgread: i.opCode = Monitor::ErrorInfo::ErrRead; break;
2535 case kXR_write: i.opCode = Monitor::ErrorInfo::ErrWrite; break;
2536 case kXR_writev: i.opCode = Monitor::ErrorInfo::ErrWriteV; break;
2537 case kXR_pgwrite: i.opCode = Monitor::ErrorInfo::ErrWrite; break;
2538 default: i.opCode = Monitor::ErrorInfo::ErrUnc;
2539 }
2540
2541 mon->Event( Monitor::EvErrIO, &i );
2542 }
2543
2544 //--------------------------------------------------------------------------
2545 // The message is not recoverable
2546 // (message using a kernel buffer is not recoverable by definition)
2547 //--------------------------------------------------------------------------
2548 if( !self->IsRecoverable( *status ) || sendParams.kbuff )
2549 {
2550 log->Error( FileMsg, "[%p@%s] Fatal file state error. Message %s "
2551 "returned with %s", (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2552 message->GetObfuscatedDescription().c_str(), status->ToStr().c_str() );
2553
2554 self->FailMessage( RequestData( message, userHandler, sendParams ), *status );
2555 delete status;
2556 return;
2557 }
2558
2559 //--------------------------------------------------------------------------
2560 // Insert the message to the recovery queue and start the recovery
2561 // procedure if we don't have any more message in the fly
2562 //--------------------------------------------------------------------------
2563 self->pCloseReason = *status;
2564 RecoverMessage( self, RequestData( message, userHandler, sendParams ) );
2565 delete status;
2566 }
struct ClientRequestHdr header
Definition XProtocol.hh:846
kXR_unt16 requestid
Definition XProtocol.hh:157
@ kXR_read
Definition XProtocol.hh:125
@ kXR_writev
Definition XProtocol.hh:143
@ kXR_readv
Definition XProtocol.hh:137
@ kXR_pgread
Definition XProtocol.hh:142
@ kXR_pgwrite
Definition XProtocol.hh:138
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 2571 of file XrdClFileStateHandler.cc.

2576 {
2577 XrdSysMutexHelper scopedLock( self->pMutex );
2578 self->pInTheFly.erase( message );
2579
2580 //--------------------------------------------------------------------------
2581 // Register the state redirect url and append the new cgi information to
2582 // the file URL
2583 //--------------------------------------------------------------------------
2584 if( !self->pStateRedirect )
2585 {
2586 std::ostringstream o;
2587 self->pStateRedirect = new URL( redirectUrl );
2588 URL::ParamsMap params = self->pFileUrl->GetParams();
2589 MessageUtils::MergeCGI( params,
2590 self->pStateRedirect->GetParams(),
2591 false );
2592 self->pFileUrl->SetParams( params );
2593 }
2594
2595 RecoverMessage( self, RequestData( message, userHandler, sendParams ) );
2596 }

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 2601 of file XrdClFileStateHandler.cc.

2606 {
2607 Log *log = DefaultEnv::GetLog();
2608 XrdSysMutexHelper scopedLock( self->pMutex );
2609
2610 log->Dump( FileMsg, "[%p@%s] Got state response for message %s",
2611 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2612 message->GetObfuscatedDescription().c_str() );
2613
2614 //--------------------------------------------------------------------------
2615 // Since this message may be the last "in-the-fly" and no recovery
2616 // is done if messages are in the fly, we may need to trigger recovery
2617 //--------------------------------------------------------------------------
2618 self->pInTheFly.erase( message );
2619 RunRecovery( self );
2620
2621 //--------------------------------------------------------------------------
2622 // Play with the actual response before returning it. This is a good
2623 // place to do caching in the future.
2624 //--------------------------------------------------------------------------
2625 ClientRequest *req = (ClientRequest*)message->GetBuffer();
2626 switch( req->header.requestid )
2627 {
2628 //------------------------------------------------------------------------
2629 // Cache the stat response
2630 //------------------------------------------------------------------------
2631 case kXR_stat:
2632 {
2633 StatInfo *info = 0;
2634 response->Get( info );
2635 delete self->pStatInfo;
2636 self->pStatInfo = new StatInfo( *info );
2637 break;
2638 }
2639
2640 //------------------------------------------------------------------------
2641 // Handle read response
2642 //------------------------------------------------------------------------
2643 case kXR_read:
2644 {
2645 ++self->pRCount;
2646 self->pRBytes += req->read.rlen;
2647 break;
2648 }
2649
2650 //------------------------------------------------------------------------
2651 // Handle read response
2652 //------------------------------------------------------------------------
2653 case kXR_pgread:
2654 {
2655 ++self->pRCount;
2656 self->pRBytes += req->pgread.rlen;
2657 break;
2658 }
2659
2660 //------------------------------------------------------------------------
2661 // Handle readv response
2662 //------------------------------------------------------------------------
2663 case kXR_readv:
2664 {
2665 ++self->pVRCount;
2666 size_t segs = req->header.dlen/sizeof(readahead_list);
2667 readahead_list *dataChunk = (readahead_list*)message->GetBuffer( 24 );
2668 for( size_t i = 0; i < segs; ++i )
2669 self->pVRBytes += dataChunk[i].rlen;
2670 self->pVSegs += segs;
2671 break;
2672 }
2673
2674 //------------------------------------------------------------------------
2675 // Handle write response
2676 //------------------------------------------------------------------------
2677 case kXR_write:
2678 {
2679 ++self->pWCount;
2680 self->pWBytes += req->write.dlen;
2681 break;
2682 }
2683
2684 //------------------------------------------------------------------------
2685 // Handle write response
2686 //------------------------------------------------------------------------
2687 case kXR_pgwrite:
2688 {
2689 ++self->pWCount;
2690 self->pWBytes += req->pgwrite.dlen;
2691 break;
2692 }
2693
2694 //------------------------------------------------------------------------
2695 // Handle writev response
2696 //------------------------------------------------------------------------
2697 case kXR_writev:
2698 {
2699 ++self->pVWCount;
2700 size_t size = req->header.dlen/sizeof(readahead_list);
2701 XrdProto::write_list *wrtList =
2702 reinterpret_cast<XrdProto::write_list*>( message->GetBuffer( 24 ) );
2703 for( size_t i = 0; i < size; ++i )
2704 self->pVWBytes += wrtList[i].wlen;
2705 break;
2706 }
2707 };
2708 }
struct ClientPgReadRequest pgread
Definition XProtocol.hh:861
struct ClientPgWriteRequest pgwrite
Definition XProtocol.hh:862
@ kXR_stat
Definition XProtocol.hh:129
struct ClientReadRequest read
Definition XProtocol.hh:867
struct ClientWriteRequest write
Definition XProtocol.hh:876

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,
uint16_t flags,
uint16_t mode,
ResponseHandler * handler,
uint16_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 755 of file XrdClFileStateHandler.cc.

761 {
762 XrdSysMutexHelper scopedLock( self->pMutex );
763
764 //--------------------------------------------------------------------------
765 // Check if we can proceed
766 //--------------------------------------------------------------------------
767 if( self->pFileState == Error )
768 return self->pStatus;
769
770 if( self->pFileState == OpenInProgress )
771 return XRootDStatus( stError, errInProgress );
772
773 if( self->pFileState == CloseInProgress || self->pFileState == Opened ||
774 self->pFileState == Recovering )
775 return XRootDStatus( stError, errInvalidOp );
776
777 self->pFileState = OpenInProgress;
778
779 //--------------------------------------------------------------------------
780 // Check if the parameters are valid
781 //--------------------------------------------------------------------------
782 Log *log = DefaultEnv::GetLog();
783
784 if( self->pFileUrl )
785 {
786 if( self->pUseVirtRedirector && self->pFileUrl->IsMetalink() )
787 {
788 RedirectorRegistry& registry = RedirectorRegistry::Instance();
789 registry.Release( *self->pFileUrl );
790 }
791 delete self->pFileUrl;
792 self->pFileUrl = 0;
793 }
794
795 self->pFileUrl = new URL( url );
796
797 //--------------------------------------------------------------------------
798 // Add unique uuid to each open request so replays due to error/timeout
799 // recovery can be correctly handled.
800 //--------------------------------------------------------------------------
801 URL::ParamsMap cgi = self->pFileUrl->GetParams();
802 uuid_t uuid;
803 char requuid[37]= {0};
804 uuid_generate( uuid );
805 uuid_unparse( uuid, requuid );
806 cgi["xrdcl.requuid"] = requuid;
807 self->pFileUrl->SetParams( cgi );
808
809 if( !self->pFileUrl->IsValid() )
810 {
811 log->Error( FileMsg, "[%p@%s] Trying to open invalid url: %s",
812 (void*)self.get(), self->pFileUrl->GetPath().c_str(), url.c_str() );
813 self->pStatus = XRootDStatus( stError, errInvalidArgs );
814 self->pFileState = Closed;
815 return self->pStatus;
816 }
817
818 //--------------------------------------------------------------------------
819 // Check if the recovery procedures should be enabled
820 //--------------------------------------------------------------------------
821 const URL::ParamsMap &urlParams = self->pFileUrl->GetParams();
822 URL::ParamsMap::const_iterator it;
823 it = urlParams.find( "xrdcl.recover-reads" );
824 if( (it != urlParams.end() && it->second == "false") ||
825 !self->pDoRecoverRead )
826 {
827 self->pDoRecoverRead = false;
828 log->Debug( FileMsg, "[%p@%s] Read recovery procedures are disabled",
829 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str() );
830 }
831
832 it = urlParams.find( "xrdcl.recover-writes" );
833 if( (it != urlParams.end() && it->second == "false") ||
834 !self->pDoRecoverWrite )
835 {
836 self->pDoRecoverWrite = false;
837 log->Debug( FileMsg, "[%p@%s] Write recovery procedures are disabled",
838 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str() );
839 }
840
841 //--------------------------------------------------------------------------
842 // Open the file
843 //--------------------------------------------------------------------------
844 log->Debug( FileMsg, "[%p@%s] Sending an open command", (void*)self.get(),
845 self->pFileUrl->GetObfuscatedURL().c_str() );
846
847 self->pOpenMode = mode;
848 self->pOpenFlags = flags;
849 OpenHandler *openHandler = new OpenHandler( self, handler );
850
851 Message *msg;
852 ClientOpenRequest *req;
853 std::string path = self->pFileUrl->GetPathWithFilteredParams();
854 MessageUtils::CreateRequest( msg, req, path.length() );
855
856 req->requestid = kXR_open;
857 req->mode = mode;
858 req->options = flags | kXR_async | kXR_retstat;
859 req->dlen = path.length();
860 msg->Append( path.c_str(), path.length(), 24 );
861
863 MessageSendParams params; params.timeout = timeout;
864 params.followRedirects = self->pFollowRedirects;
866
867 XRootDStatus st = self->IssueRequest( *self->pFileUrl, msg, openHandler, params );
868
869 if( !st.IsOK() )
870 {
871 delete openHandler;
872 self->pStatus = st;
873 self->pFileState = Closed;
874 return st;
875 }
876 return st;
877 }
kXR_unt16 requestid
Definition XProtocol.hh:479
kXR_unt16 options
Definition XProtocol.hh:481
@ kXR_async
Definition XProtocol.hh:458
@ kXR_retstat
Definition XProtocol.hh:463
@ kXR_open
Definition XProtocol.hh:122
const uint16_t errInvalidArgs

References ::OpenHandler, XrdCl::Buffer::Append(), Closed, CloseInProgress, XrdCl::MessageUtils::CreateRequest(), XrdCl::Log::Debug(), ClientOpenRequest::dlen, XrdCl::errInProgress, XrdCl::errInvalidArgs, XrdCl::errInvalidOp, Error, XrdCl::Log::Error(), XrdCl::FileMsg, XrdCl::MessageSendParams::followRedirects, XrdCl::DefaultEnv::GetLog(), XrdCl::RedirectorRegistry::Instance(), XrdCl::Status::IsOK(), kXR_async, kXR_open, kXR_retstat, ClientOpenRequest::mode, Opened, OpenInProgress, ClientOpenRequest::options, XrdCl::MessageUtils::ProcessSendParams(), Recovering, XrdCl::RedirectorRegistry::Release(), ClientOpenRequest::requestid, XrdCl::XRootDTransport::SetDescription(), XrdCl::stError, and XrdCl::MessageSendParams::timeout.

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

+ Here is the call graph for this function:
+ 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,
uint16_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 1063 of file XrdClFileStateHandler.cc.

1069 {
1070 int issupported = true;
1071 AnyObject obj;
1072 XRootDStatus st1 = DefaultEnv::GetPostMaster()->QueryTransport( *self->pDataServer, XRootDQuery::ServerFlags, obj );
1073 int protver = 0;
1074 XRootDStatus st2 = Utils::GetProtocolVersion( *self->pDataServer, protver );
1075 if( st1.IsOK() && st2.IsOK() )
1076 {
1077 int *ptr = 0;
1078 obj.Get( ptr );
1079 issupported = ( ptr && (*ptr & kXR_suppgrw) ) && ( protver >= kXR_PROTPGRWVERSION );
1080 delete ptr;
1081 }
1082 else
1083 issupported = false;
1084
1085 if( !issupported )
1086 {
1087 DefaultEnv::GetLog()->Debug( FileMsg, "[%p@%s] PgRead not supported; substituting with Read.",
1088 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str() );
1089 ResponseHandler *substitHandler = new PgReadSubstitutionHandler( self, handler );
1090 auto st = Read( self, offset, size, buffer, substitHandler, timeout );
1091 if( !st.IsOK() ) delete substitHandler;
1092 return st;
1093 }
1094
1095 ResponseHandler* pgHandler = new PgReadHandler( self, handler, offset );
1096 auto st = PgReadImpl( self, offset, size, buffer, PgReadFlags::None, pgHandler, timeout );
1097 if( !st.IsOK() ) delete pgHandler;
1098 return st;
1099 }
#define kXR_suppgrw
#define kXR_PROTPGRWVERSION
Definition XProtocol.hh:73
static XRootDStatus PgReadImpl(std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, uint16_t flags, ResponseHandler *handler, uint16_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,
uint16_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 1119 of file XrdClFileStateHandler.cc.

1126 {
1127 XrdSysMutexHelper scopedLock( self->pMutex );
1128
1129 if( self->pFileState == Error ) return self->pStatus;
1130
1131 if( self->pFileState != Opened && self->pFileState != Recovering )
1132 return XRootDStatus( stError, errInvalidOp );
1133
1134 Log *log = DefaultEnv::GetLog();
1135 log->Debug( FileMsg, "[%p@%s] Sending a pgread command for handle %#x to %s",
1136 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1137 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1138
1139 Message *msg;
1140 ClientPgReadRequest *req;
1141 MessageUtils::CreateRequest( msg, req, sizeof( ClientPgReadReqArgs ) );
1142
1143 req->requestid = kXR_pgread;
1144 req->offset = offset;
1145 req->rlen = size;
1146 memcpy( req->fhandle, self->pFileHandle, 4 );
1147
1148 //--------------------------------------------------------------------------
1149 // Now adjust the message size so it can hold PgRead arguments
1150 //--------------------------------------------------------------------------
1151 req->dlen = sizeof( ClientPgReadReqArgs );
1152 void *newBuf = msg->GetBuffer( sizeof( ClientPgReadRequest ) );
1153 memset( newBuf, 0, sizeof( ClientPgReadReqArgs ) );
1154 ClientPgReadReqArgs *args = reinterpret_cast<ClientPgReadReqArgs*>(
1155 msg->GetBuffer( sizeof( ClientPgReadRequest ) ) );
1156 args->reqflags = flags;
1157
1158 ChunkList *list = new ChunkList();
1159 list->push_back( ChunkInfo( offset, size, buffer ) );
1160
1162 MessageSendParams params;
1163 params.timeout = timeout;
1164 params.followRedirects = false;
1165 params.stateful = true;
1166 params.chunkList = list;
1168 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1169
1170 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1171 }
kXR_char fhandle[4]
Definition XProtocol.hh:509

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,
uint16_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 1101 of file XrdClFileStateHandler.cc.

1108 {
1109 if( size > (uint32_t)XrdSys::PageSize )
1110 return XRootDStatus( stError, errInvalidArgs, EINVAL,
1111 "PgRead retry size exceeded 4KB." );
1112
1113 ResponseHandler *retryHandler = new PgReadRetryHandler( handler, pgnb );
1114 XRootDStatus st = PgReadImpl( self, offset, size, buffer, PgReadFlags::Retry, retryHandler, timeout );
1115 if( !st.IsOK() ) delete retryHandler;
1116 return st;
1117 }
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,
uint16_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 1300 of file XrdClFileStateHandler.cc.

1307 {
1308 //--------------------------------------------------------------------------
1309 // Resolve timeout value
1310 //--------------------------------------------------------------------------
1311 if( timeout == 0 )
1312 {
1313 int val = DefaultRequestTimeout;
1314 XrdCl::DefaultEnv::GetEnv()->GetInt( "RequestTimeout", val );
1315 timeout = val;
1316 }
1317
1318 //--------------------------------------------------------------------------
1319 // Validate the digest vector size
1320 //--------------------------------------------------------------------------
1321 if( cksums.empty() )
1322 {
1323 const char *data = static_cast<const char*>( buffer );
1324 XrdOucPgrwUtils::csCalc( data, offset, size, cksums );
1325 }
1326 else
1327 {
1328 size_t crc32cCnt = XrdOucPgrwUtils::csNum( offset, size );
1329 if( crc32cCnt != cksums.size() )
1330 return XRootDStatus( stError, errInvalidArgs, 0, "Wrong number of crc32c digests." );
1331 }
1332
1333 //--------------------------------------------------------------------------
1334 // Create a context for PgWrite operation
1335 //--------------------------------------------------------------------------
1336 struct pgwrt_t
1337 {
1338 pgwrt_t( ResponseHandler *h ) : handler( h ), status( nullptr )
1339 {
1340 }
1341
1342 ~pgwrt_t()
1343 {
1344 if( handler )
1345 {
1346 // if all retries were successful no error status was set
1347 if( !status ) status = new XRootDStatus();
1348 handler->HandleResponse( status, nullptr );
1349 }
1350 }
1351
1352 static size_t GetPgNb( uint64_t pgoff, uint64_t offset, uint32_t fstpglen )
1353 {
1354 if( pgoff == offset ) return 0; // we need this if statement because we operate on unsigned integers
1355 return ( pgoff - ( offset + fstpglen ) ) / XrdSys::PageSize + 1;
1356 }
1357
1358 inline void SetStatus( XRootDStatus* s )
1359 {
1360 if( !status ) status = s;
1361 else delete s;
1362 }
1363
1364 ResponseHandler *handler;
1365 XRootDStatus *status;
1366 };
1367 auto pgwrt = std::make_shared<pgwrt_t>( handler );
1368
1369 int fLen, lLen;
1370 XrdOucPgrwUtils::csNum( offset, size, fLen, lLen );
1371 uint32_t fstpglen = fLen;
1372
1373 time_t start = ::time( nullptr );
1374 auto h = ResponseHandler::Wrap( [=]( XrdCl::XRootDStatus *s, XrdCl::AnyObject *r ) mutable
1375 {
1376 std::unique_ptr<AnyObject> scoped( r );
1377 // if the request failed simply pass the status to the
1378 // user handler
1379 if( !s->IsOK() )
1380 {
1381 pgwrt->SetStatus( s );
1382 return; // pgwrt destructor will call the handler
1383 }
1384 // also if the request was sucessful and there were no
1385 // corrupted pages pass the status to the user handler
1386 RetryInfo *inf = nullptr;
1387 r->Get( inf );
1388 if( !inf->NeedRetry() )
1389 {
1390 pgwrt->SetStatus( s );
1391 return; // pgwrt destructor will call the handler
1392 }
1393 delete s;
1394 // first adjust the timeout value
1395 uint16_t elapsed = ::time( nullptr ) - start;
1396 if( elapsed >= timeout )
1397 {
1398 pgwrt->SetStatus( new XRootDStatus( stError, errOperationExpired ) );
1399 return; // pgwrt destructor will call the handler
1400 }
1401 else timeout -= elapsed;
1402 // retransmit the corrupted pages
1403 for( size_t i = 0; i < inf->Size(); ++i )
1404 {
1405 auto tpl = inf->At( i );
1406 uint64_t pgoff = std::get<0>( tpl );
1407 uint32_t pglen = std::get<1>( tpl );
1408 const void *pgbuf = static_cast<const char*>( buffer ) + ( pgoff - offset );
1409 uint32_t pgdigest = cksums[pgwrt_t::GetPgNb( pgoff, offset, fstpglen )];
1410 auto h = ResponseHandler::Wrap( [=]( XrdCl::XRootDStatus *s, XrdCl::AnyObject *r ) mutable
1411 {
1412 std::unique_ptr<AnyObject> scoped( r );
1413 // if we failed simply set the status
1414 if( !s->IsOK() )
1415 {
1416 pgwrt->SetStatus( s );
1417 return; // the destructor will call the handler
1418 }
1419 delete s;
1420 // otherwise check if the data were not corrupted again
1421 RetryInfo *inf = nullptr;
1422 r->Get( inf );
1423 if( inf->NeedRetry() ) // so we failed in the end
1424 {
1425 DefaultEnv::GetLog()->Warning( FileMsg, "[%p@%s] Failed retransmitting corrupted "
1426 "page: pgoff=%llu, pglen=%u, pgdigest=%u", (void*)self.get(),
1427 self->pFileUrl->GetObfuscatedURL().c_str(), (unsigned long long) pgoff, pglen, pgdigest );
1428 pgwrt->SetStatus( new XRootDStatus( stError, errDataError, 0,
1429 "Failed to retransmit corrupted page" ) );
1430 }
1431 else
1432 DefaultEnv::GetLog()->Info( FileMsg, "[%p@%s] Succesfuly retransmitted corrupted "
1433 "page: pgoff=%llu, pglen=%u, pgdigest=%u", (void*)self.get(),
1434 self->pFileUrl->GetObfuscatedURL().c_str(), (unsigned long long) pgoff, pglen, pgdigest );
1435 } );
1436 auto st = PgWriteRetry( self, pgoff, pglen, pgbuf, pgdigest, h, timeout );
1437 if( !st.IsOK() ) pgwrt->SetStatus( new XRootDStatus( st ) );
1438 DefaultEnv::GetLog()->Info( FileMsg, "[%p@%s] Retransmitting corrupted page: "
1439 "pgoff=%llu, pglen=%u, pgdigest=%u", (void*)self.get(),
1440 self->pFileUrl->GetObfuscatedURL().c_str(), (unsigned long long) pgoff, pglen, pgdigest );
1441 }
1442 } );
1443
1444 auto st = PgWriteImpl( self, offset, size, buffer, cksums, 0, h, timeout );
1445 if( !st.IsOK() )
1446 {
1447 pgwrt->handler = nullptr;
1448 delete h;
1449 }
1450 return st;
1451 }
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, uint16_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, uint16_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,
uint16_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 1471 of file XrdClFileStateHandler.cc.

1479 {
1480 XrdSysMutexHelper scopedLock( self->pMutex );
1481
1482 if( self->pFileState == Error ) return self->pStatus;
1483
1484 if( self->pFileState != Opened && self->pFileState != Recovering )
1485 return XRootDStatus( stError, errInvalidOp );
1486
1487 Log *log = DefaultEnv::GetLog();
1488 log->Debug( FileMsg, "[%p@%s] Sending a pgwrite command for handle %#x to %s",
1489 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1490 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1491
1492 //--------------------------------------------------------------------------
1493 // Create the message
1494 //--------------------------------------------------------------------------
1495 Message *msg;
1496 ClientPgWriteRequest *req;
1497 MessageUtils::CreateRequest( msg, req );
1498
1499 req->requestid = kXR_pgwrite;
1500 req->offset = offset;
1501 req->dlen = size + cksums.size() * sizeof( uint32_t );
1502 req->reqflags = flags;
1503 memcpy( req->fhandle, self->pFileHandle, 4 );
1504
1505 ChunkList *list = new ChunkList();
1506 list->push_back( ChunkInfo( offset, size, (char*)buffer ) );
1507
1508 MessageSendParams params;
1509 params.timeout = timeout;
1510 params.followRedirects = false;
1511 params.stateful = true;
1512 params.chunkList = list;
1513 params.crc32cDigests.swap( cksums );
1514
1516
1518 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1519
1520 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1521 }
kXR_char fhandle[4]
Definition XProtocol.hh:531

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,
uint16_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 1456 of file XrdClFileStateHandler.cc.

1463 {
1464 std::vector<uint32_t> cksums{ digest };
1465 return PgWriteImpl( self, offset, size, buffer, cksums, PgReadFlags::Retry, handler, timeout );
1466 }

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:

◆ Read()

XRootDStatus XrdCl::FileStateHandler::Read ( std::shared_ptr< FileStateHandler > & self,
uint64_t offset,
uint32_t size,
void * buffer,
ResponseHandler * handler,
uint16_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 1017 of file XrdClFileStateHandler.cc.

1023 {
1024 XrdSysMutexHelper scopedLock( self->pMutex );
1025
1026 if( self->pFileState == Error ) return self->pStatus;
1027
1028 if( self->pFileState != Opened && self->pFileState != Recovering )
1029 return XRootDStatus( stError, errInvalidOp );
1030
1031 Log *log = DefaultEnv::GetLog();
1032 log->Debug( FileMsg, "[%p@%s] Sending a read command for handle %#x to %s",
1033 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1034 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1035
1036 Message *msg;
1037 ClientReadRequest *req;
1038 MessageUtils::CreateRequest( msg, req );
1039
1040 req->requestid = kXR_read;
1041 req->offset = offset;
1042 req->rlen = size;
1043 memcpy( req->fhandle, self->pFileHandle, 4 );
1044
1045 ChunkList *list = new ChunkList();
1046 list->push_back( ChunkInfo( offset, size, buffer ) );
1047
1049 MessageSendParams params;
1050 params.timeout = timeout;
1051 params.followRedirects = false;
1052 params.stateful = true;
1053 params.chunkList = list;
1055 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1056
1057 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1058 }
kXR_unt16 requestid
Definition XProtocol.hh:644
kXR_char fhandle[4]
Definition XProtocol.hh:645

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 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,
uint16_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 1814 of file XrdClFileStateHandler.cc.

1820 {
1821 XrdSysMutexHelper scopedLock( self->pMutex );
1822
1823 if( self->pFileState == Error ) return self->pStatus;
1824
1825 if( self->pFileState != Opened && self->pFileState != Recovering )
1826 return XRootDStatus( stError, errInvalidOp );
1827
1828 Log *log = DefaultEnv::GetLog();
1829 log->Debug( FileMsg, "[%p@%s] Sending a read command for handle %#x to %s",
1830 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1831 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1832
1833 Message *msg;
1834 ClientReadRequest *req;
1835 MessageUtils::CreateRequest( msg, req );
1836
1837 // calculate the total read size
1838 size_t size = std::accumulate( iov, iov + iovcnt, 0, []( size_t acc, iovec &rhs )
1839 {
1840 return acc + rhs.iov_len;
1841 } );
1842 req->requestid = kXR_read;
1843 req->offset = offset;
1844 req->rlen = size;
1845 msg->SetVirtReqID( kXR_virtReadv );
1846 memcpy( req->fhandle, self->pFileHandle, 4 );
1847
1848 ChunkList *list = new ChunkList();
1849 list->reserve( iovcnt );
1850 uint64_t choff = offset;
1851 for( int i = 0; i < iovcnt; ++i )
1852 {
1853 list->emplace_back( choff, iov[i].iov_len, iov[i].iov_base );
1854 choff += iov[i].iov_len;
1855 }
1856
1858 MessageSendParams params;
1859 params.timeout = timeout;
1860 params.followRedirects = false;
1861 params.stateful = true;
1862 params.chunkList = list;
1864 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1865
1866 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1867 }
@ kXR_virtReadv
Definition XProtocol.hh:150

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 2251 of file XrdClFileStateHandler.cc.

2253 {
2254 XrdSysMutexHelper scopedLock( pMutex );
2255 if( name == "ReadRecovery" )
2256 {
2257 if( value == "true" ) pDoRecoverRead = true;
2258 else pDoRecoverRead = false;
2259 return true;
2260 }
2261 else if( name == "WriteRecovery" )
2262 {
2263 if( value == "true" ) pDoRecoverWrite = true;
2264 else pDoRecoverWrite = false;
2265 return true;
2266 }
2267 else if( name == "FollowRedirects" )
2268 {
2269 if( value == "true" ) pFollowRedirects = true;
2270 else pFollowRedirects = false;
2271 return true;
2272 }
2273 else if( name == "BundledClose" )
2274 {
2275 if( value == "true" ) pAllowBundledClose = true;
2276 else pAllowBundledClose = false;
2277 return true;
2278 }
2279 return false;
2280 }

References XrdCl::NullRef< Response >::value.

◆ SetXAttr()

XRootDStatus XrdCl::FileStateHandler::SetXAttr ( std::shared_ptr< FileStateHandler > & self,
const std::vector< xattr_t > & attrs,
ResponseHandler * handler,
uint16_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 1954 of file XrdClFileStateHandler.cc.

1958 {
1959 XrdSysMutexHelper scopedLock( self->pMutex );
1960
1961 if( self->pFileState == Error ) return self->pStatus;
1962
1963 if( self->pFileState != Opened && self->pFileState != Recovering )
1964 return XRootDStatus( stError, errInvalidOp );
1965
1966 Log *log = DefaultEnv::GetLog();
1967 log->Debug( FileMsg, "[%p@%s] Sending a fattr set command for handle %#x to %s",
1968 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1969 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1970
1971 //--------------------------------------------------------------------------
1972 // Issue a new fattr get request
1973 //--------------------------------------------------------------------------
1974 return XAttrOperationImpl( self, kXR_fattrSet, 0, attrs, handler, timeout );
1975 }
@ kXR_fattrSet
Definition XProtocol.hh:273

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,
uint16_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 960 of file XrdClFileStateHandler.cc.

964 {
965 XrdSysMutexHelper scopedLock( self->pMutex );
966
967 if( self->pFileState == Error ) return self->pStatus;
968
969 if( self->pFileState != Opened && self->pFileState != Recovering )
970 return XRootDStatus( stError, errInvalidOp );
971
972 //--------------------------------------------------------------------------
973 // Return the cached info
974 //--------------------------------------------------------------------------
975 if( !force )
976 {
977 AnyObject *obj = new AnyObject();
978 obj->Set( new StatInfo( *self->pStatInfo ) );
979 if (handler)
980 handler->HandleResponseWithHosts( new XRootDStatus(), obj, new HostList() );
981 return XRootDStatus();
982 }
983
984 Log *log = DefaultEnv::GetLog();
985 log->Debug( FileMsg, "[%p@%s] Sending a stat command for handle %#x to %s",
986 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
987 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
988
989 //--------------------------------------------------------------------------
990 // Issue a new stat request
991 // stating a file handle doesn't work (fixed in 3.2.0) so we need to
992 // stat the pat
993 //--------------------------------------------------------------------------
994 Message *msg;
995 ClientStatRequest *req;
996 std::string path = self->pFileUrl->GetPath();
997 MessageUtils::CreateRequest( msg, req );
998
999 req->requestid = kXR_stat;
1000 memcpy( req->fhandle, self->pFileHandle, 4 );
1001
1002 MessageSendParams params;
1003 params.timeout = timeout;
1004 params.followRedirects = false;
1005 params.stateful = true;
1007
1009 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1010
1011 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1012 }
kXR_char fhandle[4]
Definition XProtocol.hh:771
kXR_unt16 requestid
Definition XProtocol.hh:768
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,
uint16_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 1526 of file XrdClFileStateHandler.cc.

1529 {
1530 XrdSysMutexHelper scopedLock( self->pMutex );
1531
1532 if( self->pFileState == Error ) return self->pStatus;
1533
1534 if( self->pFileState != Opened && self->pFileState != Recovering )
1535 return XRootDStatus( stError, errInvalidOp );
1536
1537 Log *log = DefaultEnv::GetLog();
1538 log->Debug( FileMsg, "[%p@%s] Sending a sync command for handle %#x to %s",
1539 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1540 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1541
1542 Message *msg;
1543 ClientSyncRequest *req;
1544 MessageUtils::CreateRequest( msg, req );
1545
1546 req->requestid = kXR_sync;
1547 memcpy( req->fhandle, self->pFileHandle, 4 );
1548
1549 MessageSendParams params;
1550 params.timeout = timeout;
1551 params.followRedirects = false;
1552 params.stateful = true;
1554
1556 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1557
1558 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1559 }
kXR_char fhandle[4]
Definition XProtocol.hh:782
@ kXR_sync
Definition XProtocol.hh:128
kXR_unt16 requestid
Definition XProtocol.hh:781

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 2713 of file XrdClFileStateHandler.cc.

2714 {
2715 if (pMutex.CondLock())
2716 {TimeOutRequests( now );
2717 pMutex.UnLock();
2718 }
2719 }
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 2724 of file XrdClFileStateHandler.cc.

2725 {
2726 if( !pToBeRecovered.empty() )
2727 {
2728 Log *log = DefaultEnv::GetLog();
2729 log->Dump( FileMsg, "[%p@%s] Got a timer event", (void*)this,
2730 pFileUrl->GetObfuscatedURL().c_str() );
2731 RequestList::iterator it;
2732 JobManager *jobMan = DefaultEnv::GetPostMaster()->GetJobManager();
2733 for( it = pToBeRecovered.begin(); it != pToBeRecovered.end(); )
2734 {
2735 if( it->params.expires <= now )
2736 {
2737 jobMan->QueueJob( new ResponseJob(
2738 it->handler,
2739 new XRootDStatus( stError, errOperationExpired ),
2740 0, it->params.hostList ) );
2741 it = pToBeRecovered.erase( it );
2742 }
2743 else
2744 ++it;
2745 }
2746 }
2747 }

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,
uint16_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 1564 of file XrdClFileStateHandler.cc.

1568 {
1569 XrdSysMutexHelper scopedLock( self->pMutex );
1570
1571 if( self->pFileState == Error ) return self->pStatus;
1572
1573 if( self->pFileState != Opened && self->pFileState != Recovering )
1574 return XRootDStatus( stError, errInvalidOp );
1575
1576 Log *log = DefaultEnv::GetLog();
1577 log->Debug( FileMsg, "[%p@%s] Sending a truncate command for handle %#x to %s",
1578 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1579 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1580
1581 Message *msg;
1582 ClientTruncateRequest *req;
1583 MessageUtils::CreateRequest( msg, req );
1584
1585 req->requestid = kXR_truncate;
1586 memcpy( req->fhandle, self->pFileHandle, 4 );
1587 req->offset = size;
1588
1589 MessageSendParams params;
1590 params.timeout = timeout;
1591 params.followRedirects = false;
1592 params.stateful = true;
1594
1596 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1597
1598 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1599 }
@ kXR_truncate
Definition XProtocol.hh:140

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,
uint16_t timeout )
static

Try other data server.

Definition at line 2775 of file XrdClFileStateHandler.cc.

2776 {
2777 XrdSysMutexHelper scopedLock( self->pMutex );
2778
2779 if( self->pFileState != Opened || !self->pLoadBalancer )
2780 return XRootDStatus( stError, errInvalidOp );
2781
2782 self->pFileState = Recovering;
2783
2784 Log *log = DefaultEnv::GetLog();
2785 log->Debug( FileMsg, "[%p@%s] Reopen file at next data server.",
2786 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str() );
2787
2788 // merge CGI
2789 auto lbcgi = self->pLoadBalancer->GetParams();
2790 auto dtcgi = self->pDataServer->GetParams();
2791 MessageUtils::MergeCGI( lbcgi, dtcgi, false );
2792 // update tried CGI
2793 auto itr = lbcgi.find( "tried" );
2794 if( itr == lbcgi.end() )
2795 lbcgi["tried"] = self->pDataServer->GetHostName();
2796 else
2797 {
2798 std::string tried = itr->second;
2799 tried += "," + self->pDataServer->GetHostName();
2800 lbcgi["tried"] = tried;
2801 }
2802 self->pLoadBalancer->SetParams( lbcgi );
2803
2804 return ReOpenFileAtServer( self, *self->pLoadBalancer, timeout );
2805 }

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 688 of file XrdClFileStateHandler.hh.

689 {
690 pMutex.UnLock();
691 }

◆ VectorRead()

XRootDStatus XrdCl::FileStateHandler::VectorRead ( std::shared_ptr< FileStateHandler > & self,
const ChunkList & chunks,
void * buffer,
ResponseHandler * handler,
uint16_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 1604 of file XrdClFileStateHandler.cc.

1609 {
1610 //--------------------------------------------------------------------------
1611 // Sanity check
1612 //--------------------------------------------------------------------------
1613 XrdSysMutexHelper scopedLock( self->pMutex );
1614
1615 if( self->pFileState == Error ) return self->pStatus;
1616
1617 if( self->pFileState != Opened && self->pFileState != Recovering )
1618 return XRootDStatus( stError, errInvalidOp );
1619
1620 Log *log = DefaultEnv::GetLog();
1621 log->Debug( FileMsg, "[%p@%s] Sending a vector read command for handle %#x to %s",
1622 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1623 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1624
1625 //--------------------------------------------------------------------------
1626 // Build the message
1627 //--------------------------------------------------------------------------
1628 Message *msg;
1629 ClientReadVRequest *req;
1630 MessageUtils::CreateRequest( msg, req, sizeof(readahead_list)*chunks.size() );
1631
1632 req->requestid = kXR_readv;
1633 req->dlen = sizeof(readahead_list)*chunks.size();
1634
1635 ChunkList *list = new ChunkList();
1636 char *cursor = (char*)buffer;
1637
1638 //--------------------------------------------------------------------------
1639 // Copy the chunk info
1640 //--------------------------------------------------------------------------
1641 readahead_list *dataChunk = (readahead_list*)msg->GetBuffer( 24 );
1642 for( size_t i = 0; i < chunks.size(); ++i )
1643 {
1644 dataChunk[i].rlen = chunks[i].length;
1645 dataChunk[i].offset = chunks[i].offset;
1646 memcpy( dataChunk[i].fhandle, self->pFileHandle, 4 );
1647
1648 void *chunkBuffer;
1649 if( cursor )
1650 {
1651 chunkBuffer = cursor;
1652 cursor += chunks[i].length;
1653 }
1654 else
1655 chunkBuffer = chunks[i].buffer;
1656
1657 list->push_back( ChunkInfo( chunks[i].offset,
1658 chunks[i].length,
1659 chunkBuffer ) );
1660 }
1661
1662 //--------------------------------------------------------------------------
1663 // Send the message
1664 //--------------------------------------------------------------------------
1665 MessageSendParams params;
1666 params.timeout = timeout;
1667 params.followRedirects = false;
1668 params.stateful = true;
1669 params.chunkList = list;
1671
1673 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1674
1675 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1676 }
kXR_int32 rlen
Definition XProtocol.hh:660
kXR_int64 offset
Definition XProtocol.hh:661
kXR_unt16 requestid
Definition XProtocol.hh:670

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,
uint16_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 1681 of file XrdClFileStateHandler.cc.

1685 {
1686 //--------------------------------------------------------------------------
1687 // Sanity check
1688 //--------------------------------------------------------------------------
1689 XrdSysMutexHelper scopedLock( self->pMutex );
1690
1691 if( self->pFileState == Error ) return self->pStatus;
1692
1693 if( self->pFileState != Opened && self->pFileState != Recovering )
1694 return XRootDStatus( stError, errInvalidOp );
1695
1696 Log *log = DefaultEnv::GetLog();
1697 log->Debug( FileMsg, "[%p@%s] Sending a vector write command for handle %#x to %s",
1698 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1699 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1700
1701 //--------------------------------------------------------------------------
1702 // Determine the size of the payload
1703 //--------------------------------------------------------------------------
1704
1705 // the size of write vector
1706 uint32_t payloadSize = sizeof(XrdProto::write_list) * chunks.size();
1707
1708 //--------------------------------------------------------------------------
1709 // Build the message
1710 //--------------------------------------------------------------------------
1711 Message *msg;
1712 ClientWriteVRequest *req;
1713 MessageUtils::CreateRequest( msg, req, payloadSize );
1714
1715 req->requestid = kXR_writev;
1716 req->dlen = sizeof(XrdProto::write_list) * chunks.size();
1717
1718 ChunkList *list = new ChunkList();
1719
1720 //--------------------------------------------------------------------------
1721 // Copy the chunk info
1722 //--------------------------------------------------------------------------
1723 XrdProto::write_list *writeList =
1724 reinterpret_cast<XrdProto::write_list*>( msg->GetBuffer( 24 ) );
1725
1726
1727
1728 for( size_t i = 0; i < chunks.size(); ++i )
1729 {
1730 writeList[i].wlen = chunks[i].length;
1731 writeList[i].offset = chunks[i].offset;
1732 memcpy( writeList[i].fhandle, self->pFileHandle, 4 );
1733
1734 list->push_back( ChunkInfo( chunks[i].offset,
1735 chunks[i].length,
1736 chunks[i].buffer ) );
1737 }
1738
1739 //--------------------------------------------------------------------------
1740 // Send the message
1741 //--------------------------------------------------------------------------
1742 MessageSendParams params;
1743 params.timeout = timeout;
1744 params.followRedirects = false;
1745 params.stateful = true;
1746 params.chunkList = list;
1748
1750 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1751
1752 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1753 }

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,
uint16_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 1915 of file XrdClFileStateHandler.cc.

1918 {
1919 XrdSysMutexHelper scopedLock( self->pMutex );
1920
1921 if( self->pFileState == Error ) return self->pStatus;
1922
1923 if( self->pFileState != Opened && self->pFileState != Recovering )
1924 return XRootDStatus( stError, errInvalidOp );
1925
1926 Log *log = DefaultEnv::GetLog();
1927 log->Debug( FileMsg, "[%p@%s] Sending a visa command for handle %#x to %s",
1928 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1929 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1930
1931 Message *msg;
1932 ClientQueryRequest *req;
1933 MessageUtils::CreateRequest( msg, req );
1934
1935 req->requestid = kXR_query;
1936 req->infotype = kXR_Qvisa;
1937 memcpy( req->fhandle, self->pFileHandle, 4 );
1938
1939 MessageSendParams params;
1940 params.timeout = timeout;
1941 params.followRedirects = false;
1942 params.stateful = true;
1944
1946 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1947
1948 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1949 }
@ kXR_Qvisa
Definition XProtocol.hh:622

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,
uint16_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 1224 of file XrdClFileStateHandler.cc.

1229 {
1230 //--------------------------------------------------------------------------
1231 // If the memory is not page (4KB) aligned we cannot use the kernel buffer
1232 // so fall back to normal write
1233 //--------------------------------------------------------------------------
1234 if( !XrdSys::KernelBuffer::IsPageAligned( buffer.GetBuffer() ) || self->pIsChannelEncrypted )
1235 {
1236 Log *log = DefaultEnv::GetLog();
1237 log->Info( FileMsg, "[%p@%s] Buffer for handle %#x is not page aligned (4KB), "
1238 "cannot convert it to kernel space buffer.", (void*)self.get(),
1239 self->pFileUrl->GetObfuscatedURL().c_str(), *((uint32_t*)self->pFileHandle) );
1240
1241 void *buff = buffer.GetBuffer();
1242 uint32_t size = buffer.GetSize();
1243 ReleaseBufferHandler *wrtHandler =
1244 new ReleaseBufferHandler( std::move( buffer ), handler );
1245 XRootDStatus st = self->Write( self, offset, size, buff, wrtHandler, timeout );
1246 if( !st.IsOK() )
1247 {
1248 buffer = std::move( wrtHandler->GetBuffer() );
1249 delete wrtHandler;
1250 }
1251 return st;
1252 }
1253
1254 //--------------------------------------------------------------------------
1255 // Transfer the data from user space to kernel space
1256 //--------------------------------------------------------------------------
1257 uint32_t length = buffer.GetSize();
1258 char *ubuff = buffer.Release();
1259
1260 std::unique_ptr<XrdSys::KernelBuffer> kbuff( new XrdSys::KernelBuffer() );
1261 ssize_t ret = XrdSys::Move( ubuff, *kbuff, length );
1262 if( ret < 0 )
1263 return XRootDStatus( stError, errInternal, XProtocol::mapError( errno ) );
1264
1265 //--------------------------------------------------------------------------
1266 // Now create a write request and enqueue it
1267 //--------------------------------------------------------------------------
1268 return WriteKernelBuffer( self, offset, ret, std::move( kbuff ), handler, timeout );
1269 }
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,
uint16_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 1176 of file XrdClFileStateHandler.cc.

1182 {
1183 XrdSysMutexHelper scopedLock( self->pMutex );
1184
1185 if( self->pFileState == Error ) return self->pStatus;
1186
1187 if( self->pFileState != Opened && self->pFileState != Recovering )
1188 return XRootDStatus( stError, errInvalidOp );
1189
1190 Log *log = DefaultEnv::GetLog();
1191 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
1192 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1193 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1194
1195 Message *msg;
1196 ClientWriteRequest *req;
1197 MessageUtils::CreateRequest( msg, req );
1198
1199 req->requestid = kXR_write;
1200 req->offset = offset;
1201 req->dlen = size;
1202 memcpy( req->fhandle, self->pFileHandle, 4 );
1203
1204 ChunkList *list = new ChunkList();
1205 list->push_back( ChunkInfo( 0, size, (char*)buffer ) );
1206
1207 MessageSendParams params;
1208 params.timeout = timeout;
1209 params.followRedirects = false;
1210 params.stateful = true;
1211 params.chunkList = list;
1212
1214
1216 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1217
1218 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1219 }

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,
uint16_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 1274 of file XrdClFileStateHandler.cc.

1281 {
1282 //--------------------------------------------------------------------------
1283 // Read the data from the file descriptor into a kernel buffer
1284 //--------------------------------------------------------------------------
1285 std::unique_ptr<XrdSys::KernelBuffer> kbuff( new XrdSys::KernelBuffer() );
1286 ssize_t ret = fdoff ? XrdSys::Read( fd, *kbuff, size, *fdoff ) :
1287 XrdSys::Read( fd, *kbuff, size );
1288 if( ret < 0 )
1289 return XRootDStatus( stError, errInternal, XProtocol::mapError( errno ) );
1290
1291 //--------------------------------------------------------------------------
1292 // Now create a write request and enqueue it
1293 //--------------------------------------------------------------------------
1294 return WriteKernelBuffer( self, offset, ret, std::move( kbuff ), handler, timeout );
1295 }
static XRootDStatus Read(std::shared_ptr< FileStateHandler > &self, uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, uint16_t timeout=0)
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,
uint16_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 1758 of file XrdClFileStateHandler.cc.

1764 {
1765 XrdSysMutexHelper scopedLock( self->pMutex );
1766
1767 if( self->pFileState == Error ) return self->pStatus;
1768
1769 if( self->pFileState != Opened && self->pFileState != Recovering )
1770 return XRootDStatus( stError, errInvalidOp );
1771
1772 Log *log = DefaultEnv::GetLog();
1773 log->Debug( FileMsg, "[%p@%s] Sending a write command for handle %#x to %s",
1774 (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
1775 *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
1776
1777 Message *msg;
1778 ClientWriteRequest *req;
1779 MessageUtils::CreateRequest( msg, req );
1780
1781 ChunkList *list = new ChunkList();
1782
1783 uint32_t size = 0;
1784 for( int i = 0; i < iovcnt; ++i )
1785 {
1786 if( iov[i].iov_len == 0 ) continue;
1787 size += iov[i].iov_len;
1788 list->push_back( ChunkInfo( 0, iov[i].iov_len,
1789 (char*)iov[i].iov_base ) );
1790 }
1791
1792 req->requestid = kXR_write;
1793 req->offset = offset;
1794 req->dlen = size;
1795 memcpy( req->fhandle, self->pFileHandle, 4 );
1796
1797 MessageSendParams params;
1798 params.timeout = timeout;
1799 params.followRedirects = false;
1800 params.stateful = true;
1801 params.chunkList = list;
1802
1804
1806 StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
1807
1808 return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
1809 }

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 84 of file XrdClFileStateHandler.hh.

Referenced by Open().

◆ ::PgReadHandler

friend class ::PgReadHandler
friend

Definition at line 81 of file XrdClFileStateHandler.hh.

Referenced by PgRead(), and PgReadRetry().

◆ ::PgReadRetryHandler

friend class ::PgReadRetryHandler
friend

Definition at line 82 of file XrdClFileStateHandler.hh.

Referenced by PgReadRetry().

◆ ::PgReadSubstitutionHandler

friend class ::PgReadSubstitutionHandler
friend

Definition at line 83 of file XrdClFileStateHandler.hh.

Referenced by PgRead().


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