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

Handle the stateful operations. More...

#include <XrdClFileStateHandler.hh>

Collaboration diagram for XrdCl::FileStateHandler:

Public Types

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

Public Member Functions

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

Static Public Member Functions

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

Friends

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

Detailed Description

Handle the stateful operations.

Definition at line 95 of file XrdClFileStateHandler.hh.

Member Enumeration Documentation

◆ FileStatus

State of the file.

Enumerator
Closed 

The file is closed.

Opened 

Opening has succeeded.

Error 

Opening has failed.

Recovering 

Recovering from an error.

OpenInProgress 

Opening is in progress.

CloseInProgress 

Closing operation is in progress.

Definition at line 106 of file XrdClFileStateHandler.hh.

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

Constructor & Destructor Documentation

◆ FileStateHandler() [1/2]

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

Constructor.

Definition at line 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( OpenFlags::None ),
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( OpenFlags::None ),
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 2874 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ Checkpoint()

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

Create a checkpoint

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

Definition at line 2183 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ ChkptWrt()

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

Checkpointed write - async

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

Definition at line 2232 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ ChkptWrtV()

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

Checkpointed WriteV - async

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

Write scattered buffers in one operation - async

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

Definition at line 2294 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ Clone()

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

Clone ranges of files into the current file

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

Definition at line 3489 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ Close()

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

Close the file object

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

Definition at line 929 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ DelXAttr()

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

Delete extended attributes - async

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

Definition at line 2122 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ ExportTemplate()

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

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

Definition at line 788 of file XrdClFileStateHandler.hh.

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

◆ Fcntl()

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

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

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

Definition at line 1988 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ GetProperty()

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

Get file property

See also
File::SetProperty for property list

Definition at line 2401 of file XrdClFileStateHandler.cc.

2403 {
2404 XrdSysMutexHelper scopedLock( pMutex );
2405 if( name == "ReadRecovery" )
2406 {
2407 if( pDoRecoverRead ) value = "true";
2408 else value = "false";
2409 return true;
2410 }
2411 else if( name == "WriteRecovery" )
2412 {
2413 if( pDoRecoverWrite ) value = "true";
2414 else value = "false";
2415 return true;
2416 }
2417 else if( name == "FollowRedirects" )
2418 {
2419 if( pFollowRedirects ) value = "true";
2420 else value = "false";
2421 return true;
2422 }
2423 else if( name == "DataServer" && pDataServer )
2424 { value = pDataServer->GetHostId(); return true; }
2425 else if( name == "LastURL" && pDataServer )
2426 { value = pDataServer->GetURL(); return true; }
2427 else if( name == "WrtRecoveryRedir" && pWrtRecoveryRedir )
2428 { value = pWrtRecoveryRedir->GetHostId(); return true; }
2429 value = "";
2430 return false;
2431 }

◆ GetXAttr()

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

Get extended attributes - async

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

Definition at line 2096 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ IsOpen()

bool XrdCl::FileStateHandler::IsOpen ( ) const

Check if the file is open.

Definition at line 2355 of file XrdClFileStateHandler.cc.

2356 {
2357 XrdSysMutexHelper scopedLock( pMutex );
2358
2359 if( pFileState == Opened || pFileState == Recovering )
2360 return true;
2361 return false;
2362 }

References Opened, and Recovering.

◆ IsSecure()

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

Check if the file is using an encrypted connection.

Definition at line 728 of file XrdClFileStateHandler.hh.

729 {
730 return pIsChannelEncrypted;
731 }

◆ ListXAttr()

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

List extended attributes - async

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

Definition at line 2148 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Lock()

void XrdCl::FileStateHandler::Lock ( )
inline

Lock the internal lock.

Definition at line 750 of file XrdClFileStateHandler.hh.

751 {
752 pMutex.Lock();
753 }

◆ NeedFileTempl()

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

Checks if we need to set a file template.

Definition at line 797 of file XrdClFileStateHandler.hh.

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

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

◆ OnClose()

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

Process the results of the closing operation.

Definition at line 2583 of file XrdClFileStateHandler.cc.

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

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

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

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

Here is the call graph for this function:

◆ OnStateError()

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

Handle an error while sending a stateful message.

Definition at line 2605 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ OnStateRedirection()

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

Handle stateful redirect.

Definition at line 2693 of file XrdClFileStateHandler.cc.

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

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

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

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

Here is the call graph for this function:

◆ Open()

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

Open the file pointed to by the given URL

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

Definition at line 779 of file XrdClFileStateHandler.cc.

785 {
786 self->pTemplateFileWp.reset();
787 return OpenImpl( self, url, flags, mode, handler, timeout );
788 }

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

Here is the caller graph for this function:

◆ OpenUsingTemplate()

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

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

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

Definition at line 755 of file XrdClFileStateHandler.cc.

763 {
764 if( !templ )
765 return XRootDStatus( stError, errInvalidArgs, 0, "Template file not available" );
766
767 FileStateHandlerTemplate *fht = dynamic_cast<FileStateHandlerTemplate*>( templ );
768 if( !fht )
769 return XRootDStatus( stError, errInvalidArgs, 0, "Template file invalid" );
770
771 self->pTemplateFileWp = fht->pTemplateFileWp;
772
773 return OpenImpl( self, url, flags, mode, handler, timeout );
774 }
const uint16_t errInvalidArgs

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

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

Here is the caller graph for this function:

◆ PgRead()

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

Read data pages at a given offset

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

