00001 #ifndef __XRDTHROTTLE_H_
00002 #define __XRDTHROTTLE_H_
00003
00004 #include <memory>
00005 #include <string>
00006
00007 #include "XrdVersion.hh"
00008 #include "XrdSys/XrdSysError.hh"
00009 #include "XrdSfs/XrdSfsInterface.hh"
00010
00011 #include "XrdThrottle/XrdThrottleTrace.hh"
00012 #include "XrdThrottle/XrdThrottleManager.hh"
00013
00014 class XrdSysLogger;
00015 class XrdOucStream;
00016
00017
00018 namespace XrdThrottle {
00019
00020 #if __cplusplus >= 201103L
00021 typedef std::unique_ptr<XrdSfsFile> unique_sfs_ptr;
00022 #else
00023 typedef std::auto_ptr<XrdSfsFile> unique_sfs_ptr;
00024 #endif
00025
00026 class FileSystem;
00027
00028 class File : public XrdSfsFile {
00029
00030 friend class FileSystem;
00031
00032 public:
00033
00034 virtual int
00035 open(const char *fileName,
00036 XrdSfsFileOpenMode openMode,
00037 mode_t createMode,
00038 const XrdSecEntity *client,
00039 const char *opaque = 0);
00040
00041 virtual int
00042 close();
00043
00044 virtual int
00045 checkpoint(cpAct act, struct iov *range=0, int n=0);
00046
00047 using XrdSfsFile::fctl;
00048 virtual int
00049 fctl(const int cmd,
00050 const char *args,
00051 XrdOucErrInfo &out_error);
00052
00053 virtual const char *
00054 FName();
00055
00056 virtual int
00057 getMmap(void **Addr, off_t &Size);
00058
00059 virtual XrdSfsXferSize
00060 pgRead(XrdSfsFileOffset offset,
00061 char *buffer,
00062 XrdSfsXferSize rdlen,
00063 uint32_t *csvec,
00064 uint64_t opts=0);
00065
00066 virtual XrdSfsXferSize
00067 pgRead(XrdSfsAio *aioparm, uint64_t opts=0);
00068
00069 virtual XrdSfsXferSize
00070 pgWrite(XrdSfsFileOffset offset,
00071 char *buffer,
00072 XrdSfsXferSize rdlen,
00073 uint32_t *csvec,
00074 uint64_t opts=0);
00075
00076 virtual XrdSfsXferSize
00077 pgWrite(XrdSfsAio *aioparm, uint64_t opts=0);
00078
00079 virtual int
00080 read(XrdSfsFileOffset fileOffset,
00081 XrdSfsXferSize amount);
00082
00083 virtual XrdSfsXferSize
00084 read(XrdSfsFileOffset fileOffset,
00085 char *buffer,
00086 XrdSfsXferSize buffer_size);
00087
00088 virtual int
00089 read(XrdSfsAio *aioparm);
00090
00091 virtual XrdSfsXferSize
00092 write(XrdSfsFileOffset fileOffset,
00093 const char *buffer,
00094 XrdSfsXferSize buffer_size);
00095
00096 virtual int
00097 write(XrdSfsAio *aioparm);
00098
00099 virtual int
00100 sync();
00101
00102 virtual int
00103 sync(XrdSfsAio *aiop);
00104
00105 virtual int
00106 stat(struct stat *buf);
00107
00108 virtual int
00109 truncate(XrdSfsFileOffset fileOffset);
00110
00111 virtual int
00112 getCXinfo(char cxtype[4], int &cxrsz);
00113
00114 virtual int
00115 SendData(XrdSfsDio *sfDio,
00116 XrdSfsFileOffset offset,
00117 XrdSfsXferSize size);
00118
00119 private:
00120 File(const char *, unique_sfs_ptr, XrdThrottleManager &, XrdSysError &);
00121
00122 virtual
00123 ~File();
00124
00125 unique_sfs_ptr m_sfs;
00126 int m_uid;
00127 std::string m_loadshed;
00128 std::string m_user;
00129 XrdThrottleManager &m_throttle;
00130 XrdSysError &m_eroute;
00131 };
00132
00133 class FileSystem : public XrdSfsFileSystem
00134 {
00135
00136 friend XrdSfsFileSystem * XrdSfsGetFileSystem_Internal(XrdSfsFileSystem *, XrdSysLogger *, const char *);
00137
00138 public:
00139
00140 virtual XrdSfsDirectory *
00141 newDir(char *user=0, int monid=0);
00142
00143 virtual XrdSfsFile *
00144 newFile(char *user=0, int monid=0);
00145
00146 virtual int
00147 chksum( csFunc Func,
00148 const char *csName,
00149 const char *path,
00150 XrdOucErrInfo &eInfo,
00151 const XrdSecEntity *client = 0,
00152 const char *opaque = 0);
00153
00154 virtual int
00155 chmod(const char *Name,
00156 XrdSfsMode Mode,
00157 XrdOucErrInfo &out_error,
00158 const XrdSecEntity *client,
00159 const char *opaque = 0);
00160
00161 virtual void
00162 Connect(const XrdSecEntity *client = 0);
00163
00164 virtual void
00165 Disc(const XrdSecEntity *client = 0);
00166
00167 virtual void
00168 EnvInfo(XrdOucEnv *envP);
00169
00170 virtual int
00171 exists(const char *fileName,
00172 XrdSfsFileExistence &exists_flag,
00173 XrdOucErrInfo &out_error,
00174 const XrdSecEntity *client,
00175 const char *opaque = 0);
00176
00177 virtual int
00178 FAttr( XrdSfsFACtl *faReq,
00179 XrdOucErrInfo &eInfo,
00180 const XrdSecEntity *client = 0);
00181
00182
00183 virtual uint64_t
00184 Features();
00185
00186 virtual int
00187 fsctl(const int cmd,
00188 const char *args,
00189 XrdOucErrInfo &out_error,
00190 const XrdSecEntity *client);
00191
00192 virtual int
00193 getChkPSize();
00194
00195 virtual int
00196 getStats(char *buff, int blen);
00197
00198 virtual const char *
00199 getVersion();
00200
00201 virtual int
00202 gpFile( gpfFunc &gpAct,
00203 XrdSfsGPFile &gpReq,
00204 XrdOucErrInfo &eInfo,
00205 const XrdSecEntity *client = 0);
00206
00207 virtual int
00208 mkdir(const char *dirName,
00209 XrdSfsMode Mode,
00210 XrdOucErrInfo &out_error,
00211 const XrdSecEntity *client,
00212 const char *opaque = 0);
00213
00214 virtual int
00215 prepare( XrdSfsPrep &pargs,
00216 XrdOucErrInfo &out_error,
00217 const XrdSecEntity *client = 0);
00218
00219 virtual int
00220 rem(const char *path,
00221 XrdOucErrInfo &out_error,
00222 const XrdSecEntity *client,
00223 const char *info = 0);
00224
00225 virtual int
00226 remdir(const char *dirName,
00227 XrdOucErrInfo &out_error,
00228 const XrdSecEntity *client,
00229 const char *info = 0);
00230
00231 virtual int
00232 rename(const char *oldFileName,
00233 const char *newFileName,
00234 XrdOucErrInfo &out_error,
00235 const XrdSecEntity *client,
00236 const char *infoO = 0,
00237 const char *infoN = 0);
00238
00239 virtual int
00240 stat(const char *Name,
00241 struct stat *buf,
00242 XrdOucErrInfo &out_error,
00243 const XrdSecEntity *client,
00244 const char *opaque = 0);
00245
00246 virtual int
00247 stat(const char *Name,
00248 mode_t &mode,
00249 XrdOucErrInfo &out_error,
00250 const XrdSecEntity *client,
00251 const char *opaque = 0);
00252
00253 virtual int
00254 truncate(const char *Name,
00255 XrdSfsFileOffset fileOffset,
00256 XrdOucErrInfo &out_error,
00257 const XrdSecEntity *client = 0,
00258 const char *opaque = 0);
00259
00260 virtual int
00261 Configure(XrdSysError &, XrdSfsFileSystem *native_fs);
00262
00263 private:
00264 static void
00265 Initialize( FileSystem *&fs,
00266 XrdSfsFileSystem *native_fs,
00267 XrdSysLogger *lp,
00268 const char *config_file);
00269
00270 FileSystem();
00271
00272 virtual
00273 ~FileSystem();
00274
00275 int
00276 xthrottle(XrdOucStream &Config);
00277
00278 int
00279 xloadshed(XrdOucStream &Config);
00280
00281 int
00282 xtrace(XrdOucStream &Config);
00283
00284 static FileSystem *m_instance;
00285 XrdSysError m_eroute;
00286 XrdOucTrace m_trace;
00287 std::string m_config_file;
00288 XrdSfsFileSystem *m_sfs_ptr;
00289 bool m_initialized;
00290 XrdThrottleManager m_throttle;
00291 XrdVersionInfo *myVersion;
00292
00293 };
00294
00295 }
00296
00297 #endif
00298