41 #include "XrdVersion.hh"
47 #include <sys/types.h>
64 int XrdOssCsiFile::pageMapClose()
66 if (!pmi_)
return -EBADF;
77 cpret = pmi_->pages->Close();
91 auto mapidx =
pumap_.find(key);
92 if (mapidx ==
pumap_.end())
99 pumap_.insert(std::make_pair(key, pmi));
104 pmi = mapidx->second;
113 auto mapidx =
pumap_.find(pmi->tpath);
114 if (pmi->refcount == 0 || pmi->unlinked)
116 if (mapidx !=
pumap_.end() && mapidx->second == pmi)
122 return (pmi->refcount == 0) ? 1 : 0;
125 int XrdOssCsiFile::pageAndFileOpen(
const char *fn,
const int dflags,
const int Oflag,
const mode_t
Mode,
XrdOucEnv &Env)
127 if (pmi_)
return -EBADF;
141 return pageAndFileOpen(fn, dflags, Oflag,
Mode, Env);
144 if ((dflags & O_TRUNC) && pmi_->pages)
161 pageret = createPageUpdater(Oflag, Env);
175 return (dataret !=
XrdOssOK) ? dataret : pageret;
196 const int cpret = pageMapClose();
199 if (cpret<0)
return cpret;
203 int XrdOssCsiFile::createPageUpdater(
const int Oflag,
XrdOucEnv &Env)
209 if (!(Oflag & O_EXCL) && !(Oflag & O_TRUNC))
223 int tagFlags = O_RDWR;
226 if ((Oflag & O_TRUNC)) tagFlags |= O_TRUNC;
234 if ((Oflag & O_CREAT) && dsize == 0)
240 if ((tagFlags & O_CREAT))
244 std::string base = pmi_->tpath;
245 const size_t idx = base.rfind(
"/");
246 base = base.substr(0,idx);
249 const int AMode = S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH;
250 mkdret = parentOss_->
Mkdir(base.c_str(), AMode, 1, tagEnv.get());
253 if (mkdret !=
XrdOssOK && mkdret != -EEXIST)
259 std::unique_ptr<XrdOssDF> integFile(parentOss_->
newFile(
tident));
260 std::unique_ptr<XrdOssCsiTagstore> ts(
new
262 std::unique_ptr<XrdOssCsiPages> pages(
new
266 int puret = pages->Open(pmi_->tpath.c_str(), dsize, tagFlags, *tagEnv);
269 if ((puret == -EROFS || puret == -EACCES) && rdonly_)
272 puret = pages->Open(pmi_->tpath.c_str(), dsize, O_RDONLY, *tagEnv);
282 pmi_->pages = std::move(pages);
302 if ((Oflag & O_CREAT))
return -EACCES;
307 if ((dflags & O_ACCMODE) == O_WRONLY)
310 dflags &= ~O_ACCMODE;
315 if ((dflags & O_ACCMODE) != O_RDONLY)
320 const int oret = pageAndFileOpen(path, dflags, Oflag,
Mode, Env);
347 if (!pmi_)
return -EBADF;
353 if (bread<0 || blen==0)
return bread;
356 if (puret<0)
return puret;
362 if (!pmi_)
return -EBADF;
368 if (bread<0 || blen==0)
return bread;
371 if (puret<0)
return puret;
377 if (!pmi_)
return -EBADF;
381 off_t start = readV[0].
offset;
382 off_t end = start + (off_t)readV[0].size;
383 for(
int i=1; i<n; i++)
385 const off_t p1 = readV[i].
offset;
386 const off_t p2 = p1 + (off_t)readV[i].size;
387 if (p1<start) start = p1;
388 if (p2>end) end = p2;
394 if (rret<0)
return rret;
395 for (
int i=0; i<n; i++)
397 if (readV[i].size == 0)
continue;
399 if (puret<0)
return puret;
406 if (!pmi_)
return -EBADF;
407 if (rdonly_)
return -EBADF;
417 return (ssize_t)puret;
419 ssize_t towrite = blen;
420 ssize_t bwritten = 0;
421 const uint8_t *p = (uint8_t*)buff;
424 ssize_t wret =
successor_->
Write(&p[bwritten], offset+bwritten, towrite);
439 if (!pmi_)
return -EBADF;
440 if (rdonly_)
return -EBADF;
444 off_t start = writeV[0].
offset;
445 off_t end = start + (off_t)writeV[0].size;
446 for(
int i=1; i<n; i++)
448 const off_t p1 = writeV[i].
offset;
449 const off_t p2 = p1 + (off_t)writeV[i].size;
450 if (p1<start) start = p1;
451 if (p2>end) end = p2;
455 for (
int i=0; i<n; i++)
477 if (!pmi_)
return -EBADF;
485 ssize_t toread = rdlen;
487 uint8_t *
const p = (uint8_t*)buffer;
491 if (rret<0)
return rret;
496 if (rdlen == 0)
return bread;
499 if (puret<0)
return puret;
505 if (!pmi_)
return -EBADF;
506 if (rdonly_)
return -EBADF;
507 uint64_t pgopts =
opts;
522 return (ssize_t)puret;
524 ssize_t towrite = wrlen;
525 ssize_t bwritten = 0;
526 const uint8_t *p = (uint8_t*)buffer;
529 ssize_t wret =
successor_->
Write(&p[bwritten], offset+bwritten, towrite);
544 if (!pmi_)
return -EBADF;
548 if (psret<0)
return psret;
554 if (!pmi_)
return -EBADF;
555 if (rdonly_)
return -EBADF;
577 if (!pmi_)
return -EBADF;
581 if (fsret<0)
return fsret;
582 if (tsret<0)
return 0;
583 buff->st_size = std::max(sizes.first, sizes.second);
587 int XrdOssCsiFile::resyncSizes()
593 if (ret<0)
return ret;
int stat(const char *path, struct stat *buf)
std::string makeTagFilename(const char *path)
bool isTagFile(const char *path)
bool fillFileHole() const
bool disableLooseWrite() const
bool disablePgExtend() const
bool allowMissingTags() const
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)
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)
virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0)=0
virtual XrdOssDF * newFile(const char *tident)=0