Skip to content

Commit

Permalink
[XrdEc] Parse metadata file, part 1.
Browse files Browse the repository at this point in the history
  • Loading branch information
simonmichal committed Dec 21, 2020
1 parent 216d45f commit 1b5c143
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 6 deletions.
52 changes: 46 additions & 6 deletions src/XrdEc/XrdEcReader.hh
Expand Up @@ -12,7 +12,14 @@

#include "XrdCl/XrdClFileOperations.hh"

#include "XrdZip/XrdZipLFH.hh"
#include "XrdZip/XrdZipCDFH.hh"
#include "XrdZip/XrdZipUtils.hh"

#include "XrdOuc/XrdOucCRC32C.hh"

#include <string>
#include <iostream>

namespace XrdEc
{
Expand Down Expand Up @@ -40,7 +47,7 @@ namespace XrdEc
opens.emplace_back( XrdCl::Open( *dataarchs[i], url, XrdCl::OpenFlags::Read ) );
}
// in parallel open the data files and read the metadata
XrdCl::Pipeline p = XrdCl::Parallel( ReadMetadata( 0 ), XrdCl::Parallel( opens ) );
XrdCl::Pipeline p = XrdCl::Parallel( ReadMetadata( 0 ), XrdCl::Parallel( opens ) ) >> handler;
XrdCl::Async( std::move( p ) );
}

Expand All @@ -54,8 +61,8 @@ namespace XrdEc
// prepare the URL for Open operation
std::string url = objcfg.plgr[index] + objcfg.obj + ".metadata.zip";
// arguments for the Read operation
XrdCl::Fwd<uint32_t> rdsize( 0 );
XrdCl::Fwd<void*> rdbuff( nullptr );
XrdCl::Fwd<uint32_t> rdsize;
XrdCl::Fwd<void*> rdbuff;

return XrdCl::Open( *file, url, XrdCl::OpenFlags::Read ) >>
[=]( XrdCl::XRootDStatus &st, XrdCl::StatInfo &info )
Expand Down Expand Up @@ -100,13 +107,46 @@ namespace XrdEc

bool ParseMetadata( XrdCl::ChunkInfo &ch )
{
// TODO
return false;
std::cout << __func__ << std::endl;
const size_t mincnt = objcfg.nbdata + objcfg.nbparity;
const size_t maxcnt = objcfg.plgr.size();

char *buffer = reinterpret_cast<char*>( ch.buffer );
size_t length = ch.length;

for( size_t i = 0; i < maxcnt; ++i )
{
uint32_t signature = XrdZip::to<uint32_t>( buffer );
if( signature != XrdZip::LFH::lfhSign )
{
if( i + 1 < mincnt ) return false;
break;
}
XrdZip::LFH lfh( buffer );
// check if we are not reading passed the end of the buffer
if( lfh.lfhSize + lfh.uncompressedSize > length ) return false;
buffer += lfh.lfhSize;
length -= lfh.lfhSize;
// verify the checksum
uint32_t crc32val = crc32c( 0, buffer, lfh.uncompressedSize );
if( crc32val != lfh.ZCRC32 ) return false;
XrdZip::CDFH::Parse( buffer, lfh.uncompressedSize, cdrecs );
buffer += lfh.uncompressedSize;
length -= lfh.uncompressedSize;
}

auto itr = cdrecs.begin();
for( ; itr != cdrecs.end() ; ++itr )
{
std::cout << itr->first << " : " << itr->second.get()->filename << std::endl;
}

return true;
}

ObjCfg &objcfg;
std::vector<std::shared_ptr<XrdCl::File>> dataarchs;

XrdZip::cdrecs_t cdrecs;
};

} /* namespace XrdEc */
Expand Down
4 changes: 4 additions & 0 deletions src/XrdZip/XrdZipLFH.hh
Expand Up @@ -70,6 +70,10 @@ namespace XrdZip
//-------------------------------------------------------------------------
LFH( const char *buffer )
{
// check if the buffer contains a LFH record
uint32_t signature = 0;
from_buffer( signature, buffer );
if( signature != lfhSign ) throw bad_data();
// parse LFH filds
from_buffer( minZipVersion, buffer );
from_buffer( generalBitFlag, buffer );
Expand Down

0 comments on commit 1b5c143

Please sign in to comment.