41#include "XrdVersion.hh"
64int XrdOssCsiFile::pageMapClose()
66 if (!pmi_)
return -EBADF;
69 XrdSysMutexHelper lck(pmi_->mtx);
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;
125int XrdOssCsiFile::pageAndFileOpen(
const char *fn,
const int dflags,
const int Oflag,
const mode_t
Mode,
XrdOucEnv &Env)
127 if (pmi_)
return -EBADF;
134 XrdSysMutexHelper lck(pmi_->mtx);
141 return pageAndFileOpen(fn, dflags, Oflag,
Mode, Env);
144 if ((dflags & O_TRUNC) && pmi_->pages)
152 const int dataret =
successor_->Open(pmi_->dpath.c_str(), dflags,
Mode, Env);
161 pageret = createPageUpdater(Oflag, Env);
175 return (dataret !=
XrdOssOK) ? dataret : pageret;
196 const int cpret = pageMapClose();
199 if (cpret<0)
return cpret;
203int 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
261 XrdOssCsiTagstoreFile(pmi_->dpath, std::move(integFile), tident));
262 std::unique_ptr<XrdOssCsiPages> pages(
new
263 XrdOssCsiPages(pmi_->dpath, std::move(ts), config_.fillFileHole(), config_.allowMissingTags(),
264 config_.disablePgExtend(), config_.disableLooseWrite(), tident));
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);
300 if (config_.tagParam_.isTagFile(path))
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);
332 if (
Pages()->IsReadOnly() && !rdonly_)
347 if (!pmi_)
return -EBADF;
352 const ssize_t bread =
successor_->Read(buff, offset, blen);
353 if (bread<0 || blen==0)
return bread;
356 if (puret<0)
return puret;
362 if (!pmi_)
return -EBADF;
367 const ssize_t bread =
successor_->ReadRaw(buff, offset, blen);
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;
490 ssize_t rret =
successor_->Read(&p[bread], offset+bread, toread);
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);
587int XrdOssCsiFile::resyncSizes()
593 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)
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 int Fstat(struct stat *buf)