xrootd
XrdOssCsi.hh
Go to the documentation of this file.
1 #ifndef _XRDOSSCSI_H
2 #define _XRDOSSCSI_H
3 /******************************************************************************/
4 /* */
5 /* X r d O s s C s i . h h */
6 /* */
7 /* (C) Copyright 2020 CERN. */
8 /* */
9 /* This file is part of the XRootD software suite. */
10 /* */
11 /* XRootD is free software: you can redistribute it and/or modify it under */
12 /* the terms of the GNU Lesser General Public License as published by the */
13 /* Free Software Foundation, either version 3 of the License, or (at your */
14 /* option) any later version. */
15 /* */
16 /* In applying this licence, CERN does not waive the privileges and */
17 /* immunities granted to it by virtue of its status as an Intergovernmental */
18 /* Organization or submit itself to any jurisdiction. */
19 /* */
20 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */
21 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
22 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
23 /* License for more details. */
24 /* */
25 /* You should have received a copy of the GNU Lesser General Public License */
26 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
27 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
28 /* */
29 /* The copyright holder's institutional names and contributor's names may not */
30 /* be used to endorse or promote products derived from this software without */
31 /* specific prior written permission of the institution or contributor. */
32 /******************************************************************************/
33 
34 #include "Xrd/XrdScheduler.hh"
35 #include "XrdOssHandler.hh"
36 #include "XrdOssCsiConfig.hh"
37 #include "XrdOssCsiPages.hh"
38 
39 #include <memory>
40 #include <unordered_map>
41 
42 // forward decl
43 class XrdOssCsiFileAio;
45 
47 {
48 public:
51 
52  std::mutex mtx_;
54 };
55 
57 {
58 public:
59 
60  XrdOssCsiDir(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf) : XrdOssDFHandler(parent->newDir(tid)), config_(cf) { }
61 virtual ~XrdOssCsiDir() { }
62 
63 virtual int Opendir(const char *path, XrdOucEnv &env) /* override */;
64 virtual int Readdir(char *buff, int blen) /* override */;
65 
66 private:
70  std::string skipprefixname_;
71 };
72 
74 {
75 friend class XrdOssCsiFileAio;
76 friend class XrdOssCsiFileAioJob;
77 public:
78 
79 virtual int Close(long long *retsz=0) /* override */;
80 virtual int Open(const char *, int, mode_t, XrdOucEnv &) /* override */;
81 
82 virtual off_t getMmap(void **addr) /* override */ { if (addr) *addr = 0; return 0; }
83 virtual int getFD() /* override */ { return -1; }
84 
85 virtual void Flush() /* override */;
86 virtual int Fstat(struct stat *) /* override */;
87 virtual int Fsync() /* override */;
88 virtual int Fsync(XrdSfsAio *) /* override */;
89 virtual int Ftruncate(unsigned long long) /* override */;
90 
91 virtual ssize_t Read(off_t, size_t) /* override */;
92 virtual ssize_t Read(void *, off_t, size_t) /* override */;
93 virtual int Read(XrdSfsAio *) /* override */;
94 virtual ssize_t ReadRaw(void *, off_t, size_t) /* override */;
95 virtual ssize_t ReadV(XrdOucIOVec *readV, int n) /* override */;
96 
97 virtual ssize_t Write(const void *, off_t, size_t) /* override */;
98 virtual int Write(XrdSfsAio *) /* override */;
99 virtual ssize_t WriteV(XrdOucIOVec *writeV, int n) /* override */;
100 
101 virtual ssize_t pgRead (void*, off_t, size_t, uint32_t*, uint64_t) /* override */;
102 virtual int pgRead (XrdSfsAio*, uint64_t) /* override */;
103 virtual ssize_t pgWrite(void*, off_t, size_t, uint32_t*, uint64_t) /* override */;
104 virtual int pgWrite(XrdSfsAio*, uint64_t) /* override */;
105 
106  XrdOssCsiFile(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf) :
107  XrdOssDFHandler(parent->newFile(tid)), parentOss_(parent), tident(tid), config_(cf),
108  rdonly_(false), aioCntCond_(0), aioCnt_(0), aioCntWaiters_(0) { }
109 virtual ~XrdOssCsiFile();
110 
111  void aioInc()
112  {
114  while(aioCntWaiters_>0)
115  {
116  aioCntCond_.Wait();
117  }
118  ++aioCnt_;
119  }
120  void aioDec()
121  {
123  if (--aioCnt_ == 0 && aioCntWaiters_>0)
125  }
126  void aioWait()
127  {
129  ++aioCntWaiters_;
130  while(aioCnt_>0)
131  {
132  aioCntCond_.Wait();
133  }
134  --aioCntWaiters_;
136  }
137 
138  int VerificationStatus();
139 
141  return pmi_->pages.get();
142  }
143 
144  struct puMapItem_t {
145  int refcount; // access under map's lock
147  std::unique_ptr<XrdOssCsiPages> pages;
148  std::string dpath;
149  std::string tpath;
150  bool unlinked;
151 
152  puMapItem_t() : refcount(0), unlinked(false) { }
153  };
154 
155 static int mapRelease(std::shared_ptr<puMapItem_t> &, XrdSysMutexHelper *plck=NULL);
156 
157 static void mapTake(const std::string &, std::shared_ptr<puMapItem_t> &, bool create=true);
158 
160 static std::unordered_map<std::string, std::shared_ptr<puMapItem_t> > pumap_;
161 
162 private:
164  const char *tident;
165  std::shared_ptr<puMapItem_t> pmi_;
168  bool rdonly_;
169 
170  int resyncSizes();
171  int pageMapClose();
172  int pageAndFileOpen(const char *, const int, const int, const mode_t, XrdOucEnv &);
173  int createPageUpdater(int, XrdOucEnv &);
174 
176  int aioCnt_;
178 };
179 
180 class XrdOssCsi : public XrdOssHandler
181 {
182 public:
183 virtual XrdOssDF *newDir(const char *tident) /* override */;
184 virtual XrdOssDF *newFile(const char *tident) /* override */;
185 
186 virtual int Init(XrdSysLogger *lp, const char *cfn) /* override */ { return Init(lp, cfn, 0, 0); }
187 virtual int Init(XrdSysLogger *lp, const char *cfn, XrdOucEnv *envP) /* override */ { return Init(lp, cfn, 0, envP); }
188  int Init(XrdSysLogger *, const char *, const char *, XrdOucEnv *);
189 
190 virtual uint64_t Features() /* override */ { return (successor_->Features() | XRDOSS_HASFSCS); }
191 
192 virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *eP=0) /* override */;
193 virtual int Rename(const char *oldname, const char *newname,
194  XrdOucEnv *old_env=0, XrdOucEnv *new_env=0) /* override */;
195 virtual int Truncate(const char *path, unsigned long long size,
196  XrdOucEnv *envP=0) /* override */;
197 virtual int Reloc(const char *tident, const char *path,
198  const char *cgName, const char *anchor=0) /* override */;
199 virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0) /* override */;
200 virtual int Create(const char *tident, const char *path, mode_t access_mode,
201  XrdOucEnv &env, int Opts=0) /* override */;
202 virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0) /* override */;
203 virtual int Remdir(const char *path, int Opts=0, XrdOucEnv *eP=0) /* override */;
204 virtual int Stat(const char *path, struct stat *buff, int opts=0,
205  XrdOucEnv *EnvP=0) /* override */;
206 virtual int StatPF(const char *path, struct stat *buff, int opts) /* override */;
207 virtual int StatPF(const char *path, struct stat *buff) /* override */ { return StatPF(path, buff, 0);}
208 virtual int StatXA(const char *path, char *buff, int &blen,
209  XrdOucEnv *envP=0) /* override */;
210 
211  XrdOssCsi(XrdOss *successor) : XrdOssHandler(successor) { }
212 virtual ~XrdOssCsi() { }
213 
214  static std::unique_ptr<XrdOucEnv> tagOpenEnv(const XrdOssCsiConfig &, XrdOucEnv &);
215 
217 
218 private:
220 };
221 
222 extern "C" XrdOss *XrdOssAddStorageSystem2(XrdOss *curr_oss,
223  XrdSysLogger *Logger,
224  const char *config_fn,
225  const char *parms,
226  XrdOucEnv *envP);
227 
228 #endif
int pageMapClose()
static std::unordered_map< std::string, std::shared_ptr< puMapItem_t > > pumap_
Definition: XrdOssCsi.hh:160
XrdSysMutex mtx
Definition: XrdOssCsi.hh:146
XrdOss * parentOss_
Definition: XrdOssCsi.hh:163
Definition: XrdOssCsi.hh:180
virtual ~XrdOssCsi()
Definition: XrdOssCsi.hh:212
XrdOssCsiFileAio * list_
Definition: XrdOssCsi.hh:53
puMapItem_t()
Definition: XrdOssCsi.hh:152
virtual int Truncate(const char *path, unsigned long long size, XrdOucEnv *envP=0)
void aioDec()
Definition: XrdOssCsi.hh:120
virtual int Open(const char *, int, mode_t, XrdOucEnv &)
virtual int Fsync()
static int mapRelease(std::shared_ptr< puMapItem_t > &, XrdSysMutexHelper *plck=NULL)
virtual int Stat(const char *path, struct stat *buff, int opts=0, XrdOucEnv *EnvP=0)
virtual ssize_t pgWrite(void *, off_t, size_t, uint32_t *, uint64_t)
virtual int Rename(const char *oldname, const char *newname, XrdOucEnv *old_env=0, XrdOucEnv *new_env=0)
XrdOss * successor_
Definition: XrdOssHandler.hh:141
std::shared_ptr< puMapItem_t > pmi_
Definition: XrdOssCsi.hh:165
Definition: XrdOssCsi.hh:46
virtual XrdOssDF * newFile(const char *tident)
virtual XrdOssDF * newDir(const char *tident)
XrdOssCsiDir(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf)
Definition: XrdOssCsi.hh:60
virtual int Create(const char *tident, const char *path, mode_t access_mode, XrdOucEnv &env, int Opts=0)
static XrdSysMutex pumtx_
Definition: XrdOssCsi.hh:159
Definition: XrdOssCsi.hh:56
Definition: XrdOssCsiFileAio.hh:109
virtual ssize_t ReadRaw(void *, off_t, size_t)
XrdOssCsiConfig & config_
Definition: XrdOssCsi.hh:67
bool skipsuffix_
Definition: XrdOssCsi.hh:68
Definition: XrdScheduler.hh:44
virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *eP=0)
Definition: XrdSysPthread.hh:165
bool unlinked
Definition: XrdOssCsi.hh:150
static std::unique_ptr< XrdOucEnv > tagOpenEnv(const XrdOssCsiConfig &, XrdOucEnv &)
virtual int Ftruncate(unsigned long long)
#define XRDOSS_HASFSCS
Definition: XrdOss.hh:480
std::string dpath
Definition: XrdOssCsi.hh:148
virtual void Flush()
Flush filesystem cached pages for this file (used for checksums).
bool rdonly_
Definition: XrdOssCsi.hh:168
virtual ssize_t Read(off_t, size_t)
XrdOssCsiFile(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf)
Definition: XrdOssCsi.hh:106
std::mutex mtx_
Definition: XrdOssCsi.hh:52
std::unique_ptr< XrdOssCsiPages > pages
Definition: XrdOssCsi.hh:147
virtual ~XrdOssCsiFile()
Definition: XrdOssHandler.hh:84
Definition: XrdSysPthread.hh:78
void aioInc()
Definition: XrdOssCsi.hh:111
int aioCntWaiters_
Definition: XrdOssCsi.hh:177
XrdOssCsiFileAioStore()
Definition: XrdOssCsi.hh:49
virtual ssize_t Write(const void *, off_t, size_t)
virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0)
virtual int Opendir(const char *path, XrdOucEnv &env)
Definition: XrdOucEnv.hh:41
XrdOssCsiFileAioStore aiostore_
Definition: XrdOssCsi.hh:166
Definition: XrdOucIOVec.hh:40
XrdOssCsiPages * Pages()
Definition: XrdOssCsi.hh:140
std::string skipprefixname_
Definition: XrdOssCsi.hh:70
virtual ssize_t WriteV(XrdOucIOVec *writeV, int n)
XrdOssCsiConfig & config_
Definition: XrdOssCsi.hh:167
Definition: XrdOssCsi.hh:144
virtual int Remdir(const char *path, int Opts=0, XrdOucEnv *eP=0)
Definition: XrdOssCsiPages.hh:45
virtual int Close(long long *retsz=0)
Definition: XrdOssCsi.hh:73
virtual int getFD()
Definition: XrdOssCsi.hh:83
Definition: XrdOssHandler.hh:41
int aioCnt_
Definition: XrdOssCsi.hh:176
virtual int Readdir(char *buff, int blen)
void Broadcast()
Definition: XrdSysPthread.hh:89
Definition: XrdSysPthread.hh:129
Definition: XrdOssCsiFileAio.hh:42
XrdSysCondVar aioCntCond_
Definition: XrdOssCsi.hh:175
static XrdScheduler * Sched_
Definition: XrdOssCsi.hh:216
Definition: XrdSysLogger.hh:52
virtual int StatPF(const char *path, struct stat *buff)
Definition: XrdOssCsi.hh:207
virtual ssize_t pgRead(void *, off_t, size_t, uint32_t *, uint64_t)
void aioWait()
Definition: XrdOssCsi.hh:126
int VerificationStatus()
#define stat(a, b)
Definition: XrdPosix.hh:96
virtual ~XrdOssCsiDir()
Definition: XrdOssCsi.hh:61
Definition: XrdOssCsiConfig.hh:161
std::string tpath
Definition: XrdOssCsi.hh:149
bool skipprefix_
Definition: XrdOssCsi.hh:69
virtual int Init(XrdSysLogger *lp, const char *cfn)
Definition: XrdOssCsi.hh:186
Definition: XrdOss.hh:498
int createPageUpdater(int, XrdOucEnv &)
const char * tident
Definition: XrdOssCsi.hh:164
virtual int StatPF(const char *path, struct stat *buff, int opts)
virtual off_t getMmap(void **addr)
Definition: XrdOssCsi.hh:82
XrdOssCsiConfig config_
Definition: XrdOssCsi.hh:219
Definition: XrdOss.hh:62
virtual int Fstat(struct stat *)
virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0)
Definition: XrdSfsAio.hh:58
virtual int StatXA(const char *path, char *buff, int &blen, XrdOucEnv *envP=0)
virtual ssize_t ReadV(XrdOucIOVec *readV, int n)
XrdOssCsi(XrdOss *successor)
Definition: XrdOssCsi.hh:211
virtual uint64_t Features()
Definition: XrdOssCsi.hh:190
static void mapTake(const std::string &, std::shared_ptr< puMapItem_t > &, bool create=true)
virtual uint64_t Features()
int refcount
Definition: XrdOssCsi.hh:145
Definition: XrdSysPthread.hh:262
XrdOss * XrdOssAddStorageSystem2(XrdOss *curr_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
virtual int Reloc(const char *tident, const char *path, const char *cgName, const char *anchor=0)
int pageAndFileOpen(const char *, const int, const int, const mode_t, XrdOucEnv &)
virtual int Init(XrdSysLogger *lp, const char *cfn, XrdOucEnv *envP)
Definition: XrdOssCsi.hh:187