63int XrdOssCsiFile::pageMapClose()
65 if (!pmi_)
return -EBADF;
68 XrdSysMutexHelper lck(pmi_->mtx);
76 cpret = pmi_->pages->Close();
90 auto mapidx =
pumap_.find(key);
91 if (mapidx ==
pumap_.end())
98 pumap_.insert(std::make_pair(key, pmi));
103 pmi = mapidx->second;
112 auto mapidx =
pumap_.find(pmi->tpath);
113 if (pmi->refcount == 0 || pmi->unlinked)
115 if (mapidx !=
pumap_.end() && mapidx->second == pmi)
121 return (pmi->refcount == 0) ? 1 : 0;
124int XrdOssCsiFile::pageAndFileOpen(
const char *fn,
const int dflags,
const int Oflag,
const mode_t
Mode,
XrdOucEnv &Env)
126 if (pmi_)
return -EBADF;
133 XrdSysMutexHelper lck(pmi_->mtx);
140 return pageAndFileOpen(fn, dflags, Oflag,
Mode, Env);
143 if ((dflags & O_TRUNC) && pmi_->pages)
160 pageret = createPageUpdater(Oflag, Env);
174 return (dataret !=
XrdOssOK) ? dataret : pageret;
195 const int cpret = pageMapClose();
198 if (cpret<0)
return cpret;
202int XrdOssCsiFile::createPageUpdater(
const int Oflag,
XrdOucEnv &Env)
208 if (!(Oflag & O_EXCL) && !(Oflag & O_TRUNC))
222 int tagFlags = O_RDWR;
225 if ((Oflag & O_TRUNC)) tagFlags |= O_TRUNC;
233 if ((Oflag & O_CREAT) && dsize == 0)
239 if ((tagFlags & O_CREAT))
243 std::string base = pmi_->tpath;
244 const size_t idx = base.rfind(
"/");
245 base = base.substr(0,idx);
248 const int AMode = S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH;
249 mkdret = parentOss_->Mkdir(base.c_str(), AMode, 1, tagEnv.get());
252 if (mkdret !=
XrdOssOK && mkdret != -EEXIST)
258 std::unique_ptr<XrdOssDF> integFile(parentOss_->newFile(tident));
259 std::unique_ptr<XrdOssCsiTagstore> ts(
new
261 std::unique_ptr<XrdOssCsiPages> pages(
new
262 XrdOssCsiPages(pmi_->dpath, std::move(ts), config_.fillFileHole(), config_.allowMissingTags(),
263 config_.disablePgExtend(), config_.disableLooseWrite(), tident));
265 int puret = pages->Open(pmi_->tpath.c_str(), dsize, tagFlags, *tagEnv);
268 if ((puret == -EROFS || puret == -EACCES) && rdonly_)
271 puret = pages->Open(pmi_->tpath.c_str(), dsize, O_RDONLY, *tagEnv);
281 pmi_->pages = std::move(pages);
299 if (config_.tagParam_.isTagFile(path))
301 if ((Oflag & O_CREAT))
return -EACCES;
306 if ((dflags & O_ACCMODE) == O_WRONLY)
309 dflags &= ~O_ACCMODE;
314 if ((dflags & O_ACCMODE) != O_RDONLY)
319 const int oret = pageAndFileOpen(path, dflags, Oflag,
Mode, Env);
331 if (
Pages()->IsReadOnly() && !rdonly_)
346 if (!pmi_)
return -EBADF;
352 if (bread<0 || blen==0)
return bread;
355 if (puret<0)
return puret;
361 if (!pmi_)
return -EBADF;
367 if (bread<0 || blen==0)
return bread;
370 if (puret<0)
return puret;
376 if (!pmi_)
return -EBADF;
380 off_t start = readV[0].
offset;
381 off_t end = start + (off_t)readV[0].size;
382 for(
int i=1; i<n; i++)
384 const off_t p1 = readV[i].
offset;
385 const off_t p2 = p1 + (off_t)readV[i].size;
386 if (p1<start) start = p1;
387 if (p2>end) end = p2;
393 if (rret<0)
return rret;
394 for (
int i=0; i<n; i++)
396 if (readV[i].size == 0)
continue;
398 if (puret<0)
return puret;
405 if (!pmi_)
return -EBADF;
406 if (rdonly_)
return -EBADF;
416 return (ssize_t)puret;
418 ssize_t towrite = blen;
419 ssize_t bwritten = 0;
420 const uint8_t *p = (uint8_t*)buff;
423 ssize_t wret =
successor_->
Write(&p[bwritten], offset+bwritten, towrite);
438 if (!pmi_)
return -EBADF;
439 if (rdonly_)
return -EBADF;
443 off_t start = writeV[0].
offset;
444 off_t end = start + (off_t)writeV[0].size;
445 for(
int i=1; i<n; i++)
447 const off_t p1 = writeV[i].
offset;
448 const off_t p2 = p1 + (off_t)writeV[i].size;
449 if (p1<start) start = p1;
450 if (p2>end) end = p2;
454 for (
int i=0; i<n; i++)
476 if (!pmi_)
return -EBADF;
484 ssize_t toread = rdlen;
486 uint8_t *
const p = (uint8_t*)buffer;
490 if (rret<0)
return rret;
495 if (rdlen == 0)
return bread;
498 if (puret<0)
return puret;
504 if (!pmi_)
return -EBADF;
505 if (rdonly_)
return -EBADF;
506 uint64_t pgopts =
opts;
521 return (ssize_t)puret;
523 ssize_t towrite = wrlen;
524 ssize_t bwritten = 0;
525 const uint8_t *p = (uint8_t*)buffer;
528 ssize_t wret =
successor_->
Write(&p[bwritten], offset+bwritten, towrite);
543 if (!pmi_)
return -EBADF;
547 if (psret<0)
return psret;
553 if (!pmi_)
return -EBADF;
554 if (rdonly_)
return -EBADF;
576 if (!pmi_)
return -EBADF;
580 if (fsret<0)
return fsret;
581 if (tsret<0)
return 0;
582 buff->st_size = std::max(sizes.first, sizes.second);
586int XrdOssCsiFile::resyncSizes()
592 if (ret<0)
return ret;
XrdOucTrace OssCsiTrace & OssCsiEroute
std::string makeTagFilename(const char *path)
virtual ssize_t pgWrite(void *, off_t, size_t, uint32_t *, uint64_t)
virtual ssize_t Write(const void *, off_t, size_t)
virtual int Ftruncate(unsigned long long)
virtual ssize_t pgRead(void *, off_t, size_t, uint32_t *, uint64_t)
virtual ssize_t ReadV(XrdOucIOVec *readV, int n)
virtual ssize_t Read(off_t, size_t)
virtual int Open(const char *, int, mode_t, XrdOucEnv &)
virtual int Close(long long *retsz=0)
virtual void Flush()
Flush filesystem cached pages for this file (used for checksums).
static XrdSysMutex pumtx_
virtual int Fstat(struct stat *)
static std::unordered_map< std::string, std::shared_ptr< puMapItem_t > > pumap_
virtual ssize_t ReadRaw(void *, off_t, size_t)
virtual ssize_t WriteV(XrdOucIOVec *writeV, int n)
static void mapTake(const std::string &, std::shared_ptr< puMapItem_t > &, bool create=true)
static int mapRelease(std::shared_ptr< puMapItem_t > &, XrdSysMutexHelper *plck=NULL)
XrdOssCsiPages(const std::string &fn, std::unique_ptr< XrdOssCsiTagstore > ts, bool wh, bool am, bool dpe, bool dlw, const char *)
std::pair< off_t, off_t > Sizes_t
int truncate(XrdOssDF *, off_t, XrdOssCsiRangeGuard &)
int LockResetSizes(XrdOssDF *, off_t)
int FetchRange(XrdOssDF *, const void *, off_t, size_t, uint32_t *, uint64_t, XrdOssCsiRangeGuard &)
void LockTrackinglen(XrdOssCsiRangeGuard &, off_t, off_t, bool)
int TrackedSizesGet(Sizes_t &, bool)
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 &)
int UpdateRange(XrdOssDF *, const void *, off_t, size_t, XrdOssCsiRangeGuard &)
int VerifyRange(XrdOssDF *, const void *, off_t, size_t, XrdOssCsiRangeGuard &)
static std::unique_ptr< XrdOucEnv > tagOpenEnv(const XrdOssCsiConfig &, XrdOucEnv &)
virtual ssize_t WriteV(XrdOucIOVec *writeV, int wrvcnt)
virtual int isCompressed(char *cxidp=0)
virtual int Ftruncate(unsigned long long flen)
virtual int Fstat(struct stat *buf)
virtual ssize_t ReadRaw(void *buffer, off_t offset, size_t size)
virtual int Close(long long *retsz=0)=0
virtual int Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &env)
virtual ssize_t Read(off_t offset, size_t size)
virtual void Flush()
Flush filesystem cached pages for this file (used for checksums).
virtual ssize_t ReadV(XrdOucIOVec *readV, int rdvcnt)
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)