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

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

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

+ Here is the call graph for this function:

◆ FileStateHandler() [2/2]

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

Constructor

Parameters
useVirtRedirectorif true Metalink files will be treated as a VirtualRedirectors

Definition at line 690 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ ~FileStateHandler()

XrdCl::FileStateHandler::~FileStateHandler ( )

Destructor.

Definition at line 719 of file XrdClFileStateHandler.cc.

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

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

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

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

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

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

+ Here is the call graph for this function:

◆ Clone()

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

Clone ranges of files into the current file

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

Definition at line 3497 of file XrdClFileStateHandler.cc.

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

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

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

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

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

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

◆ ExportTemplate()

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

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

Definition at line 788 of file XrdClFileStateHandler.hh.

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

◆ Fcntl()

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

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

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

Definition at line 1996 of file XrdClFileStateHandler.cc.

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

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

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

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

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

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

◆ IsOpen()

bool XrdCl::FileStateHandler::IsOpen ( ) const

Check if the file is open.

Definition at line 2363 of file XrdClFileStateHandler.cc.

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

References Opened, and Recovering.

◆ IsSecure()

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

Check if the file is using an encrypted connection.

Definition at line 728 of file XrdClFileStateHandler.hh.

729  {
730  return pIsChannelEncrypted;
731  }

◆ ListXAttr()

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

List extended attributes - async

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

Definition at line 2156 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Lock()

void XrdCl::FileStateHandler::Lock ( )
inline

Lock the internal lock.

Definition at line 750 of file XrdClFileStateHandler.hh.

751  {
752  pMutex.Lock();
753  }

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

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

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

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

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

References XrdCl::MessageUtils::MergeCGI().

Referenced by OnStateError().

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

◆ OnStateResponse()

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

Handle stateful response.

Definition at line 2731 of file XrdClFileStateHandler.cc.

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

793  {
794  self->pTemplateFileWp.reset();
795  return OpenImpl( self, url, flags, mode, handler, timeout );
796  }
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 763 of file XrdClFileStateHandler.cc.

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

1191  {
1192  int issupported = true;
1193  AnyObject obj;
1195  int protver = 0;
1196  XRootDStatus st2 = Utils::GetProtocolVersion( *self->pDataServer, protver );
1197  if( st1.IsOK() && st2.IsOK() )
1198  {
1199  int *ptr = 0;
1200  obj.Get( ptr );
1201  issupported = ( ptr && (*ptr & kXR_suppgrw) ) && ( protver >= kXR_PROTPGRWVERSION );
1202  delete ptr;
1203  }
1204  else
1205  issupported = false;
1206 
1207  if( !issupported )
1208  {
1209  DefaultEnv::GetLog()->Debug( FileMsg, "[%p@%s] PgRead not supported; substituting with Read.",
1210  (void*)self.get(), self->pFileUrl->GetObfuscatedURL().c_str() );
1211  ResponseHandler *substitHandler = new PgReadSubstitutionHandler( self, handler );
1212  auto st = Read( self, offset, size, buffer, substitHandler, timeout );
1213  if( !st.IsOK() ) delete substitHandler;
1214  return st;
1215  }
1216 
1217  ResponseHandler* pgHandler = new PgReadHandler( self, handler, offset );
1218  auto st = PgReadImpl( self, offset, size, buffer, PgReadFlags::None, pgHandler, timeout );
1219  if( !st.IsOK() ) delete pgHandler;
1220  return st;
1221  }
#define kXR_suppgrw
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 1241 of file XrdClFileStateHandler.cc.

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

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

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

+ Here is the call graph for this function:

◆ PgWrite()

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

Write number of pages at a given offset - async

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

Definition at line 1422 of file XrdClFileStateHandler.cc.

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

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

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

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

Referenced by PgWrite().

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

◆ PreRead()

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

Preread data tracts at given offsets - async

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

Definition at line 1072 of file XrdClFileStateHandler.cc.

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

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

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

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

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

◆ ReadV()

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

Read data into scattered buffers in one operation - async

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

Definition at line 1936 of file XrdClFileStateHandler.cc.

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

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

◆ SetXAttr()

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

Set extended attributes - async

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

Definition at line 2078 of file XrdClFileStateHandler.cc.

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

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

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

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

◆ Stat()

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

Obtain status information for this file - async

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

Definition at line 1015 of file XrdClFileStateHandler.cc.

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

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

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

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

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

◆ Tick()

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

Tick.

Definition at line 2843 of file XrdClFileStateHandler.cc.

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

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

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

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

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

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

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

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

◆ UnLock()

void XrdCl::FileStateHandler::UnLock ( )
inline

Unlock the internal lock.

Definition at line 758 of file XrdClFileStateHandler.hh.

759  {
760  pMutex.UnLock();
761  }

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

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

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

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

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

◆ VectorWrite()

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

Write scattered data chunks in one operation - async

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

Definition at line 1803 of file XrdClFileStateHandler.cc.

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

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

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

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

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

◆ Write() [1/3]

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

Write a data chunk at a given offset - async

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

Definition at line 1346 of file XrdClFileStateHandler.cc.

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

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

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

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

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

◆ Write() [3/3]

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

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

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

Definition at line 1396 of file XrdClFileStateHandler.cc.

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

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

+ Here is the call graph for this function:

◆ WriteV()

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

Write scattered buffers in one operation - async

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

Definition at line 1880 of file XrdClFileStateHandler.cc.

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

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

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

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

Friends And Related 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: