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

Friends

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

Detailed Description

Handle the stateful operations.

Definition at line 95 of file XrdClFileStateHandler.hh.

Member Enumeration Documentation

◆ FileStatus

State of the file.

Enumerator
Closed 

The file is closed.

Opened 

Opening has succeeded.

Error 

Opening has failed.

Recovering 

Recovering from an error.

OpenInProgress 

Opening is in progress.

CloseInProgress 

Closing operation is in progress.

Definition at line 106 of file XrdClFileStateHandler.hh.

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

Constructor & Destructor Documentation

◆ FileStateHandler() [1/2]

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

Constructor.

Definition at line 649 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ FileStateHandler() [2/2]

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

Constructor

Parameters
useVirtRedirectorif true Metalink files will be treated as a VirtualRedirectors

Definition at line 682 of file XrdClFileStateHandler.cc.

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

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

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

Create a checkpoint

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

Definition at line 2183 of file XrdClFileStateHandler.cc.

2187  {
2188  XrdSysMutexHelper scopedLock( self->pMutex );
2189 
2190  if( self->pFileState == Error ) return self->pStatus;
2191 
2192  if( self->pFileState != Opened && self->pFileState != Recovering )
2193  return XRootDStatus( stError, errInvalidOp );
2194 
2195  Log *log = DefaultEnv::GetLog();
2196  log->Debug( FileMsg, "[%p@%s] Sending a checkpoint command for handle %#x to %s",
2197  (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str(),
2198  *((uint32_t*)self->pFileHandle), self->pDataServer->GetHostId().c_str() );
2199 
2200  Message *msg;
2201  ClientChkPointRequest *req;
2202  MessageUtils::CreateRequest( msg, req );
2203 
2204  req->requestid = kXR_chkpoint;
2205  req->opcode = code;
2206  memcpy( req->fhandle, self->pFileHandle, 4 );
2207 
2208  MessageSendParams params;
2209  params.timeout = timeout;
2210  params.followRedirects = false;
2211  params.stateful = true;
2212 
2214 
2216  StatefulHandler *stHandler = new StatefulHandler( self, handler, msg, params );
2217 
2218  return SendOrQueue( self, *self->pDataServer, msg, stHandler, params );
2219  }
@ kXR_chkpoint
Definition: XProtocol.hh:125
kXR_char fhandle[4]
Definition: XProtocol.hh:206
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,
time_t  timeout = 0 
)
static

Checkpointed write - async

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

Definition at line 2232 of file XrdClFileStateHandler.cc.

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

Checkpointed WriteV - async

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

Write scattered buffers in one operation - async

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

Definition at line 2294 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ Clone()

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

Clone ranges of files into the current file

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

Definition at line 3489 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ Close()

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

Close the file object

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

Definition at line 929 of file XrdClFileStateHandler.cc.

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

Delete extended attributes - async

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

Definition at line 2122 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ ExportTemplate()

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

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

Definition at line 788 of file XrdClFileStateHandler.hh.

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

◆ Fcntl()

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

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

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

Definition at line 1988 of file XrdClFileStateHandler.cc.

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

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

Get extended attributes - async

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

Definition at line 2096 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ IsOpen()

bool XrdCl::FileStateHandler::IsOpen ( ) const

Check if the file is open.

Definition at line 2355 of file XrdClFileStateHandler.cc.

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

References Opened, and Recovering.

◆ IsSecure()

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

Check if the file is using an encrypted connection.

Definition at line 728 of file XrdClFileStateHandler.hh.

729  {
730  return pIsChannelEncrypted;
731  }

◆ ListXAttr()

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

List extended attributes - async

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

Definition at line 2148 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Lock()

void XrdCl::FileStateHandler::Lock ( )
inline

Lock the internal lock.

Definition at line 750 of file XrdClFileStateHandler.hh.

751  {
752  pMutex.Lock();
753  }

References XrdSysMutex::Lock().

+ Here is the call graph for this function:

◆ NeedFileTempl()

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

Checks if we need to set a file template.

Definition at line 797 of file XrdClFileStateHandler.hh.

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

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

◆ OnClose()

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

Process the results of the closing operation.

Definition at line 2583 of file XrdClFileStateHandler.cc.

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

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

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

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

