XRootD
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. More...
 
 ~FileStateHandler ()
 Destructor. More...
 
void AfterForkChild ()
 Called in the child process after the fork. More...
 
bool GetProperty (const std::string &name, std::string &value) const
 
bool IsOpen () const
 Check if the file is open. More...
 
bool IsSecure () const
 Check if the file is using an encrypted connection. More...
 
void Lock ()
 Lock the internal lock. More...
 
void OnClose (const XRootDStatus *status)
 Process the results of the closing operation. More...
 
void OnOpen (const XRootDStatus *status, const OpenInfo *openInfo, const HostList *hostList)
 Process the results of the opening operation. More...
 
bool SetProperty (const std::string &name, const std::string &value)
 
void Tick (time_t now)
 Tick. More...
 
void TimeOutRequests (time_t now)
 Declare timeout on requests being recovered. More...
 
void UnLock ()
 Unlock the internal lock. More...
 

Static Public Member Functions

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

Friends

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

Detailed Description

Handle the stateful operations.

Definition at line 79 of file XrdClFileStateHandler.hh.

Member Enumeration Documentation

◆ FileStatus

State of the file.

Enumerator
Closed 

The file is closed.

Opened 

Opening has succeeded.

Error 

Opening has failed.

Recovering 

Recovering from an error.

OpenInProgress 

Opening is in progress.

CloseInProgress 

Closing operation is in progress.

Definition at line 90 of file XrdClFileStateHandler.hh.

91  {
92  Closed,
93  Opened,
94  Error,
95  Recovering,
98  };
@ OpenInProgress
Opening is in progress.
@ CloseInProgress
Closing operation is in progress.
@ Closed
The file is closed.
@ Opened
Opening has succeeded.
@ Error
Opening has failed.
@ Recovering
Recovering from an error.

Constructor & Destructor Documentation

◆ FileStateHandler() [1/2]

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

Constructor.

Definition at line 649 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ FileStateHandler() [2/2]

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

Constructor

Parameters
useVirtRedirectorif true Metalink files will be treated as a VirtualRedirectors

Definition at line 682 of file XrdClFileStateHandler.cc.

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

