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