xrootd
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
XrdTpcTPC.hh
Go to the documentation of this file.
1 
2 #include <memory>
3 #include <string>
4 #include <vector>
5 
7 
10 
11 #include "XrdTls/XrdTlsTempCA.hh"
12 
13 class XrdOucErrInfo;
14 class XrdOucStream;
15 class XrdSfsFile;
16 class XrdSfsFileSystem;
17 typedef void CURL;
18 
19 namespace TPC {
20 class State;
21 
22 enum LogMask {
23  Debug = 0x01,
24  Info = 0x02,
25  Warning = 0x04,
26  Error = 0x08,
27  All = 0xff
28 };
29 
30 
31 struct CurlDeleter {
32  void operator()(CURL *curl);
33 };
34 using ManagedCurlHandle = std::unique_ptr<CURL, CurlDeleter>;
35 
36 
37 class TPCHandler : public XrdHttpExtHandler {
38 public:
39  TPCHandler(XrdSysError *log, const char *config, XrdOucEnv *myEnv);
40  virtual ~TPCHandler();
41 
42  virtual bool MatchesPath(const char *verb, const char *path);
43  virtual int ProcessReq(XrdHttpExtReq &req);
44  // Abstract method in the base class, but does not seem to be used
45  virtual int Init(const char *cfgfile) {return 0;}
46 
47 private:
48 
49  struct TPCLogRecord {
50 
51  TPCLogRecord() : status( -1 ),
52  tpc_status(-1),
53  streams( 1 ),
54  bytes_transferred( -1 )
55  {
56  }
57 
58  std::string log_prefix;
59  std::string local;
60  std::string remote;
61  std::string name;
62  int status;
64  unsigned streams;
66  };
67 
69 
70  static std::string GetAuthz(XrdHttpExtReq &req);
71 
72  // Configure curl handle's CA settings. The CA files present here should
73  // be valid for the lifetime of the process.
74  void ConfigureCurlCA(CURL *curl);
75 
76  // Redirect the transfer according to the contents of an XrdOucErrInfo object.
77  int RedirectTransfer(CURL *curl, const std::string &redirect_resource, XrdHttpExtReq &req,
78  XrdOucErrInfo &error, TPCLogRecord &);
79 
80  int OpenWaitStall(XrdSfsFile &fh, const std::string &resource, int mode,
81  int openMode, const XrdSecEntity &sec,
82  const std::string &authz);
83 
84 #ifdef XRD_CHUNK_RESP
85  int DetermineXferSize(CURL *curl, XrdHttpExtReq &req, TPC::State &state,
86  bool &success, TPCLogRecord &);
87 
88  // Send a 'performance marker' back to the TPC client, informing it of our
89  // progress. The TPC client will use this information to determine whether
90  // the transfer is making sufficient progress and/or other monitoring info
91  // (such as whether the transfer is happening over IPv4, IPv6, or both).
92  int SendPerfMarker(XrdHttpExtReq &req, TPCLogRecord &rec, TPC::State &state);
93  int SendPerfMarker(XrdHttpExtReq &req, TPCLogRecord &rec, std::vector<State*> &state,
94  off_t bytes_transferred);
95 
96  // Perform the libcurl transfer, periodically sending back chunked updates.
97  int RunCurlWithUpdates(CURL *curl, XrdHttpExtReq &req, TPC::State &state,
98  TPCLogRecord &rec);
99 
100  // Experimental multi-stream version of RunCurlWithUpdates
101  int RunCurlWithStreams(XrdHttpExtReq &req, TPC::State &state,
102  size_t streams, TPCLogRecord &rec);
103  int RunCurlWithStreamsImpl(XrdHttpExtReq &req, TPC::State &state,
104  size_t streams, std::vector<TPC::State*> &streams_handles,
105  std::vector<ManagedCurlHandle> &curl_handles,
106  TPCLogRecord &rec);
107 #else
108  int RunCurlBasic(CURL *curl, XrdHttpExtReq &req, TPC::State &state,
109  const char *log_prefix);
110 #endif
111 
112  int ProcessPushReq(const std::string & resource, XrdHttpExtReq &req);
113  int ProcessPullReq(const std::string &resource, XrdHttpExtReq &req);
114 
115  bool ConfigureFSLib(XrdOucStream &Config, std::string &path1, bool &path1_alt,
116  std::string &path2, bool &path2_alt);
117  bool Configure(const char *configfn, XrdOucEnv *myEnv);
119 
120  // Generate a consistently-formatted log message.
121  void logTransferEvent(LogMask lvl, const TPCLogRecord &record,
122  const std::string &event, const std::string &message="");
123 
124  static int m_marker_period;
125  static size_t m_block_size;
126  static size_t m_small_block_size;
128  int m_timeout; // the 'timeout interval'; if no bytes have been received during this time period, abort the transfer.
129  int m_first_timeout; // the 'first timeout interval'; the amount of time we're willing to wait to get the first byte.
130  // Unless explicitly specified, this is 2x the timeout interval.
131  std::string m_cadir; // The directory to use for CAs.
132  std::string m_cafile; // The file to use for CAs in libcurl
134  static uint64_t m_monid;
136  XrdSfsFileSystem *m_sfs;
137  std::shared_ptr<XrdTlsTempCA> m_ca_file;
138 
139  // 16 blocks in flight at 16 MB each, meaning that there will be up to 256MB
140  // in flight; this is equal to the bandwidth delay product of a 200ms transcontinental
141  // connection at 10Gbps.
142 #ifdef USE_PIPELINING
143  static const int m_pipelining_multiplier = 16;
144 #else
145  static const int m_pipelining_multiplier = 1;
146 #endif
147 };
148 }
Definition: XrdTpcState.hh:20
std::string m_cafile
Definition: XrdTpcTPC.hh:132
std::string local
Definition: XrdTpcTPC.hh:59
LogMask
Definition: XrdTpcTPC.hh:22
Definition: XrdTpcTPC.hh:23
Definition: XrdTpcTPC.hh:49
unsigned streams
Definition: XrdTpcTPC.hh:64
bool m_desthttps
Definition: XrdTpcTPC.hh:127
virtual int ProcessReq(XrdHttpExtReq &req)
Definition: XrdOucStream.hh:46
Utility functions for XrdHTTP.
static size_t m_block_size
Definition: XrdTpcTPC.hh:125
int RunCurlBasic(CURL *curl, XrdHttpExtReq &req, TPC::State &state, const char *log_prefix)
int tpc_status
Definition: XrdTpcTPC.hh:63
Definition: XrdSysError.hh:89
std::string m_cadir
Definition: XrdTpcTPC.hh:131
static const int m_pipelining_multiplier
Definition: XrdTpcTPC.hh:145
bool ConfigureFSLib(XrdOucStream &Config, std::string &path1, bool &path1_alt, std::string &path2, bool &path2_alt)
Definition: XrdTpcTPC.hh:24
static std::string GetAuthz(XrdHttpExtReq &req)
Definition: XrdSysPthread.hh:164
bool Configure(const char *configfn, XrdOucEnv *myEnv)
virtual int Init(const char *cfgfile)
Initializes the external request handler.
Definition: XrdTpcTPC.hh:45
TPCHandler(XrdSysError *log, const char *config, XrdOucEnv *myEnv)
std::string log_prefix
Definition: XrdTpcTPC.hh:58
int OpenWaitStall(XrdSfsFile &fh, const std::string &resource, int mode, int openMode, const XrdSecEntity &sec, const std::string &authz)
XrdCmsConfig Config
Definition: XrdTpcTPC.hh:37
std::shared_ptr< XrdTlsTempCA > m_ca_file
Definition: XrdTpcTPC.hh:137
Definition: XrdOucErrInfo.hh:100
Definition: XrdTpcTPC.hh:26
int RedirectTransfer(CURL *curl, const std::string &redirect_resource, XrdHttpExtReq &req, XrdOucErrInfo &error, TPCLogRecord &)
virtual bool MatchesPath(const char *verb, const char *path)
Tells if the incoming path is recognized as one of the paths that have to be processed.
Definition: XrdOucEnv.hh:41
Definition: XrdHttpExtHandler.hh:79
int ProcessPullReq(const std::string &resource, XrdHttpExtReq &req)
TPCLogRecord()
Definition: XrdTpcTPC.hh:51
std::unique_ptr< CURL, CurlDeleter > ManagedCurlHandle
Definition: XrdTpcTPC.hh:34
static int m_marker_period
Definition: XrdTpcTPC.hh:124
Definition: XrdTpcTPC.hh:31
static uint64_t m_monid
Definition: XrdTpcTPC.hh:134
XrdSfsFileSystem * m_sfs
Definition: XrdTpcTPC.hh:136
void operator()(CURL *curl)
static XrdSysMutex m_monid_mutex
Definition: XrdTpcTPC.hh:133
int m_first_timeout
Definition: XrdTpcTPC.hh:129
void logTransferEvent(LogMask lvl, const TPCLogRecord &record, const std::string &event, const std::string &message="")
int ProcessOptionsReq(XrdHttpExtReq &req)
Definition: XrdSecEntity.hh:63
bool ConfigureLogger(XrdOucStream &Config)
int ProcessPushReq(const std::string &resource, XrdHttpExtReq &req)
virtual ~TPCHandler()
Definition: XrdSfsInterface.hh:364
std::string remote
Definition: XrdTpcTPC.hh:60
int m_timeout
Definition: XrdTpcTPC.hh:128
Definition: XrdHttpExtHandler.hh:45
int status
Definition: XrdTpcTPC.hh:62
static size_t m_small_block_size
Definition: XrdTpcTPC.hh:126
void CURL
Definition: XrdTpcState.hh:13
std::string name
Definition: XrdTpcTPC.hh:61
Definition: XrdTpcTPC.hh:27
XrdSysError m_log
Definition: XrdTpcTPC.hh:135
Definition: XrdTpcTPC.hh:25
void ConfigureCurlCA(CURL *curl)
off_t bytes_transferred
Definition: XrdTpcTPC.hh:65