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 using XrdSfsFile::fctl;
00045 virtual int
00046 fctl(const int cmd,
00047 const char *args,
00048 XrdOucErrInfo &out_error);
00049
00050 virtual const char *
00051 FName();
00052
00053 virtual int
00054 getMmap(void **Addr, off_t &Size);
00055
00056 virtual int
00057 read(XrdSfsFileOffset fileOffset,
00058 XrdSfsXferSize amount);
00059
00060 virtual XrdSfsXferSize
00061 read(XrdSfsFileOffset fileOffset,
00062 char *buffer,
00063 XrdSfsXferSize buffer_size);
00064
00065 virtual int
00066 read(XrdSfsAio *aioparm);
00067
00068 virtual XrdSfsXferSize
00069 write(XrdSfsFileOffset fileOffset,
00070 const char *buffer,
00071 XrdSfsXferSize buffer_size);
00072
00073 virtual int
00074 write(XrdSfsAio *aioparm);
00075
00076 virtual int
00077 sync();
00078
00079 virtual int
00080 sync(XrdSfsAio *aiop);
00081
00082 virtual int
00083 stat(struct stat *buf);
00084
00085 virtual int
00086 truncate(XrdSfsFileOffset fileOffset);
00087
00088 virtual int
00089 getCXinfo(char cxtype[4], int &cxrsz);
00090
00091 virtual int
00092 SendData(XrdSfsDio *sfDio,
00093 XrdSfsFileOffset offset,
00094 XrdSfsXferSize size);
00095
00096 private:
00097 File(const char *user, int monid, unique_sfs_ptr, XrdThrottleManager &throttle, XrdSysError &eroute);
00098
00099 virtual
00100 ~File();
00101
00102 unique_sfs_ptr m_sfs;
00103 int m_uid;
00104 std::string m_loadshed;
00105 std::string m_user;
00106 XrdThrottleManager &m_throttle;
00107 XrdSysError &m_eroute;
00108 };
00109
00110 class FileSystem : public XrdSfsFileSystem
00111 {
00112
00113 friend XrdSfsFileSystem * XrdSfsGetFileSystem_Internal(XrdSfsFileSystem *, XrdSysLogger *, const char *);
00114
00115 public:
00116
00117 virtual XrdSfsDirectory *
00118 newDir(char *user=0, int monid=0);
00119
00120 virtual XrdSfsFile *
00121 newFile(char *user=0, int monid=0);
00122
00123 virtual int
00124 chksum( csFunc Func,
00125 const char *csName,
00126 const char *path,
00127 XrdOucErrInfo &eInfo,
00128 const XrdSecEntity *client = 0,
00129 const char *opaque = 0);
00130
00131 virtual int
00132 chmod(const char *Name,
00133 XrdSfsMode Mode,
00134 XrdOucErrInfo &out_error,
00135 const XrdSecEntity *client,
00136 const char *opaque = 0);
00137
00138 virtual void
00139 Disc(const XrdSecEntity *client = 0);
00140
00141 virtual void
00142 EnvInfo(XrdOucEnv *envP);
00143
00144 virtual int
00145 exists(const char *fileName,
00146 XrdSfsFileExistence &exists_flag,
00147 XrdOucErrInfo &out_error,
00148 const XrdSecEntity *client,
00149 const char *opaque = 0);
00150
00151 virtual int
00152 fsctl(const int cmd,
00153 const char *args,
00154 XrdOucErrInfo &out_error,
00155 const XrdSecEntity *client);
00156
00157 virtual int
00158 getStats(char *buff, int blen);
00159
00160 virtual const char *
00161 getVersion();
00162
00163 virtual int
00164 mkdir(const char *dirName,
00165 XrdSfsMode Mode,
00166 XrdOucErrInfo &out_error,
00167 const XrdSecEntity *client,
00168 const char *opaque = 0);
00169
00170 virtual int
00171 prepare( XrdSfsPrep &pargs,
00172 XrdOucErrInfo &out_error,
00173 const XrdSecEntity *client = 0);
00174
00175 virtual int
00176 rem(const char *path,
00177 XrdOucErrInfo &out_error,
00178 const XrdSecEntity *client,
00179 const char *info = 0);
00180
00181 virtual int
00182 remdir(const char *dirName,
00183 XrdOucErrInfo &out_error,
00184 const XrdSecEntity *client,
00185 const char *info = 0);
00186
00187 virtual int
00188 rename(const char *oldFileName,
00189 const char *newFileName,
00190 XrdOucErrInfo &out_error,
00191 const XrdSecEntity *client,
00192 const char *infoO = 0,
00193 const char *infoN = 0);
00194
00195 virtual int
00196 stat(const char *Name,
00197 struct stat *buf,
00198 XrdOucErrInfo &out_error,
00199 const XrdSecEntity *client,
00200 const char *opaque = 0);
00201
00202 virtual int
00203 stat(const char *Name,
00204 mode_t &mode,
00205 XrdOucErrInfo &out_error,
00206 const XrdSecEntity *client,
00207 const char *opaque = 0);
00208
00209 virtual int
00210 truncate(const char *Name,
00211 XrdSfsFileOffset fileOffset,
00212 XrdOucErrInfo &out_error,
00213 const XrdSecEntity *client = 0,
00214 const char *opaque = 0);
00215
00216 virtual int
00217 Configure(XrdSysError &, XrdSfsFileSystem *native_fs);
00218
00219 private:
00220 static void
00221 Initialize( FileSystem *&fs,
00222 XrdSfsFileSystem *native_fs,
00223 XrdSysLogger *lp,
00224 const char *config_file);
00225
00226 FileSystem();
00227
00228 virtual
00229 ~FileSystem();
00230
00231 int
00232 xthrottle(XrdOucStream &Config);
00233
00234 int
00235 xloadshed(XrdOucStream &Config);
00236
00237 int
00238 xtrace(XrdOucStream &Config);
00239
00240 static FileSystem *m_instance;
00241 XrdSysError m_eroute;
00242 XrdOucTrace m_trace;
00243 std::string m_config_file;
00244 XrdSfsFileSystem *m_sfs_ptr;
00245 bool m_initialized;
00246 XrdThrottleManager m_throttle;
00247 XrdVersionInfo *myVersion;
00248
00249 };
00250
00251 }
00252
00253 #endif
00254