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:
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) { }
110
111 void aioInc()
112 {
114 while(aioCntWaiters_>0)
115 {
117 }
118 ++aioCnt_;
119 }
120 void aioDec()
121 {
123 if (--aioCnt_ == 0 && aioCntWaiters_>0)
125 }
126 void aioWait()
127 {
130 while(aioCnt_>0)
131 {
133 }
136 }
137
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:
164 const char *tident;
165 std::shared_ptr<puMapItem_t> pmi_;
169
172 int pageAndFileOpen(const char *, const int, const int, const mode_t, XrdOucEnv &);
174
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:
220};
221
223 XrdSysLogger *Logger,
224 const char *config_fn,
225 const char *parms,
226 XrdOucEnv *envP);
227
228#endif
XrdOss * XrdOssAddStorageSystem2(XrdOss *curr_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
#define XRDOSS_HASFSCS
Definition XrdOss.hh:476
#define XRDOSS_HASPGRW
Definition XrdOss.hh:475
#define stat(a, b)
Definition XrdPosix.hh:96
Definition XrdOssCsiConfig.hh:162
Definition XrdOssCsi.hh:57
XrdOssCsiConfig & config_
Definition XrdOssCsi.hh:67
std::string skipprefixname_
Definition XrdOssCsi.hh:70
XrdOssCsiDir(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf)
Definition XrdOssCsi.hh:60
virtual int Opendir(const char *path, XrdOucEnv &env)
bool skipprefix_
Definition XrdOssCsi.hh:69
virtual ~XrdOssCsiDir()
Definition XrdOssCsi.hh:61
bool skipsuffix_
Definition XrdOssCsi.hh:68
virtual int Readdir(char *buff, int blen)
Definition XrdOssCsiFileAio.hh:43
Definition XrdOssCsi.hh:47
XrdOssCsiFileAioStore()
Definition XrdOssCsi.hh:49
XrdOssCsiFileAio * list_
Definition XrdOssCsi.hh:53
std::mutex mtx_
Definition XrdOssCsi.hh:52
Definition XrdOssCsiFileAio.hh:110
Definition XrdOssCsi.hh:74
int aioCntWaiters_
Definition XrdOssCsi.hh:177
int pageAndFileOpen(const char *, const int, const int, const mode_t, XrdOucEnv &)
virtual int pgRead(XrdSfsAio *, uint64_t)
XrdOssCsiPages * Pages()
Definition XrdOssCsi.hh:140
static void mapTake(const std::string &, std::shared_ptr< puMapItem_t > &, bool create=true)
virtual off_t getMmap(void **addr)
Definition XrdOssCsi.hh:82
virtual ssize_t Write(const void *, off_t, size_t)
virtual int Write(XrdSfsAio *)
virtual int Close(long long *retsz=0)
virtual int Fsync()
int VerificationStatus()
virtual ssize_t WriteV(XrdOucIOVec *writeV, int n)
std::shared_ptr< puMapItem_t > pmi_
Definition XrdOssCsi.hh:165
void aioInc()
Definition XrdOssCsi.hh:111
XrdOssCsiFile(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf)
Definition XrdOssCsi.hh:106
virtual ssize_t Read(off_t, size_t)
const char * tident
Definition XrdOssCsi.hh:164
int aioCnt_
Definition XrdOssCsi.hh:176
virtual int Read(XrdSfsAio *)
virtual int pgWrite(XrdSfsAio *, uint64_t)
int pageMapClose()
XrdOssCsiFileAioStore aiostore_
Definition XrdOssCsi.hh:166
static int mapRelease(std::shared_ptr< puMapItem_t > &, XrdSysMutexHelper *plck=NULL)
static XrdSysMutex pumtx_
Definition XrdOssCsi.hh:159
virtual int Fsync(XrdSfsAio *)
virtual ~XrdOssCsiFile()
virtual int Ftruncate(unsigned long long)
XrdOssCsiConfig & config_
Definition XrdOssCsi.hh:167
virtual int getFD()
Definition XrdOssCsi.hh:83
bool rdonly_
Definition XrdOssCsi.hh:168
virtual ssize_t pgWrite(void *, off_t, size_t, uint32_t *, uint64_t)
XrdOss * parentOss_
Definition XrdOssCsi.hh:163
virtual ssize_t ReadV(XrdOucIOVec *readV, int n)
virtual int Open(const char *, int, mode_t, XrdOucEnv &)
virtual ssize_t pgRead(void *, off_t, size_t, uint32_t *, uint64_t)
void aioWait()
Definition XrdOssCsi.hh:126
virtual int Fstat(struct stat *)
static std::unordered_map< std::string, std::shared_ptr< puMapItem_t > > pumap_
Definition XrdOssCsi.hh:160
XrdSysCondVar aioCntCond_
Definition XrdOssCsi.hh:175
int createPageUpdater(int, XrdOucEnv &)
virtual void Flush()
Flush filesystem cached pages for this file (used for checksums).
virtual ssize_t ReadRaw(void *, off_t, size_t)
virtual ssize_t Read(void *, off_t, size_t)
void aioDec()
Definition XrdOssCsi.hh:120
Definition XrdOssCsiPages.hh:47
Definition XrdOssCsi.hh:181
virtual uint64_t Features()
Definition XrdOssCsi.hh:190
virtual int Reloc(const char *tident, const char *path, const char *cgName, const char *anchor=0)
virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0)
virtual XrdOssDF * newDir(const char *tident)
virtual int StatPF(const char *path, struct stat *buff)
Definition XrdOssCsi.hh:207
static std::unique_ptr< XrdOucEnv > tagOpenEnv(const XrdOssCsiConfig &, XrdOucEnv &)
XrdOssCsiConfig config_
Definition XrdOssCsi.hh:219
virtual int Init(XrdSysLogger *lp, const char *cfn)
Definition XrdOssCsi.hh:186
virtual int Stat(const char *path, struct stat *buff, int opts=0, XrdOucEnv *EnvP=0)
int Init(XrdSysLogger *, const char *, const char *, XrdOucEnv *)
virtual int Truncate(const char *path, unsigned long long size, XrdOucEnv *envP=0)
virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *eP=0)
virtual int Remdir(const char *path, int Opts=0, XrdOucEnv *eP=0)
virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0)
virtual int StatPF(const char *path, struct stat *buff, int opts)
virtual int Rename(const char *oldname, const char *newname, XrdOucEnv *old_env=0, XrdOucEnv *new_env=0)
virtual ~XrdOssCsi()
Definition XrdOssCsi.hh:212
virtual XrdOssDF * newFile(const char *tident)
virtual int Init(XrdSysLogger *lp, const char *cfn, XrdOucEnv *envP)
Definition XrdOssCsi.hh:187
virtual int StatXA(const char *path, char *buff, int &blen, XrdOucEnv *envP=0)
virtual int Create(const char *tident, const char *path, mode_t access_mode, XrdOucEnv &env, int Opts=0)
XrdOssCsi(XrdOss *successor)
Definition XrdOssCsi.hh:211
static XrdScheduler * Sched_
Definition XrdOssCsi.hh:216
Definition XrdOssHandler.hh:41
Definition XrdOss.hh:63
Definition XrdOssHandler.hh:84
XrdOss * successor_
Definition XrdOssHandler.hh:141
Definition XrdOss.hh:498
virtual uint64_t Features()
Definition XrdOucEnv.hh:42
Definition XrdScheduler.hh:46
Definition XrdSfsAio.hh:59
Definition XrdSysPthread.hh:129
Definition XrdSysPthread.hh:79
void Broadcast()
Definition XrdSysPthread.hh:89
Definition XrdSysLogger.hh:53
Definition XrdSysPthread.hh:263
Definition XrdSysPthread.hh:165
Definition XrdOssCsi.hh:144
XrdSysMutex mtx
Definition XrdOssCsi.hh:146
puMapItem_t()
Definition XrdOssCsi.hh:152
std::string dpath
Definition XrdOssCsi.hh:148
int refcount
Definition XrdOssCsi.hh:145
bool unlinked
Definition XrdOssCsi.hh:150
std::unique_ptr< XrdOssCsiPages > pages
Definition XrdOssCsi.hh:147
std::string tpath
Definition XrdOssCsi.hh:149
Definition XrdOucIOVec.hh:41