From 1b5c1431973d85acd36a68709063ac18241d5bde Mon Sep 17 00:00:00 2001 From: Michal Simon Date: Tue, 22 Dec 2020 00:05:11 +0100 Subject: [PATCH] [XrdEc] Parse metadata file, part 1. --- src/XrdEc/XrdEcReader.hh | 52 +++++++++++++++++++++++++++++++++++----- src/XrdZip/XrdZipLFH.hh | 4 ++++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/XrdEc/XrdEcReader.hh b/src/XrdEc/XrdEcReader.hh index 35b92e972f3..c28da0b5b5b 100644 --- a/src/XrdEc/XrdEcReader.hh +++ b/src/XrdEc/XrdEcReader.hh @@ -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 +#include namespace XrdEc { @@ -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 ) ); } @@ -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 rdsize( 0 ); - XrdCl::Fwd rdbuff( nullptr ); + XrdCl::Fwd rdsize; + XrdCl::Fwd rdbuff; return XrdCl::Open( *file, url, XrdCl::OpenFlags::Read ) >> [=]( XrdCl::XRootDStatus &st, XrdCl::StatInfo &info ) @@ -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( ch.buffer ); + size_t length = ch.length; + + for( size_t i = 0; i < maxcnt; ++i ) + { + uint32_t signature = XrdZip::to( 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> dataarchs; - + XrdZip::cdrecs_t cdrecs; }; } /* namespace XrdEc */ diff --git a/src/XrdZip/XrdZipLFH.hh b/src/XrdZip/XrdZipLFH.hh index 5e7c49f16ce..268595bd670 100644 --- a/src/XrdZip/XrdZipLFH.hh +++ b/src/XrdZip/XrdZipLFH.hh @@ -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 );