36 #include <sys/types.h>
47 allowMissingTags_(am),
48 disablePgExtend_(dpe),
49 hasMissingTags_(false),
51 loosewriteConfigured_(!dlw),
69 int ret =
ts_->Open(path, dsize, flags,
envP);
79 TRACE(Warn,
"Could not open tagfile for " <<
fn_ <<
" error " << ret);
82 if (ret<0)
return ret;
83 if ((flags & O_ACCMODE) == O_RDONLY)
rdonly_ =
true;
118 off_t tagsize =
ts_->GetTrackedTagSize();
119 off_t datasize =
ts_->GetTrackedDataSize();
124 rsizes = std::make_pair(tagsize,datasize);
131 return ts_->SetTrackedSize(sz);
140 const int ret =
ts_->ResetSizes(sz);
149 return ts_->Truncate(sz,datatoo);
155 return ts_->SetUnverified();
193 const off_t trackinglen = sizes.first;
194 if (offset+blen >
static_cast<size_t>(trackinglen))
202 (offset+blen <
static_cast<size_t>(trackinglen) && (blen %
XrdSys::PageSize) != 0) ||
236 const off_t trackinglen = sizes.first;
238 if (offset >= trackinglen && blen == 0)
247 TRACE(Warn,
"Verify request for zero bytes " <<
fn_ <<
", file may be truncated");
251 if (offset+blen >
static_cast<size_t>(trackinglen))
253 TRACE(Warn,
"Verify request for " << (offset+blen-trackinglen) <<
" bytes from " <<
fn_ <<
" beyond tracked length");
289 const void *
const buff,
const off_t startp,
const size_t nbytes,
const uint32_t *csvec,
290 const bool preblockset,
const bool lastblockset,
const uint32_t cspre,
const uint32_t cslast)
292 EPNAME(
"apply_sequential_aligned_modify");
298 if (preblockset && startp==0)
304 const size_t calcbufsz =
sizeof(calcbuf)/
sizeof(uint32_t);
305 const uint8_t *
const p = (uint8_t*)buff;
308 bool useinternal =
true;
309 if (csvec && !preblockset && !lastblockset)
314 bool dopre = preblockset;
315 const off_t sp = preblockset ? startp-1 : startp;
318 size_t nblkwritten = 0;
319 size_t calcbytot = 0;
322 size_t blkwcnt = blktowrite;
326 size_t calcbycnt = nbytes - calcbytot;
327 if (nblkwritten == 0 && dopre)
331 calcbuf[cidx] = cspre;
345 calcbuf[cidx + x] = cslast;
355 calcbytot += calcbycnt;
357 const ssize_t wret =
ts_->WriteTags(useinternal ? calcbuf : &csvec[nblkwritten], sp+nblkwritten, blkwcnt);
363 blktowrite -= blkwcnt;
364 nblkwritten += blkwcnt;
377 EPNAME(
"FetchRangeAligned");
383 const size_t nfull = p2-p1;
391 rdbufsz =
sizeof(rdvec)/
sizeof(uint32_t);
397 rdbufsz = (p2_off==0) ? nfull : (nfull+1);
401 const size_t vrbufsz =
sizeof(vrbuf)/
sizeof(uint32_t);
404 const uint8_t *
const p = (uint8_t*)buff;
407 size_t toread = (p2_off>0) ? nfull+1 : nfull;
411 const size_t rcnt = std::min(toread, rdbufsz-(nread%rdbufsz));
412 const ssize_t rret =
ts_->ReadTags(&rdbuf[nread%rdbufsz], p1+nread, rcnt);
420 size_t toverif = rcnt;
424 const size_t vcnt = std::min(toverif, vrbufsz);
427 if (memcmp(vrbuf, &rdbuf[(nread+nverif)%rdbufsz], 4*vcnt))
430 for(badpg=0;badpg<vcnt;++badpg) {
if (memcmp(&vrbuf[badpg],&rdbuf[(nread+nverif+badpg)%rdbufsz],4))
break; }
432 (p1+nread+nverif+badpg),
434 rdbuf[(nread+nverif+badpg)%rdbufsz] ));
455 EPNAME(
"StoreRangeAligned");
461 const off_t trackinglen = sizes.first;
463 if (offset > trackinglen)
468 TRACE(Warn,
"Error updating tags for holes, error=" << ret);
476 TRACE(Warn,
"Error updating tags, error=" << aret);
505 if (offset == offend)
return;
516 const off_t trackinglen = sizes.first;
518 const off_t p1 = (offset>trackinglen ? trackinglen : offset) /
XrdSys::PageSize;
520 if (!rdonly && offend <= trackinglen)
529 if (p2_off ==0) p2--;
547 if (len<0)
return -EINVAL;
554 const off_t trackinglen = sizes.first;
563 TRACE(Warn,
"Error updating tags for holes, error=" << ret);
568 if (len != trackinglen && p_off != 0)
572 size_t toread = tracked_off;
575 if (p_until != tracked_page) toread = 0;
592 rret =
ts_->ReadTags(&crc32v, p_until, 1);
606 memset(&b[toread],0,p_off-toread);
609 const ssize_t wret =
ts_->WriteTags(&
crc32c, p_until, 1);
628 XrdOssDF *
const fd,
const void *buff,
const off_t offset,
const size_t blen,
643 pgDoCalc(buff, offset, blen, csvec);
649 const off_t trackinglen = sizes.first;
651 if (offset >= trackinglen && blen == 0)
660 TRACE(Warn,
"Fetch request for zero bytes " <<
fn_ <<
", file may be truncated");
664 if (offset+blen >
static_cast<size_t>(trackinglen))
666 TRACE(Warn,
"Fetch request for " << (offset+blen-trackinglen) <<
" bytes from " <<
fn_ <<
" beyond tracked length");
709 pgDoCalc(buff, offset, blen, csvec);
715 const off_t trackinglen = sizes.first;
728 pgDoCalc(buff, offset, blen, csvec);
738 if (offset+blen >
static_cast<size_t>(trackinglen))
746 (offset+blen <
static_cast<size_t>(trackinglen) && (blen %
XrdSys::PageSize) != 0) ||
768 iv =
ts_->IsVerified();
798 if (
XrdOucCRC::Ver32C((uint8_t *)buffer+p_alen, wrlen-p_alen, &csvec[1], valcs)>=0)
822 EPNAME(
"BasicConsistencyCheck");
829 const off_t tagsize =
ts_->GetTrackedTagSize();
830 const off_t datasize =
ts_->GetTrackedDataSize();
832 off_t taglp = 0, datalp = 0;
833 size_t tag_len = 0, data_len = 0;
851 if (datasize>0 && taglp > datalp)
864 ssize_t rret =
ts_->ReadTags(&tagv, datalp, 1);
871 if (tagv == data_crc_z)
875 else if (tagv == data_crc)
879 const ssize_t wret =
ts_->WriteTags(&data_crc_z, datalp, 1);
892 else if (tagsize>0 && taglp < datalp)
909 const uint32_t dp_ext_is_zero = !memcmp(&b[tag_len], bz,
XrdSys::PageSize-tag_len);
911 ssize_t rret =
ts_->ReadTags(&tagv, taglp, 1);
922 else if (tagv == tag_crc_z && dp_ext_is_zero)
926 const ssize_t wret =
ts_->WriteTags(&tag_crc, taglp, 1);
936 TRACE(Warn,
CRCMismatchError(tag_len, taglp, tag_crc, tagv) <<
" dp_ext_is_zero=" << dp_ext_is_zero <<
" (ignoring)");
uint32_t crc32c(uint32_t crc, void const *buf, size_t len)
int UpdateRangeAligned(const void *, off_t, size_t, const Sizes_t &)
int StoreRangeUnaligned(XrdOssDF *, const void *, off_t, size_t, const Sizes_t &, const uint32_t *)
ssize_t apply_sequential_aligned_modify(const void *, off_t, size_t, const uint32_t *, bool, bool, uint32_t, uint32_t)
static ssize_t maxread(XrdOssDF *fd, void *buff, const off_t off, const size_t sz, size_t tg=0)
std::string TagsReadError(off_t start, size_t n, int ret)
std::unique_ptr< XrdOssCsiTagstore > ts_
int FetchRangeAligned(const void *, off_t, size_t, const Sizes_t &, uint32_t *, uint64_t)
int LockTruncateSize(off_t, bool)
XrdOssCsiPages(const std::string &fn, std::unique_ptr< XrdOssCsiTagstore > ts, bool wh, bool am, bool dpe, bool dlw, const char *)
int UpdateRangeUnaligned(XrdOssDF *, const void *, off_t, size_t, const Sizes_t &)
std::string TagsWriteError(off_t start, size_t n, int ret)
int StoreRangeAligned(const void *, off_t, size_t, const Sizes_t &, uint32_t *)
void TrackedSizeRelease()
int UpdateRangeHoleUntilPage(XrdOssDF *, off_t, const Sizes_t &)
static ssize_t fullread(XrdOssDF *fd, void *buff, const off_t off, const size_t sz)
std::pair< off_t, off_t > Sizes_t
int FetchRangeUnaligned(XrdOssDF *, const void *, off_t, size_t, const Sizes_t &, uint32_t *, uint64_t)
int truncate(XrdOssDF *, off_t, XrdOssCsiRangeGuard &)
int LockResetSizes(XrdOssDF *, off_t)
int VerifyRangeAligned(const void *, off_t, size_t, const Sizes_t &)
int VerifyRangeUnaligned(XrdOssDF *, const void *, off_t, size_t, const Sizes_t &)
int LockSetTrackedSize(off_t)
int FetchRange(XrdOssDF *, const void *, off_t, size_t, uint32_t *, uint64_t, XrdOssCsiRangeGuard &)
std::string CRCMismatchError(size_t blen, off_t pgnum, uint32_t got, uint32_t expected)
void BasicConsistencyCheck(XrdOssDF *)
void LockTrackinglen(XrdOssCsiRangeGuard &, off_t, off_t, bool)
std::string PageReadError(size_t blen, off_t pgnum, int ret)
int Open(const char *path, off_t dsize, int flags, XrdOucEnv &envP)
int TrackedSizesGet(Sizes_t &, bool)
const bool loosewriteConfigured_
static int pgWritePrelockCheck(const void *, off_t, size_t, const uint32_t *, uint64_t)
int StoreRange(XrdOssDF *, const void *, off_t, size_t, uint32_t *, uint64_t, XrdOssCsiRangeGuard &)
static const size_t stsize_
int UpdateRange(XrdOssDF *, const void *, off_t, size_t, XrdOssCsiRangeGuard &)
static void pgDoCalc(const void *, off_t, size_t, uint32_t *)
int VerifyRange(XrdOssDF *, const void *, off_t, size_t, XrdOssCsiRangeGuard &)
void SetTrackingInfo(XrdOssCsiPages *p, const std::pair< off_t, off_t > &tsizes, bool locked)
const std::pair< off_t, off_t > & getTrackinglens() const
void AddRange(const off_t start, const off_t end, XrdOssCsiRangeGuard &rg, bool rdonly)
static const uint64_t doCalc
pgw: Calculate checksums
static const uint64_t Verify
all: Verify checksums
static const int PF_csVer
verified file checksums present
static const int PF_csVun
unverified file checksums present
static uint32_t Calc32C(const void *data, size_t count, uint32_t prevcs=0)
static bool Ver32C(const void *data, size_t count, const uint32_t csval, uint32_t *csbad=0)
static const int PageSize