XRootD
Loading...
Searching...
No Matches
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
45
55
57{
58public:
59
60 XrdOssCsiDir(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf) : XrdOssDFHandler(parent->newDir(tid)), config_(cf) { }
61virtual ~XrdOssCsiDir() { }
62
63virtual int Opendir(const char *path, XrdOucEnv &env) /* override */;
64virtual int Readdir(char *buff, int blen) /* override */;
65
66private:
67 XrdOssCsiConfig &config_;
68 bool skipsuffix_;
69 bool skipprefix_;
70 std::string skipprefixname_;
71};
72
74{
75friend class XrdOssCsiFileAio;
77public:
78
79virtual int Close(long long *retsz=0) /* override */;
80virtual int Open(const char *, int, mode_t, XrdOucEnv &) /* override */;
81
82virtual off_t getMmap(void **addr) /* override */ { if (addr) *addr = 0; return 0; }
83virtual int getFD() /* override */ { return -1; }
84
85virtual void Flush() /* override */;
86virtual int Fstat(struct stat *) /* override */;
87virtual int Fsync() /* override */;
88virtual int Fsync(XrdSfsAio *) /* override */;
89virtual int Ftruncate(unsigned long long) /* override */;
90
91virtual ssize_t Read(off_t, size_t) /* override */;
92virtual ssize_t Read(void *, off_t, size_t) /* override */;
93virtual int Read(XrdSfsAio *) /* override */;
94virtual ssize_t ReadRaw(void *, off_t, size_t) /* override */;
95virtual ssize_t ReadV(XrdOucIOVec *readV, int n) /* override */;
96
97virtual ssize_t Write(const void *, off_t, size_t) /* override */;
98virtual int Write(XrdSfsAio *) /* override */;
99virtual ssize_t WriteV(XrdOucIOVec *writeV, int n) /* override */;
100
101virtual ssize_t pgRead (void*, off_t, size_t, uint32_t*, uint64_t) /* override */;
102virtual int pgRead (XrdSfsAio*, uint64_t) /* override */;
103virtual ssize_t pgWrite(void*, off_t, size_t, uint32_t*, uint64_t) /* override */;
104virtual 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) { }
109virtual ~XrdOssCsiFile();
110
111 void aioInc()
112 {
113 XrdSysCondVarHelper lck(&aioCntCond_);
114 while(aioCntWaiters_>0)
115 {
116 aioCntCond_.Wait();
117 }
118 ++aioCnt_;
119 }
120 void aioDec()
121 {
122 XrdSysCondVarHelper lck(&aioCntCond_);
123 if (--aioCnt_ == 0 && aioCntWaiters_>0)
124 aioCntCond_.Broadcast();
125 }
126 void aioWait()
127 {
128 XrdSysCondVarHelper lck(&aioCntCond_);
129 ++aioCntWaiters_;
130 while(aioCnt_>0)
131 {
132 aioCntCond_.Wait();
133 }
134 --aioCntWaiters_;
135 aioCntCond_.Broadcast();
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;
151
152 puMapItem_t() : refcount(0), unlinked(false) { }
153 };
154
155static int mapRelease(std::shared_ptr<puMapItem_t> &, XrdSysMutexHelper *plck=NULL);
156
157static void mapTake(const std::string &, std::shared_ptr<puMapItem_t> &, bool create=true);
158
160static std::unordered_map<std::string, std::shared_ptr<puMapItem_t> > pumap_;
161
162private:
163 XrdOss *parentOss_;
164 const char *tident;
165 std::shared_ptr<puMapItem_t> pmi_;
166 XrdOssCsiFileAioStore aiostore_;
167 XrdOssCsiConfig &config_;
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
175 XrdSysCondVar aioCntCond_;
176 int aioCnt_;
177 int aioCntWaiters_;
178};
179
181{
182public:
183virtual XrdOssDF *newDir(const char *tident) /* override */;
184virtual XrdOssDF *newFile(const char *tident) /* override */;
185
186virtual int Init(XrdSysLogger *lp, const char *cfn) /* override */ { return Init(lp, cfn, 0, 0); }
187virtual 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
190virtual uint64_t Features() /* override */ { return (successor_->Features() | XRDOSS_HASFSCS | XRDOSS_HASPGRW); }
191
192virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *eP=0) /* override */;
193virtual int Rename(const char *oldname, const char *newname,
194 XrdOucEnv *old_env=0, XrdOucEnv *new_env=0) /* override */;
195virtual int Truncate(const char *path, unsigned long long size,
196 XrdOucEnv *envP=0) /* override */;
197virtual int Reloc(const char *tident, const char *path,
198 const char *cgName, const char *anchor=0) /* override */;
199virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0) /* override */;
200virtual int Create(const char *tident, const char *path, mode_t access_mode,
201 XrdOucEnv &env, int Opts=0) /* override */;
202virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0) /* override */;
203virtual int Remdir(const char *path, int Opts=0, XrdOucEnv *eP=0) /* override */;
204virtual int Stat(const char *path, struct stat *buff, int opts=0,
205 XrdOucEnv *EnvP=0) /* override */;
206virtual int StatPF(const char *path, struct stat *buff, int opts) /* override */;
207virtual int StatPF(const char *path, struct stat *buff) /* override */ { return StatPF(path, buff, 0);}
208virtual int StatXA(const char *path, char *buff, int &blen,
209 XrdOucEnv *envP=0) /* override */;
210
211 XrdOssCsi(XrdOss *successor) : XrdOssHandler(successor) { }
212virtual ~XrdOssCsi() { }
213
214 static std::unique_ptr<XrdOucEnv> tagOpenEnv(const XrdOssCsiConfig &, XrdOucEnv &);
215
217
218private:
219 XrdOssCsiConfig config_;
220};
221
222extern "C" XrdOss *XrdOssAddStorageSystem2(XrdOss *curr_oss,
224 const char *config_fn,
225 const char *parms,
226 XrdOucEnv *envP);
227
228#endif
#define tident
struct stat Stat
Definition XrdCks.cc:49
static void parent()
static XrdSysLogger Logger
XrdOss * XrdOssAddStorageSystem2(XrdOss *curr_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
Definition XrdOssCsi.cc:452
#define XRDOSS_HASFSCS
Definition XrdOss.hh:476
#define XRDOSS_HASPGRW
Definition XrdOss.hh:475
#define stat(a, b)
Definition XrdPosix.hh:96
bool Create
struct myOpts opts
virtual int Opendir(const char *path, XrdOucEnv &env)
Definition XrdOssCsi.cc:56
virtual int Readdir(char *buff, int blen)
Definition XrdOssCsi.cc:73
XrdOssCsiDir(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf)
Definition XrdOssCsi.hh:60
virtual ~XrdOssCsiDir()
Definition XrdOssCsi.hh:61
XrdOssCsiFileAio * list_
Definition XrdOssCsi.hh:53
virtual ssize_t pgWrite(void *, off_t, size_t, uint32_t *, uint64_t)
XrdOssCsiPages * Pages()
Definition XrdOssCsi.hh:140
virtual int Fsync()
virtual ssize_t Write(const void *, off_t, size_t)
virtual int Ftruncate(unsigned long long)
virtual off_t getMmap(void **addr)
Definition XrdOssCsi.hh:82
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 &)
XrdOssCsiFile(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf)
Definition XrdOssCsi.hh:106
virtual int Close(long long *retsz=0)
virtual void Flush()
Flush filesystem cached pages for this file (used for checksums).
virtual ~XrdOssCsiFile()
static XrdSysMutex pumtx_
Definition XrdOssCsi.hh:159
virtual int Fstat(struct stat *)
virtual int getFD()
Definition XrdOssCsi.hh:83
static std::unordered_map< std::string, std::shared_ptr< puMapItem_t > > pumap_
Definition XrdOssCsi.hh:160
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)
virtual int Remdir(const char *path, int Opts=0, XrdOucEnv *eP=0)
Definition XrdOssCsi.cc:394
virtual uint64_t Features()
Definition XrdOssCsi.hh:190
static std::unique_ptr< XrdOucEnv > tagOpenEnv(const XrdOssCsiConfig &, XrdOucEnv &)
Definition XrdOssCsi.cc:467
virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *eP=0)
Definition XrdOssCsi.cc:135
virtual int StatPF(const char *path, struct stat *buff)
Definition XrdOssCsi.hh:207
virtual int Reloc(const char *tident, const char *path, const char *cgName, const char *anchor=0)
Definition XrdOssCsi.cc:301
virtual int Init(XrdSysLogger *lp, const char *cfn)
Definition XrdOssCsi.hh:186
virtual XrdOssDF * newFile(const char *tident)
Definition XrdOssCsi.cc:104
virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0)
Definition XrdOssCsi.cc:308
virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0)
Definition XrdOssCsi.cc:388
virtual int Truncate(const char *path, unsigned long long size, XrdOucEnv *envP=0)
Definition XrdOssCsi.cc:280
virtual int StatXA(const char *path, char *buff, int &blen, XrdOucEnv *envP=0)
Definition XrdOssCsi.cc:444
static XrdScheduler * Sched_
Definition XrdOssCsi.hh:216
virtual int StatPF(const char *path, struct stat *buff, int opts)
Definition XrdOssCsi.cc:415
virtual int Rename(const char *oldname, const char *newname, XrdOucEnv *old_env=0, XrdOucEnv *new_env=0)
Definition XrdOssCsi.cc:168
virtual ~XrdOssCsi()
Definition XrdOssCsi.hh:212
virtual int Init(XrdSysLogger *lp, const char *cfn, XrdOucEnv *envP)
Definition XrdOssCsi.hh:187
virtual XrdOssDF * newDir(const char *tident)
Definition XrdOssCsi.cc:93
XrdOssCsi(XrdOss *successor)
Definition XrdOssCsi.hh:211
XrdOss * successor_
virtual uint64_t Features()
Definition XrdOss.cc:60
std::unique_ptr< XrdOssCsiPages > pages
Definition XrdOssCsi.hh:147