References 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  {
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.
Singleton access to URL to virtual redirector mapping.
static RedirectorRegistry & Instance()
Returns reference to the single instance.
void Release(const URL &url)
Release the virtual redirector associated with the given URL.
bool IsMetalink() const
Is it a URL to a metalink.
Definition: XrdClURL.cc:465
bool IsLocalFile() const
Definition: XrdClURL.cc:474

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

+ Here is the call graph for this function:

Member Function Documentation

◆ AfterForkChild()

void XrdCl::FileStateHandler::AfterForkChild ( )

Called in the child process after the fork.

Definition at line 2752 of file XrdClFileStateHandler.cc.

2753  {
2754  Log *log = DefaultEnv::GetLog();
2755 
2756  if( pFileState == Closed || pFileState == Error )
2757  return;
2758 
2759  if( (IsReadOnly() && pDoRecoverRead) ||
2760  (!IsReadOnly() && pDoRecoverWrite) )
2761  {
2762  log->Debug( FileMsg, "[%p@%s] Putting the file in recovery state in "
2763  "process %d", (void*)this, pFileUrl->GetObfuscatedURL().c_str(), getpid() );
2764  pFileState = Recovering;
2765  pInTheFly.clear();
2766  pToBeRecovered.clear();
2767  }
2768  else
2769  pFileState = Error;
2770  }
Handle diagnostics.
Definition: XrdClLog.hh:101
void Debug(uint64_t topic, const char *format,...)
Print a debug message.
Definition: XrdClLog.cc:282
std::string GetObfuscatedURL() const
Get the URL with authz information obfuscated.
Definition: XrdClURL.cc:498
const uint64_t FileMsg

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

+ Here is the call graph for this function:

◆ Checkpoint()

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

Create a checkpoint

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

Definition at line 2067 of file XrdClFileStateHandler.cc.

2071  {
2072  XrdSysMutexHelper scopedLock( self->pMutex );
2073 
2074  if( self->pFileState == Error ) return self->pStatus;
2075 
2076  if( self->pFileState != Opened && self->pFileState != Recovering )
2077  return XRootDStatus( stError, errInvalidOp );
2078 
2079  Log *log = DefaultEnv::GetLog();
2080  log->Debug( FileMsg, "[%p@%s] Sending a checkpoint command for handle %#x to %s",
2081  (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2082  *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2083 
2084  Message *msg;
2085  ClientChkPointRequest *req;
2086  MessageUtils::CreateRequest( msg, req );
2087 
2088  req->requestid = kXR_chkpoint;
2089  req->opcode = code;
2090  memcpy( req->fhandle, self->pFileHandle, 4 );
2091 
2092  MessageSendParams params;
2093  params.timeout = timeout;
2094  params.followRedirects = false;
2095  params.stateful = true;
2096 
2098 
2100  StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2101 
2102  return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2103  }
@ kXR_chkpoint
Definition: XProtocol.hh:124
kXR_char fhandle[4]
Definition: XProtocol.hh:204
static void ProcessSendParams(MessageSendParams &sendParams)
Process sending params.
static void CreateRequest(Message *&msg, Request *&req, uint32_t payloadSize=0)
Create a message.
The message representation used throughout the system.
Definition: XrdClMessage.hh:32
static void SetDescription(Message *msg)
Get the description of a message.
const uint16_t stError
An error occurred that could potentially be retried.
Definition: XrdClStatus.hh:32
const uint16_t errInvalidOp
Definition: XrdClStatus.hh:51

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

+ Here is the call graph for this function:

◆ ChkptWrt()

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

Checkpointed write - async

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

Definition at line 2116 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ ChkptWrtV()

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

Checkpointed WriteV - async

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

Write scattered buffers in one operation - async

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

Definition at line 2178 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ Close()

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

Close the file object

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

Definition at line 882 of file XrdClFileStateHandler.cc.

885  {
886  XrdSysMutexHelper scopedLock( self->pMutex );
887 
888  //--------------------------------------------------------------------------
889  // Check if we can proceed
890  //--------------------------------------------------------------------------
891  if( self->pFileState == Error )
892  return self->pStatus;
893 
894  if( self->pFileState == CloseInProgress )
896 
897  if( self->pFileState == Closed )
898  return XRootDStatus( stOK, suAlreadyDone );
899 
900  if( self->pFileState == OpenInProgress || self->pFileState == Recovering )
901  return XRootDStatus( stError, errInvalidOp );
902 
903  if( !self->pAllowBundledClose && !self->pInTheFly.empty() )
904  return XRootDStatus( stError, errInvalidOp );
905 
906  self->pFileState = CloseInProgress;
907 
908  Log *log = DefaultEnv::GetLog();
909  log->Debug( FileMsg, "[%p@%s] Sending a close command for handle %#x to %s",
910  (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
911  *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
912 
913  //--------------------------------------------------------------------------
914  // Close the file
915  //--------------------------------------------------------------------------
916  Message *msg;
917  ClientCloseRequest *req;
918  MessageUtils::CreateRequest( msg, req );
919 
920  req->requestid = kXR_close;
921  memcpy( req->fhandle, self->pFileHandle, 4 );
922 
924  msg->SetSessionId( self->pSessionId );
925  CloseHandler *closeHandler = new CloseHandler( self, handler, msg );
926  MessageSendParams params;
927  params.timeout = timeout;
928  params.followRedirects = false;
929  params.stateful = true;
931 
932  XRootDStatus st = self->IssueRequest( *self->pDataServer, msg, closeHandler, params );
933 
934  if( !st.IsOK() )
935  {
936  // an invalid-session error means the connection to the server has been
937  // closed, which in turn means that the server closed the file already
938  if( st.code == errInvalidSession || st.code == errSocketDisconnected ||
940  st.code == errPollerError || st.code == errSocketError )
941  {
942  self->pFileState = Closed;
943  ResponseJob *job = new ResponseJob( closeHandler, new XRootDStatus(),
944  nullptr, nullptr );
946  return XRootDStatus();
947  }
948 
949  delete closeHandler;
950  self->pStatus = st;
951  self->pFileState = Error;
952  return st;
953  }
954  return st;
955  }
kXR_unt16 requestid
Definition: XProtocol.hh:228
kXR_char fhandle[4]
Definition: XProtocol.hh:229
@ kXR_close
Definition: XProtocol.hh:115
void QueueJob(Job *job, void *arg=0)
Add a job to be run.
void SetSessionId(uint64_t sessionId)
Set the session ID which this message is meant for.
JobManager * GetJobManager()
Get the job manager object user by the post master.
Call the user callback.
const uint16_t errSocketOptError
Definition: XrdClStatus.hh:76
const uint16_t errPollerError
Definition: XrdClStatus.hh:75
const uint16_t errInProgress
Definition: XrdClStatus.hh:59
const uint16_t stOK
Everything went OK.
Definition: XrdClStatus.hh:31
const uint16_t suAlreadyDone
Definition: XrdClStatus.hh:42
const uint16_t errConnectionError
Definition: XrdClStatus.hh:78
const uint16_t errSocketError
Definition: XrdClStatus.hh:72
const uint16_t errInvalidSession
Definition: XrdClStatus.hh:79
const uint16_t errSocketDisconnected
Definition: XrdClStatus.hh:74
uint16_t code
Error type, or additional hints on what to do.
Definition: XrdClStatus.hh:147
bool IsOK() const
We're fine.
Definition: XrdClStatus.hh:124

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

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

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

◆ DelXAttr()

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

Delete extended attributes - async

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

Definition at line 2006 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Fcntl()

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

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

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

Definition at line 1873 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ GetProperty()

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

Get file property

See also
File::SetProperty for property list

Definition at line 2285 of file XrdClFileStateHandler.cc.

2287  {
2288  XrdSysMutexHelper scopedLock( pMutex );
2289  if( name == "ReadRecovery" )
2290  {
2291  if( pDoRecoverRead ) value = "true";
2292  else value = "false";
2293  return true;
2294  }
2295  else if( name == "WriteRecovery" )
2296  {
2297  if( pDoRecoverWrite ) value = "true";
2298  else value = "false";
2299  return true;
2300  }
2301  else if( name == "FollowRedirects" )
2302  {
2303  if( pFollowRedirects ) value = "true";
2304  else value = "false";
2305  return true;
2306  }
2307  else if( name == "DataServer" && pDataServer )
2308  { value = pDataServer->GetHostId(); return true; }
2309  else if( name == "LastURL" && pDataServer )
2310  { value = pDataServer->GetURL(); return true; }
2311  else if( name == "WrtRecoveryRedir" && pWrtRecoveryRedir )
2312  { value = pWrtRecoveryRedir->GetHostId(); return true; }
2313  value = "";
2314  return false;
2315  }
std::string GetHostId() const
Get the host part of the URL (user:password@host:port)
Definition: XrdClURL.hh:99
std::string GetURL() const
Get the URL.
Definition: XrdClURL.hh:86

References XrdCl::URL::GetHostId(), and XrdCl::URL::GetURL().

+ Here is the call graph for this function:

◆ GetXAttr()

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

Get extended attributes - async

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

Definition at line 1980 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ IsOpen()

bool XrdCl::FileStateHandler::IsOpen ( ) const

Check if the file is open.

Definition at line 2239 of file XrdClFileStateHandler.cc.

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

References Opened, and Recovering.

◆ IsSecure()

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

Check if the file is using an encrypted connection.

Definition at line 658 of file XrdClFileStateHandler.hh.

659  {
660  return pIsChannelEncrypted;
661  }

◆ ListXAttr()

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

List extended attributes - async

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

Definition at line 2032 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Lock()

void XrdCl::FileStateHandler::Lock ( )
inline

Lock the internal lock.

Definition at line 680 of file XrdClFileStateHandler.hh.

681  {
682  pMutex.Lock();
683  }

◆ OnClose()

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

Process the results of the closing operation.

Definition at line 2461 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ OnOpen()

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

Process the results of the opening operation.

Definition at line 2320 of file XrdClFileStateHandler.cc.

2323  {
2324  Log *log = DefaultEnv::GetLog();
2325  XrdSysMutexHelper scopedLock( pMutex );
2326 
2327  //--------------------------------------------------------------------------
2328  // Assign the data server and the load balancer
2329  //--------------------------------------------------------------------------
2330  std::string lastServer = pFileUrl->GetHostId();
2331  if( hostList )
2332  {
2333  delete pDataServer;
2334  delete pLoadBalancer;
2335  pLoadBalancer = 0;
2336  delete pWrtRecoveryRedir;
2337  pWrtRecoveryRedir = 0;
2338 
2339  pDataServer = new URL( hostList->back().url );
2340  pDataServer->SetParams( pFileUrl->GetParams() );
2341  if( !( pUseVirtRedirector && pFileUrl->IsMetalink() ) ) pDataServer->SetPath( pFileUrl->GetPath() );
2342  lastServer = pDataServer->GetHostId();
2343  HostList::const_iterator itC;
2344  URL::ParamsMap params = pDataServer->GetParams();
2345  for( itC = hostList->begin(); itC != hostList->end(); ++itC )
2346  {
2347  MessageUtils::MergeCGI( params,
2348  itC->url.GetParams(),
2349  true );
2350  }
2351  pDataServer->SetParams( params );
2352 
2353  HostList::const_reverse_iterator it;
2354  for( it = hostList->rbegin(); it != hostList->rend(); ++it )
2355  if( it->loadBalancer )
2356  {
2357  pLoadBalancer = new URL( it->url );
2358  break;
2359  }
2360 
2361  for( it = hostList->rbegin(); it != hostList->rend(); ++it )
2362  if( it->flags & kXR_recoverWrts )
2363  {
2364  pWrtRecoveryRedir = new URL( it->url );
2365  break;
2366  }
2367  }
2368 
2369  log->Debug(FileMsg, "[%p@%s] Open has returned with status %s",
2370  (void*)this, pFileUrl->GetObfuscatedURL().c_str(), status->ToStr().c_str() );
2371 
2372  if( pDataServer && !pDataServer->IsLocalFile() )
2373  {
2374  //------------------------------------------------------------------------
2375  // Check if we are using a secure connection
2376  //------------------------------------------------------------------------
2377  XrdCl::AnyObject isencobj;
2379  QueryTransport( *pDataServer, XRootDQuery::IsEncrypted, isencobj );
2380  if( st.IsOK() )
2381  {
2382  bool *isenc;
2383  isencobj.Get( isenc );
2384  pIsChannelEncrypted = isenc ? *isenc : false;
2385  delete isenc;
2386  }
2387  }
2388 
2389  //--------------------------------------------------------------------------
2390  // We have failed
2391  //--------------------------------------------------------------------------
2392  pStatus = *status;
2393  if( !pStatus.IsOK() || !openInfo )
2394  {
2395  log->Debug(FileMsg, "[%p@%s] Error while opening at %s: %s",
2396  (void*)this, pFileUrl->GetObfuscatedURL().c_str(), lastServer.c_str(),
2397  pStatus.ToStr().c_str() );
2398  FailQueuedMessages( pStatus );
2399  pFileState = Error;
2400 
2401  //------------------------------------------------------------------------
2402  // Report to monitoring
2403  //------------------------------------------------------------------------
2405  if( mon )
2406  {
2408  i.file = pFileUrl;
2409  i.status = status;
2411  mon->Event( Monitor::EvErrIO, &i );
2412  }
2413  }
2414  //--------------------------------------------------------------------------
2415  // We have succeeded
2416  //--------------------------------------------------------------------------
2417  else
2418  {
2419  //------------------------------------------------------------------------
2420  // Store the response info
2421  //------------------------------------------------------------------------
2422  openInfo->GetFileHandle( pFileHandle );
2423  pSessionId = openInfo->GetSessionId();
2424  if( openInfo->GetStatInfo() )
2425  {
2426  delete pStatInfo;
2427  pStatInfo = new StatInfo( *openInfo->GetStatInfo() );
2428  }
2429 
2430  log->Debug( FileMsg, "[%p@%s] successfully opened at %s, handle: %#x, "
2431  "session id: %llu", (void*)this, pFileUrl->GetObfuscatedURL().c_str(),
2432  pDataServer->GetHostId().c_str(), *((uint32_t*)pFileHandle),
2433  (unsigned long long) pSessionId );
2434 
2435  //------------------------------------------------------------------------
2436  // Inform the monitoring about opening success
2437  //------------------------------------------------------------------------
2438  gettimeofday( &pOpenTime, 0 );
2440  if( mon )
2441  {
2443  i.file = pFileUrl;
2444  i.dataServer = pDataServer->GetHostId();
2445  i.oFlags = pOpenFlags;
2446  i.fSize = pStatInfo ? pStatInfo->GetSize() : 0;
2447  mon->Event( Monitor::EvOpen, &i );
2448  }
2449 
2450  //------------------------------------------------------------------------
2451  // Resend the queued messages if any
2452  //------------------------------------------------------------------------
2453  ReSendQueuedMessages();
2454  pFileState = Opened;
2455  }
2456  }
#define kXR_recoverWrts
Definition: XProtocol.hh:1166
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.
An abstract class to describe the client-side monitoring plugin interface.
Definition: XrdClMonitor.hh:56
@ EvErrIO
ErrorInfo: An I/O error occurred.
@ EvOpen
OpenInfo: File opened.
virtual void Event(EventCode evCode, void *evData)=0
void GetFileHandle(uint8_t *fileHandle) const
Get the file handle (4bytes)
const StatInfo * GetStatInfo() const
Get the stat info.
uint64_t GetSessionId() const
Object stat info.
uint64_t GetSize() const
Get size (in bytes)
URL representation.
Definition: XrdClURL.hh:31
std::map< std::string, std::string > ParamsMap
Definition: XrdClURL.hh:33
void SetParams(const std::string &params)
Set params.
Definition: XrdClURL.cc:402
void SetPath(const std::string &path)
Set the path.
Definition: XrdClURL.hh:225
const ParamsMap & GetParams() const
Get the URL params.
Definition: XrdClURL.hh:244
const std::string & GetPath() const
Get the path.
Definition: XrdClURL.hh:217
Describe an encountered file-based error.
const XRootDStatus * status
Status code.
const URL * file
The file in question.
Operation opCode
The associated operation.
Describe a file open event to the monitor.
uint64_t fSize
File size in bytes.
const URL * file
File in question.
std::string dataServer
Actual fata server.
uint16_t oFlags
OpenFlags.
static const uint16_t IsEncrypted
returns true if the channel is encrypted

References XrdCl::Monitor::OpenInfo::dataServer, XrdCl::Log::Debug(), XrdCl::Monitor::ErrorInfo::ErrOpen, Error, XrdCl::Monitor::Event(), XrdCl::Monitor::EvErrIO, XrdCl::Monitor::EvOpen, XrdCl::Monitor::OpenInfo::file, XrdCl::Monitor::ErrorInfo::file, XrdCl::FileMsg, XrdCl::Monitor::OpenInfo::fSize, XrdCl::AnyObject::Get(), XrdCl::OpenInfo::GetFileHandle(), XrdCl::URL::GetHostId(), XrdCl::DefaultEnv::GetLog(), XrdCl::DefaultEnv::GetMonitor(), XrdCl::URL::GetObfuscatedURL(), XrdCl::URL::GetParams(), XrdCl::URL::GetPath(), XrdCl::DefaultEnv::GetPostMaster(), XrdCl::OpenInfo::GetSessionId(), XrdCl::StatInfo::GetSize(), XrdCl::OpenInfo::GetStatInfo(), XrdCl::XRootDQuery::IsEncrypted, XrdCl::URL::IsLocalFile(), XrdCl::URL::IsMetalink(), XrdCl::Status::IsOK(), kXR_recoverWrts, XrdCl::MessageUtils::MergeCGI(), XrdCl::Monitor::OpenInfo::oFlags, XrdCl::Monitor::ErrorInfo::opCode, Opened, XrdCl::URL::SetParams(), XrdCl::URL::SetPath(), XrdCl::Monitor::ErrorInfo::status, and XrdCl::XRootDStatus::ToStr().

+ Here is the call graph for this function:

◆ OnStateError()

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

Handle an error while sending a stateful message.

Definition at line 2483 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ OnStateRedirection()

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

Handle stateful redirect.

Definition at line 2571 of file XrdClFileStateHandler.cc.

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

References XrdCl::MessageUtils::MergeCGI().

Referenced by OnStateError().

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

◆ OnStateResponse()

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

Handle stateful response.

Definition at line 2601 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ Open()

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

Open the file pointed to by the given URL

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

Definition at line 755 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ PgRead()

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

Read data pages at a given offset

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

Definition at line 1063 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ PgReadImpl()

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

Read data pages at a given offset (actual implementation)

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

Definition at line 1119 of file XrdClFileStateHandler.cc.

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

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

Referenced by PgRead(), and PgReadRetry().

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

◆ PgReadRetry()

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

Retry reading one page of data at a given offset

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

Definition at line 1101 of file XrdClFileStateHandler.cc.

1108  {
1109  if( size > (uint32_t)XrdSys::PageSize )
1110  return XRootDStatus( stError, errInvalidArgs, EINVAL,
1111  "PgRead retry size exceeded 4KB." );
1112 
1113  ResponseHandler *retryHandler = new PgReadRetryHandler( handler, pgnb );
1114  XRootDStatus st = PgReadImpl( self, offset, size, buffer, PgReadFlags::Retry, retryHandler, timeout );
1115  if( !st.IsOK() ) delete retryHandler;
1116  return st;
1117  }
static const int PageSize

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

+ Here is the call graph for this function:

◆ PgWrite()

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

Write number of pages at a given offset - async

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

Definition at line 1300 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ PgWriteImpl()

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

Write number of pages at a given offset - async

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

Definition at line 1471 of file XrdClFileStateHandler.cc.

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

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

Referenced by PgWrite(), and PgWriteRetry().

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

◆ PgWriteRetry()

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

Write number of pages at a given offset - async

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

Definition at line 1456 of file XrdClFileStateHandler.cc.

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

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

Referenced by PgWrite().

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

◆ Read()

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

Read a data chunk at a given offset - sync

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

Definition at line 1017 of file XrdClFileStateHandler.cc.

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

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

Referenced by 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,
uint16_t  timeout = 0 
)
static

Read data into scattered buffers in one operation - async

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

Definition at line 1814 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ SetProperty()

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

Set file property

See also
File::GetProperty for propert list

Definition at line 2251 of file XrdClFileStateHandler.cc.

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

◆ SetXAttr()

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

Set extended attributes - async

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

Definition at line 1954 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Stat()

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

Obtain status information for this file - async

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

Definition at line 960 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Sync()

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

Commit all pending disk writes - async

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

Definition at line 1526 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Tick()

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

Tick.

Definition at line 2713 of file XrdClFileStateHandler.cc.

2714  {
2715  if (pMutex.CondLock())
2716  {TimeOutRequests( now );
2717  pMutex.UnLock();
2718  }
2719  }
void TimeOutRequests(time_t now)
Declare timeout on requests being recovered.

References XrdSysMutex::CondLock(), TimeOutRequests(), and XrdSysMutex::UnLock().

+ Here is the call graph for this function:

◆ TimeOutRequests()

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

Declare timeout on requests being recovered.

Definition at line 2724 of file XrdClFileStateHandler.cc.

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

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

Referenced by Tick().

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

◆ Truncate()

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

Truncate the file to a particular size - async

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

Definition at line 1564 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ TryOtherServer()

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

Try other data server.

Definition at line 2775 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ UnLock()

void XrdCl::FileStateHandler::UnLock ( )
inline

Unlock the internal lock.

Definition at line 688 of file XrdClFileStateHandler.hh.

689  {
690  pMutex.UnLock();
691  }

◆ VectorRead()

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

Read scattered data chunks in one operation - async

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

Definition at line 1604 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ VectorWrite()

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

Write scattered data chunks in one operation - async

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

Definition at line 1681 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Visa()

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

Get access token to a file - async

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

Definition at line 1915 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Write() [1/3]

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

Write a data chunk at a given offset - async

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

Definition at line 1224 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ Write() [2/3]

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

Write a data chunk at a given offset - async

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

Definition at line 1176 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Write() [3/3]

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

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

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

Definition at line 1274 of file XrdClFileStateHandler.cc.

1281  {
1282  //--------------------------------------------------------------------------
1283  // Read the data from the file descriptor into a kernel buffer
1284  //--------------------------------------------------------------------------
1285  std::unique_ptr<XrdSys::KernelBuffer> kbuff( new XrdSys::KernelBuffer() );
1286  ssize_t ret = fdoff ? XrdSys::Read( fd, *kbuff, size, *fdoff ) :
1287  XrdSys::Read( fd, *kbuff, size );
1288  if( ret < 0 )
1289  return XRootDStatus( stError, errInternal, XProtocol::mapError( errno ) );
1290 
1291  //--------------------------------------------------------------------------
1292  // Now create a write request and enqueue it
1293  //--------------------------------------------------------------------------
1294  return WriteKernelBuffer( self, offset, ret, std::move( kbuff ), handler, timeout );
1295  }
ssize_t Read(int fd, KernelBuffer &buffer, uint32_t length, int64_t offset)

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

+ Here is the call graph for this function:

◆ WriteV()

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

Write scattered buffers in one operation - async

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

Definition at line 1758 of file XrdClFileStateHandler.cc.

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

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

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

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

Friends And Related Function Documentation

◆ ::OpenHandler

friend class ::OpenHandler
friend

Definition at line 84 of file XrdClFileStateHandler.hh.

◆ ::PgReadHandler

friend class ::PgReadHandler
friend

Definition at line 81 of file XrdClFileStateHandler.hh.

◆ ::PgReadRetryHandler

friend class ::PgReadRetryHandler
friend

Definition at line 82 of file XrdClFileStateHandler.hh.

◆ ::PgReadSubstitutionHandler

friend class ::PgReadSubstitutionHandler
friend

Definition at line 83 of file XrdClFileStateHandler.hh.


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