Skip to content

Commit

Permalink
[XrdCl] Implement PgWrite, part 3.
Browse files Browse the repository at this point in the history
Parse the retransmission req in kXR_status response into RetryInfo.
  • Loading branch information
simonmichal authored and gganis committed Nov 23, 2021
1 parent 0e8221e commit 1a364ee
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 1 deletion.
35 changes: 34 additions & 1 deletion src/XrdCl/XrdClXRootDMsgHandler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1825,7 +1825,6 @@ namespace XrdCl
case kXR_close:
case kXR_write:
case kXR_writev:
case kXR_pgwrite: // TODO
case kXR_sync:
case kXR_chkpoint:
return Status();
Expand Down Expand Up @@ -2211,6 +2210,40 @@ namespace XrdCl
return Status();
}

//------------------------------------------------------------------------
// kXR_pgwrite
//------------------------------------------------------------------------
case kXR_pgwrite:
{
std::vector<std::tuple<uint64_t, uint32_t>> retries;

ServerResponseV2 *rsp = (ServerResponseV2*)pResponse->GetBuffer();
if( rsp->status.bdy.dlen > 0 )
{
ServerResponseBody_pgWrCSE *cse = (ServerResponseBody_pgWrCSE*)pResponse->GetBuffer( sizeof( ServerResponseV2 ) );
size_t pgcnt = ( rsp->status.bdy.dlen - 8 ) / sizeof( kXR_int64 );
retries.reserve( pgcnt );
kXR_int64 *pgoffs = (kXR_int64*)pResponse->GetBuffer( sizeof( ServerResponseV2 ) +
sizeof( ServerResponseBody_pgWrCSE ) );

for( size_t i = 0; i < pgcnt; ++i )
{
uint32_t len = XrdSys::PageSize;
if( i == 0 ) len = cse->dlFirst;
else if( i == pgcnt - 1 ) len = cse->dlLast;
retries.push_back( std::make_tuple( pgoffs[i], len ) );
}

RetryInfo *info = new RetryInfo( std::move( retries ) );
AnyObject *obj = new AnyObject();
obj->Set( info );
response = obj;
}

return Status();
}


//------------------------------------------------------------------------
// kXR_readv - we need to pass the length of the buffer to the user code
//------------------------------------------------------------------------
Expand Down
50 changes: 50 additions & 0 deletions src/XrdCl/XrdClXRootDResponses.cc
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,56 @@ namespace XrdCl
return pImpl->nbrepair;
}

struct RetryInfoImpl
{
RetryInfoImpl( std::vector<std::tuple<uint64_t, uint32_t>> && retries ) :
retries( std::move( retries ) )
{

}

std::vector<std::tuple<uint64_t, uint32_t>> retries;
};

//----------------------------------------------------------------------------
// Constructor
//----------------------------------------------------------------------------
RetryInfo::RetryInfo( std::vector<std::tuple<uint64_t, uint32_t>> && retries ) :
pImpl( new RetryInfoImpl( std::move( retries ) ) )
{

}

//----------------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------------
RetryInfo::~RetryInfo(){ }

//----------------------------------------------------------------------------
// @return : true if some pages need retrying, false otherwise
//----------------------------------------------------------------------------
bool RetryInfo::NeedRetry()
{
return !pImpl->retries.empty();
}

//----------------------------------------------------------------------------
// @return number of pages that need to be retransmitted
//----------------------------------------------------------------------------
size_t RetryInfo::Size()
{
return pImpl->retries.size();
}

//----------------------------------------------------------------------------
// @return : offset and size of respective page that requires to be
// retransmitted
//----------------------------------------------------------------------------
std::tuple<uint64_t, uint32_t> RetryInfo::At( size_t i )
{
return pImpl->retries[i];
}

//------------------------------------------------------------------------
// Factory function for generating handler objects from lambdas
//------------------------------------------------------------------------
Expand Down
37 changes: 37 additions & 0 deletions src/XrdCl/XrdClXRootDResponses.hh
Original file line number Diff line number Diff line change
Expand Up @@ -974,6 +974,43 @@ namespace XrdCl
std::unique_ptr<PageInfoImpl> pImpl;
};

struct RetryInfoImpl;

struct RetryInfo
{
//----------------------------------------------------------------------------
//! Constructor
//----------------------------------------------------------------------------
RetryInfo( std::vector<std::tuple<uint64_t, uint32_t>> && retries );

//----------------------------------------------------------------------------
//! Destructor
//----------------------------------------------------------------------------
~RetryInfo();

//----------------------------------------------------------------------------
//! @return : true if some pages need retrying, false otherwise
//----------------------------------------------------------------------------
bool NeedRetry();

//----------------------------------------------------------------------------
//! @return number of pages that need to be retransmitted
//----------------------------------------------------------------------------
size_t Size();

//----------------------------------------------------------------------------
//! @return : offset and size of respective page that requires to be
// retransmitted
//----------------------------------------------------------------------------
std::tuple<uint64_t, uint32_t> At( size_t i );

private:
//--------------------------------------------------------------------------
//! pointer to implementation
//--------------------------------------------------------------------------
std::unique_ptr<RetryInfoImpl> pImpl;
};

//----------------------------------------------------------------------------
//! List of chunks
//----------------------------------------------------------------------------
Expand Down

0 comments on commit 1a364ee

Please sign in to comment.