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

Commit

Permalink
Merge pull request #6 from wyang007/master
Browse files Browse the repository at this point in the history
implement async PgRead()
  • Loading branch information
simonmichal authored Feb 9, 2021
2 parents 876d2f2 + 16daa73 commit e8a83b1
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 5 deletions.
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

0 comments on commit e8a83b1

Please sign in to comment.