Skip to content
This repository has been archived by the owner on Dec 16, 2023. It is now read-only.

implement async PgRead() #6

Merged
merged 1 commit into from
Feb 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 77 additions & 5 deletions src/XrdClHttp/HttpFilePlugIn.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include "XrdCl/XrdClLog.hh"
#include "XrdCl/XrdClStatus.hh"

#include "XrdOuc/XrdOucCRC.hh"

namespace {

int MakePosixOpenFlags(XrdCl::OpenFlags::Flags flags) {
Expand Down Expand Up @@ -61,14 +63,19 @@ XRootDStatus HttpFilePlugIn::Open(const std::string &url,
return XRootDStatus(stError, errInvalidOp);
}

if (XrdCl::URL(url).GetProtocol().find("https") == 0)
isChannelEncrypted = true;
else
isChannelEncrypted = false;

avoid_pread_ = false;
if (getenv(HTTP_FILE_PLUG_IN_AVOIDRANGE_ENV) != NULL)
avoid_pread_ = true;
avoid_pread_ = true;
else {
XrdCl::URL::ParamsMap CGIs = XrdCl::URL(url).GetParams();
auto search = CGIs.find(HTTP_FILE_PLUG_IN_AVOIDRANGE_CGI);
if (search != CGIs.end())
avoid_pread_ = true;
XrdCl::URL::ParamsMap CGIs = XrdCl::URL(url).GetParams();
auto search = CGIs.find(HTTP_FILE_PLUG_IN_AVOIDRANGE_CGI);
if (search != CGIs.end())
avoid_pread_ = true;
}

Davix::RequestParams params;
Expand Down Expand Up @@ -232,6 +239,71 @@ XRootDStatus HttpFilePlugIn::Read(uint64_t offset, uint32_t size, void *buffer,
return XRootDStatus();
}

class PgReadSubstitutionHandler : public XrdCl::ResponseHandler {
private:
XrdCl::ResponseHandler *realHandler;
bool isChannelEncrypted;
public:
// constructor
PgReadSubstitutionHandler(XrdCl::ResponseHandler *a,
bool isHttps) : realHandler(a), isChannelEncrypted(isHttps) {}

// Response Handler
void HandleResponse(XrdCl::XRootDStatus *status,
XrdCl::AnyObject *rdresp) {

if( !status->IsOK() )
{
realHandler->HandleResponse( status, rdresp );
delete this;
return;
}

//using namespace XrdCl;

ChunkInfo *chunk = 0;
rdresp->Get(chunk);

std::vector<uint32_t> cksums;
if( isChannelEncrypted )
{
size_t nbpages = chunk->length / XrdSys::PageSize;
if( chunk->length % XrdSys::PageSize )
++nbpages;
cksums.reserve( nbpages );

size_t size = chunk->length;
char *buffer = reinterpret_cast<char*>( chunk->buffer );

for( size_t pg = 0; pg < nbpages; ++pg )
{
size_t pgsize = XrdSys::PageSize;
if( pgsize > size ) pgsize = size;
uint32_t crcval = XrdOucCRC::Calc32C( buffer, pgsize );
cksums.push_back( crcval );
buffer += pgsize;
size -= pgsize;
}
}

PageInfo *pages = new PageInfo(chunk->offset, chunk->length, chunk->buffer, std::move(cksums));
delete rdresp;
AnyObject *response = new AnyObject();
response->Set( pages );
realHandler->HandleResponse( status, response );

delete this;
}
};

XRootDStatus HttpFilePlugIn::PgRead(uint64_t offset, uint32_t size, void *buffer,
ResponseHandler *handler,
uint16_t timeout) {
ResponseHandler *substitHandler = new PgReadSubstitutionHandler( handler, isChannelEncrypted );
XRootDStatus st = Read(offset, size, buffer, substitHandler, timeout);
return st;
}

XRootDStatus HttpFilePlugIn::Write(uint64_t offset, uint32_t size,
const void *buffer, ResponseHandler *handler,
uint16_t timeout) {
Expand Down
10 changes: 10 additions & 0 deletions src/XrdClHttp/HttpFilePlugIn.hh
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,15 @@ class HttpFilePlugIn : public FilePlugIn {
ResponseHandler *handler,
uint16_t timeout ) override;

//------------------------------------------------------------------------
//! @see XrdCl::File::PgRead - async
//------------------------------------------------------------------------
virtual XRootDStatus PgRead( uint64_t offset,
uint32_t size,
void *buffer,
ResponseHandler *handler,
uint16_t timeout ) override;

//------------------------------------------------------------------------
//! @see XrdCl::File::Write
//------------------------------------------------------------------------
Expand Down Expand Up @@ -117,6 +126,7 @@ class HttpFilePlugIn : public FilePlugIn {
uint64_t curr_offset;

bool avoid_pread_;
bool isChannelEncrypted;

bool is_open_;

Expand Down