Definition at line 1177 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ PgReadImpl()

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

Read data pages at a given offset (actual implementation)

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

Definition at line 1233 of file XrdClFileStateHandler.cc.

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

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

Referenced by PgRead(), and PgReadRetry().

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

◆ PgReadRetry()

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

Retry reading one page of data at a given offset

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

Definition at line 1215 of file XrdClFileStateHandler.cc.

1222 {
1223 if( size > (uint32_t)XrdSys::PageSize )
1224 return XRootDStatus( stError, errInvalidArgs, EINVAL,
1225 "PgRead retry size exceeded 4KB." );
1226
1227 ResponseHandler *retryHandler = new PgReadRetryHandler( handler, pgnb );
1228 XRootDStatus st = PgReadImpl( self, offset, size, buffer, PgReadFlags::Retry, retryHandler, timeout );
1229 if( !st.IsOK() ) delete retryHandler;
1230 return st;
1231 }
static const int PageSize

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

Here is the call graph for this function:

◆ PgWrite()

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

Write number of pages at a given offset - async

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

Definition at line 1414 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ PgWriteImpl()

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

Write number of pages at a given offset - async

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

Definition at line 1585 of file XrdClFileStateHandler.cc.

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

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

Referenced by PgWrite(), and PgWriteRetry().

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

◆ PgWriteRetry()

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

Write number of pages at a given offset - async

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

Definition at line 1570 of file XrdClFileStateHandler.cc.

1577 {
1578 std::vector<uint32_t> cksums{ digest };
1579 return PgWriteImpl( self, offset, size, buffer, cksums, PgReadFlags::Retry, handler, timeout );
1580 }

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

Referenced by PgWrite().

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

◆ PreRead()

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

Preread data tracts at given offsets - async

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

Definition at line 1064 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ Read()

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

Read a data chunk at a given offset - sync

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

Definition at line 1131 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ ReadV()

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

Read data into scattered buffers in one operation - async

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

Definition at line 1928 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ SetProperty()

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

Set file property

See also
File::GetProperty for propert list

Definition at line 2367 of file XrdClFileStateHandler.cc.

2369 {
2370 XrdSysMutexHelper scopedLock( pMutex );
2371 if( name == "ReadRecovery" )
2372 {
2373 if( value == "true" ) pDoRecoverRead = true;
2374 else pDoRecoverRead = false;
2375 return true;
2376 }
2377 else if( name == "WriteRecovery" )
2378 {
2379 if( value == "true" ) pDoRecoverWrite = true;
2380 else pDoRecoverWrite = false;
2381 return true;
2382 }
2383 else if( name == "FollowRedirects" )
2384 {
2385 if( value == "true" ) pFollowRedirects = true;
2386 else pFollowRedirects = false;
2387 return true;
2388 }
2389 else if( name == "BundledClose" )
2390 {
2391 if( value == "true" ) pAllowBundledClose = true;
2392 else pAllowBundledClose = false;
2393 return true;
2394 }
2395 return false;
2396 }

◆ SetXAttr()

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

Set extended attributes - async

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

Definition at line 2070 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Stat()

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

Obtain status information for this file - async

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

Definition at line 1007 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Sync()

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

Commit all pending disk writes - async

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

Definition at line 1640 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Tick()

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

Tick.

Definition at line 2835 of file XrdClFileStateHandler.cc.

2836 {
2837 if (pMutex.CondLock())
2838 {TimeOutRequests( now );
2839 pMutex.UnLock();
2840 }
2841 }
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 2846 of file XrdClFileStateHandler.cc.

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

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

Referenced by Tick().

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

◆ Truncate()

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

Truncate the file to a particular size - async

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

Definition at line 1678 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ TryOtherServer()

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

Try other data server.

Definition at line 2897 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ UnLock()

void XrdCl::FileStateHandler::UnLock ( )
inline

Unlock the internal lock.

Definition at line 758 of file XrdClFileStateHandler.hh.

759 {
760 pMutex.UnLock();
761 }

◆ VectorRead()

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

Read scattered data chunks in one operation - async

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

Definition at line 1718 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ VectorWrite()

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

Write scattered data chunks in one operation - async

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

Definition at line 1795 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Visa()

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

Get access token to a file - async

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

Definition at line 2031 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Write() [1/3]

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

Write a data chunk at a given offset - async

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

Definition at line 1338 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ Write() [2/3]

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

Write a data chunk at a given offset - async

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

Definition at line 1290 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Write() [3/3]

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

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

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

Definition at line 1388 of file XrdClFileStateHandler.cc.

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

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

Here is the call graph for this function:

◆ WriteV()

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

Write scattered buffers in one operation - async

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

Definition at line 1872 of file XrdClFileStateHandler.cc.

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

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:

◆ ::OpenHandler

friend class ::OpenHandler
friend

Definition at line 100 of file XrdClFileStateHandler.hh.

◆ ::PgReadHandler

friend class ::PgReadHandler
friend

Definition at line 97 of file XrdClFileStateHandler.hh.

Referenced by PgRead(), and PgReadRetry().

◆ ::PgReadRetryHandler

friend class ::PgReadRetryHandler
friend

Definition at line 98 of file XrdClFileStateHandler.hh.

Referenced by PgReadRetry().

◆ ::PgReadSubstitutionHandler

friend class ::PgReadSubstitutionHandler
friend

Definition at line 99 of file XrdClFileStateHandler.hh.

Referenced by PgRead().


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