References XrdCl::MessageUtils::MergeCGI().

Referenced by OnStateError().

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

◆ OnStateResponse()

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

Handle stateful response.

Definition at line 2723 of file XrdClFileStateHandler.cc.

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

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,
OpenFlags::Flags  flags,
uint16_t  mode,
ResponseHandler handler,
time_t  timeout = 0 
)
static

Open the file pointed to by the given URL

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

Definition at line 779 of file XrdClFileStateHandler.cc.

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

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

+ Here is the caller graph for this function:

◆ OpenUsingTemplate()

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

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

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

Definition at line 755 of file XrdClFileStateHandler.cc.

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

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

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

+ Here is the caller graph for this function:

◆ PgRead()

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

Read data pages at a given offset

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

Definition at line 1177 of file XrdClFileStateHandler.cc.

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

Read data pages at a given offset (actual implementation)

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

Definition at line 1233 of file XrdClFileStateHandler.cc.

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

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

Referenced by PgRead(), and PgReadRetry().

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

◆ PgReadRetry()

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

Retry reading one page of data at a given offset

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

Definition at line 1215 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ PgWrite()

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

Write number of pages at a given offset - async

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

Definition at line 1414 of file XrdClFileStateHandler.cc.

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

Write number of pages at a given offset - async

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

Definition at line 1585 of file XrdClFileStateHandler.cc.

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

Write number of pages at a given offset - async

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

Definition at line 1570 of file XrdClFileStateHandler.cc.

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

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

Referenced by PgWrite().

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

◆ PreRead()

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

Preread data tracts at given offsets - async

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

Definition at line 1064 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ Read()

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

Read a data chunk at a given offset - sync

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

Definition at line 1131 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ ReadV()

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

Read data into scattered buffers in one operation - async

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

Definition at line 1928 of file XrdClFileStateHandler.cc.

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

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

◆ SetXAttr()

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

Set extended attributes - async

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

Definition at line 2070 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Stat()

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

Obtain status information for this file - async

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

Definition at line 1007 of file XrdClFileStateHandler.cc.

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

Commit all pending disk writes - async

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

Definition at line 1640 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Tick()

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

Tick.

Definition at line 2835 of file XrdClFileStateHandler.cc.

2836  {
2837  if (pMutex.CondLock())
2838  {TimeOutRequests( now );
2839  pMutex.UnLock();
2840  }
2841  }
void TimeOutRequests(time_t now)
Declare timeout on requests being recovered.

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

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

Truncate the file to a particular size - async

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

Definition at line 1678 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ TryOtherServer()

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

Try other data server.

Definition at line 2897 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ UnLock()

void XrdCl::FileStateHandler::UnLock ( )
inline

Unlock the internal lock.

Definition at line 758 of file XrdClFileStateHandler.hh.

759  {
760  pMutex.UnLock();
761  }

References XrdSysMutex::UnLock().

+ Here is the call graph for this function:

◆ VectorRead()

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

Read scattered data chunks in one operation - async

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

Definition at line 1718 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ VectorWrite()

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

Write scattered data chunks in one operation - async

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

Definition at line 1795 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Visa()

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

Get access token to a file - async

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

Definition at line 2031 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Write() [1/3]

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

Write a data chunk at a given offset - async

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

Definition at line 1338 of file XrdClFileStateHandler.cc.

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

Write a data chunk at a given offset - async

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

Definition at line 1290 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Write() [3/3]

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

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

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

Definition at line 1388 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ WriteV()

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

Write scattered buffers in one operation - async

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

Definition at line 1872 of file XrdClFileStateHandler.cc.

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

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

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

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

Friends And Related Function Documentation

◆ ::OpenHandler

friend class ::OpenHandler
friend

Definition at line 100 of file XrdClFileStateHandler.hh.

◆ ::PgReadHandler

friend class ::PgReadHandler
friend

Definition at line 97 of file XrdClFileStateHandler.hh.

◆ ::PgReadRetryHandler

friend class ::PgReadRetryHandler
friend

Definition at line 98 of file XrdClFileStateHandler.hh.

◆ ::PgReadSubstitutionHandler

friend class ::PgReadSubstitutionHandler
friend

Definition at line 99 of file XrdClFileStateHandler.hh.


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