diff --git a/src/XrdCl/XrdClParallelOperation.hh b/src/XrdCl/XrdClParallelOperation.hh index 5bcfac2f16d..dd38c56d46b 100644 --- a/src/XrdCl/XrdClParallelOperation.hh +++ b/src/XrdCl/XrdClParallelOperation.hh @@ -346,6 +346,7 @@ namespace XrdCl void lift() { + std::unique_lock lck( mtx ); on = false; cv.notify_all(); } diff --git a/src/XrdEc/XrdEcReader.cc b/src/XrdEc/XrdEcReader.cc index 589e0200bc4..ffa7d438c34 100644 --- a/src/XrdEc/XrdEcReader.cc +++ b/src/XrdEc/XrdEcReader.cc @@ -506,12 +506,14 @@ namespace XrdEc //------------------------------------------------------------------- // Make sure we operate on a valid block //------------------------------------------------------------------- + std::unique_lock lck( blkmtx ); if( !block || block->blkid != blkid ) block = std::make_shared( blkid, *this, objcfg ); //------------------------------------------------------------------- // Prepare the callback for reading from single stripe //------------------------------------------------------------------- auto blk = block; + lck.unlock(); auto callback = [blk, rdctx, rdsize, rdmtx]( const XrdCl::XRootDStatus &st, uint32_t nbrd ) { std::unique_lock lck( *rdmtx ); @@ -549,7 +551,7 @@ namespace XrdEc //------------------------------------------------------------------- // Read data from a stripe //------------------------------------------------------------------- - block_t::read( block, strpid, rdoff, rdsize, usrbuff, callback, timeout ); + block_t::read( blk, strpid, rdoff, rdsize, usrbuff, callback, timeout ); //------------------------------------------------------------------- // Update absolute offset, read length, and user buffer //------------------------------------------------------------------- diff --git a/src/XrdEc/XrdEcReader.hh b/src/XrdEc/XrdEcReader.hh index c610afeffb5..143d6acd1ec 100644 --- a/src/XrdEc/XrdEcReader.hh +++ b/src/XrdEc/XrdEcReader.hh @@ -166,6 +166,7 @@ namespace XrdEc urlmap_t urlmap; //> map blknb/strpnb (data chunk) to URL missing_t missing; //> set of missing stripes std::shared_ptr block; //> cache for the block we are reading from + std::mutex blkmtx; //> mutex guarding the block from parallel access size_t lstblk; //> last block number uint64_t filesize; //> file size (obtained from xattr) };