69 int ret =
ts_->
Open(path, dsize, flags, envP);
75 TRACE(Info,
"Opening with missing tagfile: " <<
fn_);
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;
124 rsizes = std::make_pair(tagsize,datasize);
193 const off_t trackinglen = sizes.first;
194 if (offset+blen >
static_cast<size_t>(trackinglen))
201 if ((offset % XrdSys::PageSize) != 0 ||
202 (offset+blen <
static_cast<size_t>(trackinglen) && (blen % XrdSys::PageSize) != 0) ||
203 ((trackinglen % XrdSys::PageSize) !=0 && offset > trackinglen))
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");
258 if ((offset % XrdSys::PageSize) != 0 || (offset+blen !=
static_cast<size_t>(trackinglen) && (blen % XrdSys::PageSize) != 0))
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");
294 if (lastblockset && (nbytes % XrdSys::PageSize)==0)
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;
317 size_t blktowrite = ((nbytes+XrdSys::PageSize-1)/XrdSys::PageSize) + (preblockset ? 1 : 0);
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)
329 calcbycnt = std::min(calcbycnt, (calcbufsz-1)*XrdSys::PageSize);
330 blkwcnt = (calcbycnt+XrdSys::PageSize-1)/XrdSys::PageSize;
331 calcbuf[cidx] = cspre;
338 calcbycnt = std::min(calcbycnt, calcbufsz*XrdSys::PageSize);
339 blkwcnt = (calcbycnt+XrdSys::PageSize-1)/XrdSys::PageSize;
341 if ((calcbycnt % XrdSys::PageSize)!=0 && lastblockset)
343 const size_t x = calcbycnt / XrdSys::PageSize;
344 calcbycnt = XrdSys::PageSize * x;
345 calcbuf[cidx + x] = cslast;
349 memcpy(&calcbuf[cidx], &csvec[calcbytot/XrdSys::PageSize], 4*((calcbycnt+XrdSys::PageSize-1)/XrdSys::PageSize));
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");
380 const off_t p1 = offset / XrdSys::PageSize;
381 const off_t p2 = (offset+blen) / XrdSys::PageSize;
382 const size_t p2_off = (offset+blen) % XrdSys::PageSize;
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);
425 const size_t databytes = (nread+nverif+vcnt <= nfull) ? (vcnt*XrdSys::PageSize) : ((vcnt-1)*XrdSys::PageSize+p2_off);
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");
460 const off_t p1 = offset / XrdSys::PageSize;
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)
525 off_t p2 = offend / XrdSys::PageSize;
526 const size_t p2_off = offend % XrdSys::PageSize;
529 if (p2_off ==0) p2--;
547 if (len<0)
return -EINVAL;
554 const off_t trackinglen = sizes.first;
555 const off_t p_until = len / XrdSys::PageSize;
556 const size_t p_off = len % XrdSys::PageSize;
563 TRACE(Warn,
"Error updating tags for holes, error=" << ret);
568 if (len != trackinglen && p_off != 0)
570 const off_t tracked_page = trackinglen / XrdSys::PageSize;
571 const size_t tracked_off = trackinglen % XrdSys::PageSize;
572 size_t toread = tracked_off;
575 if (p_until != tracked_page) toread = 0;
579 if (p_until != tracked_page) toread = XrdSys::PageSize;
581 uint8_t b[XrdSys::PageSize];
606 memset(&b[toread],0,p_off-toread);
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");
678 if ((offset % XrdSys::PageSize) != 0 || (offset+blen !=
static_cast<size_t>(trackinglen) && (blen % XrdSys::PageSize) != 0))
709 pgDoCalc(buff, offset, blen, csvec);
715 const off_t trackinglen = sizes.first;
720 if (
disablePgExtend_ && (trackinglen % XrdSys::PageSize) !=0 && offset+blen >
static_cast<size_t>(trackinglen))
728 pgDoCalc(buff, offset, blen, csvec);
738 if (offset+blen >
static_cast<size_t>(trackinglen))
745 if ((offset % XrdSys::PageSize) != 0 ||
746 (offset+blen <
static_cast<size_t>(trackinglen) && (blen % XrdSys::PageSize) != 0) ||
747 ((trackinglen % XrdSys::PageSize) !=0 && offset > trackinglen))
779 const size_t p_off = offset % XrdSys::PageSize;
780 const size_t p_alen = (p_off > 0) ? (XrdSys::PageSize - p_off) : wrlen;
794 const size_t p_off = offset % XrdSys::PageSize;
795 const size_t p_alen = (p_off > 0) ? (XrdSys::PageSize - p_off) : wrlen;
798 if (
XrdOucCRC::Ver32C((uint8_t *)buffer+p_alen, wrlen-p_alen, &csvec[1], valcs)>=0)
822 EPNAME(
"BasicConsistencyCheck");
826 uint8_t b[XrdSys::PageSize];
827 static const uint8_t bz[XrdSys::PageSize] = {0};
832 off_t taglp = 0, datalp = 0;
833 size_t tag_len = 0, data_len = 0;
837 taglp = (tagsize - 1) / XrdSys::PageSize;
838 tag_len = tagsize % XrdSys::PageSize;
839 tag_len = tag_len ? tag_len : XrdSys::PageSize;
843 datalp = (datasize - 1) / XrdSys::PageSize;
844 data_len = datasize % XrdSys::PageSize;
845 data_len = data_len ? data_len : XrdSys::PageSize;
851 if (datasize>0 && taglp > datalp)
860 memset(&b[rlen], 0, XrdSys::PageSize-rlen);
871 if (tagv == data_crc_z)
875 else if (tagv == data_crc)
878 TRACE(Warn,
"Resetting tag for page at " << datalp*XrdSys::PageSize <<
" to zero-extended");
879 const ssize_t wret =
ts_->
WriteTags(&data_crc_z, datalp, 1);
892 else if (tagsize>0 && taglp < datalp)
906 memset(&b[rlen], 0, XrdSys::PageSize-rlen);
909 const uint32_t dp_ext_is_zero = !memcmp(&b[tag_len], bz, XrdSys::PageSize-tag_len);
922 else if (tagv == tag_crc_z && dp_ext_is_zero)
925 TRACE(Warn,
"Resetting tag for page at " << taglp*XrdSys::PageSize <<
" to not zero-extended");
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 &)
const std::string tident_
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 &)
const std::pair< off_t, off_t > & getTrackinglens() const
void SetTrackingInfo(XrdOssCsiPages *p, const std::pair< off_t, off_t > &tsizes, bool locked)
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)