7 #ifndef XRDCLHTTP_CURLFILE_HH
8 #define XRDCLHTTP_CURLFILE_HH
17 #include <condition_variable>
21 #include <shared_mutex>
23 #include <unordered_map>
48 m_default_put_handler(new PutDefaultHandler(*this))
53 virtual
XrdCl::XRootDStatus
Open(const std::
string &url,
56 XrdCl::ResponseHandler *handler,
57 time_t timeout) override;
60 time_t timeout) override;
63 XrdCl::ResponseHandler *handler,
64 time_t timeout) override;
67 XrdCl::ResponseHandler *handler,
68 time_t timeout) override;
73 XrdCl::ResponseHandler *handler,
74 time_t timeout) override;
79 XrdCl::ResponseHandler *handler,
80 time_t timeout) override;
84 XrdCl::ResponseHandler *handler,
85 time_t timeout ) override;
90 XrdCl::ResponseHandler *handler,
91 time_t timeout) override;
94 XrdCl::Buffer &&buffer,
95 XrdCl::ResponseHandler *handler,
96 time_t timeout) override;
98 virtual
bool IsOpen() const override;
101 const std::
string &value ) override;
104 std::
string &value ) const override;
122 void SetHeaderTimeout(
const struct timespec &
ts) {m_header_timeout.tv_sec =
ts.tv_sec; m_header_timeout.tv_nsec =
ts.tv_nsec;}
149 std::tuple<XrdCl::XRootDStatus, bool> ReadPrefetch(uint64_t offset, uint64_t size,
void *buffer,
XrdCl::ResponseHandler *handler, time_t timeout,
bool isPgRead);
154 bool SendResponseInfo()
const;
165 const std::string GetCurrentURL()
const;
170 void CalculateCurrentURL(
const std::string &value)
const;
172 bool m_is_opened{
false};
173 std::atomic<bool> m_full_download{
false};
179 std::string m_last_url;
180 mutable std::string m_url_current;
181 std::shared_ptr<XrdClHttp::HandlerQueue> m_queue;
183 std::unordered_map<std::string, std::string> m_properties;
186 mutable std::shared_mutex m_properties_mutex;
189 struct timespec m_timeout{0, 0};
192 static struct timespec m_min_client_timeout;
195 static struct timespec m_default_header_timeout;
198 struct timespec m_header_timeout;
201 static struct timespec m_fed_timeout;
208 std::shared_ptr<XrdClHttp::CurlPutOp> m_put_op;
219 void SetOp(std::shared_ptr<XrdClHttp::CurlPutOp> op) {m_op = op;}
221 void WaitForCompletion();
225 bool m_initial{
true};
226 std::shared_ptr<XrdClHttp::CurlPutOp> m_op;
228 std::condition_variable m_cv;
240 std::atomic<PutResponseHandler *>m_put_handler{
nullptr};
249 PutDefaultHandler(
File &file) : m_logger(file.m_logger) {}
258 std::shared_ptr<PutDefaultHandler> m_default_put_handler;
266 std::shared_ptr<XrdClHttp::CurlReadOp> m_prefetch_op;
270 std::atomic<off_t> m_prefetch_offset{0};
300 off_t offset,
size_t size, std::atomic<off_t> *prefetch_offset,
char *buffer,
XrdCl::ResponseHandler *handler,
301 std::unique_lock<std::mutex> *lock, time_t timeout);
307 void ResubmitOperation();
317 PrefetchResponseHandler *m_next{
nullptr};
320 char *m_buffer{
nullptr};
330 std::atomic<off_t> *m_prefetch_offset{
nullptr};
338 PrefetchResponseHandler *m_last_prefetch_handler{
nullptr};
341 off_t m_prefetch_size{-1};
344 std::atomic<off_t> m_put_offset{0};
354 PrefetchDefaultHandler(
File &file) : m_logger(file.m_logger), m_url(file.m_url) {}
359 void DisablePrefetch() {
360 auto enabled = m_prefetch_enabled.load(std::memory_order_relaxed);
362 std::unique_lock lock(m_prefetch_mutex);
363 m_prefetch_enabled.store(
false, std::memory_order_relaxed);
368 bool IsPrefetching()
const {
369 auto enabled = m_prefetch_enabled.load(std::memory_order_relaxed);
371 std::unique_lock lock(m_prefetch_mutex);
372 return m_prefetch_enabled.load(std::memory_order_relaxed);
382 mutable std::mutex m_prefetch_mutex;
390 mutable std::atomic<bool> m_prefetch_enabled{
true};
397 std::shared_ptr<PrefetchDefaultHandler> m_default_prefetch_handler;
400 std::atomic<XrdClHttp::HeaderCallout *> m_header_callout{
nullptr};
405 HeaderCallout(
File &fs) : m_parent(fs)
408 virtual ~HeaderCallout() noexcept = default;
410 virtual std::shared_ptr<HeaderList> GetHeaders(const std::
string &verb,
411 const std::
string &url,
412 const HeaderList &headers) override;
418 HeaderCallout m_default_header_callout{*
this};
420 static std::atomic<uint64_t> m_prefetch_count;
421 static std::atomic<uint64_t> m_prefetch_expired_count;
422 static std::atomic<uint64_t> m_prefetch_failed_count;
423 static std::atomic<uint64_t> m_prefetch_reads_hit;
424 static std::atomic<uint64_t> m_prefetch_reads_miss;
425 static std::atomic<uint64_t> m_prefetch_bytes_used;
static std::string ts()
timestamp output for logging messages
struct timespec GetHeaderTimeout(time_t oper_timeout) const
File(std::shared_ptr< XrdClHttp::HandlerQueue > queue, XrdCl::Log *log)
virtual bool IsOpen() const override
virtual XrdCl::XRootDStatus Stat(bool force, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Open(const std::string &url, XrdCl::OpenFlags::Flags flags, XrdCl::Access::Mode mode, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus Fcntl(const XrdCl::Buffer &arg, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual bool GetProperty(const std::string &name, std::string &value) const override
void SetHeaderTimeout(const struct timespec &ts)
static const struct timespec & GetMinimumHeaderTimeout()
virtual XrdCl::XRootDStatus Write(uint64_t offset, uint32_t size, const void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
virtual XrdCl::XRootDStatus PgRead(uint64_t offset, uint32_t size, void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
XrdCl::OpenFlags::Flags Flags() const
static void SetFederationMetadataTimeout(const struct timespec &ts)
virtual bool SetProperty(const std::string &name, const std::string &value) override
static void SetDefaultHeaderTimeout(struct timespec &ts)
static const struct timespec & GetDefaultHeaderTimeout()
static struct timespec GetFederationMetadataTimeout()
virtual XrdCl::XRootDStatus Close(XrdCl::ResponseHandler *handler, time_t timeout) override
static struct timespec GetHeaderTimeoutWithDefault(time_t oper_timeout, const struct timespec &header_timeout)
static std::string GetMonitoringJson()
static void SetMinimumHeaderTimeout(struct timespec &ts)
virtual XrdCl::XRootDStatus VectorRead(const XrdCl::ChunkList &chunks, void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
static struct timespec ParseHeaderTimeout(const std::string &header_value, XrdCl::Log *logger)
virtual XrdCl::XRootDStatus Read(uint64_t offset, uint32_t size, void *buffer, XrdCl::ResponseHandler *handler, time_t timeout) override
Binary blob representation.
An interface for file plug-ins.
Handle an async response.
std::vector< ChunkInfo > ChunkList
List of chunks.
ConnectionCallout *(*)(const std::string &, const ResponseInfo &) CreateConnCalloutType
Flags
Open flags, may be or'd when appropriate.