xrootd
|
00001 #ifndef _XRDOSS_API_H 00002 #define _XRDOSS_API_H 00003 /******************************************************************************/ 00004 /* */ 00005 /* X r d O s s A p i . h h */ 00006 /* */ 00007 /* (c) 2003 by the Board of Trustees of the Leland Stanford, Jr., University */ 00008 /* All Rights Reserved */ 00009 /* Produced by Andrew Hanushevsky for Stanford University under contract */ 00010 /* DE-AC03-76-SFO0515 with the Department of Energy */ 00011 /******************************************************************************/ 00012 00013 #include <sys/types.h> 00014 #include <errno.h> 00015 #include "XrdSys/XrdSysHeaders.hh" 00016 00017 #include "XrdOss/XrdOss.hh" 00018 #include "XrdOss/XrdOssConfig.hh" 00019 #include "XrdOss/XrdOssError.hh" 00020 #include "XrdOuc/XrdOucExport.hh" 00021 #include "XrdOuc/XrdOucPList.hh" 00022 #include "XrdOuc/XrdOucStream.hh" 00023 #include "XrdSys/XrdSysError.hh" 00024 #include "XrdSys/XrdSysPthread.hh" 00025 00026 /******************************************************************************/ 00027 /* o o s s _ D i r */ 00028 /******************************************************************************/ 00029 00030 class XrdOssDir : public XrdOssDF 00031 { 00032 public: 00033 int Close(long long *retsz=0); 00034 int Opendir(const char *); 00035 int Readdir(char *buff, int blen); 00036 00037 // Constructor and destructor 00038 XrdOssDir(const char *tid) 00039 {lclfd=0; mssfd=0; pflags=ateof=isopen=0; tident=tid;} 00040 ~XrdOssDir() {if (isopen > 0) Close(); isopen = 0;} 00041 private: 00042 DIR *lclfd; 00043 void *mssfd; 00044 const char *tident; 00045 unsigned long long pflags; 00046 int ateof; 00047 int isopen; 00048 }; 00049 00050 /******************************************************************************/ 00051 /* o o s s _ F i l e */ 00052 /******************************************************************************/ 00053 00054 class oocx_CXFile; 00055 class XrdSfsAio; 00056 class XrdOssCache_FS; 00057 class XrdOssMioFile; 00058 00059 class XrdOssFile : public XrdOssDF 00060 { 00061 public: 00062 00063 // The following two are virtual functions to allow for upcasting derivations 00064 // of this implementation 00065 // 00066 virtual int Close(long long *retsz=0); 00067 virtual int Open(const char *, int, mode_t, XrdOucEnv &); 00068 00069 int Fchmod(mode_t mode); 00070 int Fstat(struct stat *); 00071 int Fsync(); 00072 int Fsync(XrdSfsAio *aiop); 00073 int Ftruncate(unsigned long long); 00074 int getFD() {return fd;} 00075 off_t getMmap(void **addr); 00076 int isCompressed(char *cxidp=0); 00077 ssize_t Read( off_t, size_t); 00078 ssize_t Read( void *, off_t, size_t); 00079 int Read(XrdSfsAio *aiop); 00080 ssize_t ReadRaw( void *, off_t, size_t); 00081 ssize_t Write(const void *, off_t, size_t); 00082 int Write(XrdSfsAio *aiop); 00083 00084 // Constructor and destructor 00085 XrdOssFile(const char *tid) 00086 {cxobj = 0; rawio = 0; cxpgsz = 0; cxid[0] = '\0'; 00087 mmFile = 0; tident = tid; 00088 } 00089 00090 virtual ~XrdOssFile() {if (fd >= 0) Close();} 00091 00092 private: 00093 int Open_ufs(const char *, int, int, unsigned long long); 00094 00095 static int AioFailure; 00096 oocx_CXFile *cxobj; 00097 XrdOssCache_FS *cacheP; 00098 XrdOssMioFile *mmFile; 00099 const char *tident; 00100 long long FSize; 00101 int rawio; 00102 int cxpgsz; 00103 char cxid[4]; 00104 }; 00105 00106 /******************************************************************************/ 00107 /* o o s s _ S y s */ 00108 /******************************************************************************/ 00109 00110 class XrdFrmProxy; 00111 class XrdOssCache_Group; 00112 class XrdOssCache_Space; 00113 class XrdOssCreateInfo; 00114 class XrdOucMsubs; 00115 class XrdOucName2Name; 00116 class XrdOucProg; 00117 class XrdOssSpace; 00118 class XrdOssStage_Req; 00119 00120 class XrdOssSys : public XrdOss 00121 { 00122 public: 00123 virtual XrdOssDF *newDir(const char *tident) 00124 {return (XrdOssDF *)new XrdOssDir(tident);} 00125 virtual XrdOssDF *newFile(const char *tident) 00126 {return (XrdOssDF *)new XrdOssFile(tident);} 00127 00128 int Chmod(const char *, mode_t mode); 00129 int Configure(const char *, XrdSysError &); 00130 void Config_Display(XrdSysError &); 00131 virtual 00132 int Create(const char *, const char *, mode_t, XrdOucEnv &, int opts=0); 00133 int GenLocalPath(const char *, char *); 00134 int GenRemotePath(const char *, char *); 00135 int Init(XrdSysLogger *, const char *); 00136 int IsRemote(const char *path) 00137 {return (RPList.Find(path) & XRDEXP_REMOTE) != 0;} 00138 int Lfn2Pfn(const char *Path, char *buff, int blen); 00139 int Mkdir(const char *, mode_t mode, int mkpath=0); 00140 int Mkpath(const char *, mode_t mode); 00141 unsigned long long PathOpts(const char *path) {return RPList.Find(path);} 00142 int Reloc(const char *tident, const char *path, 00143 const char *cgName, const char *anchor=0); 00144 int Remdir(const char *, int Opts=0); // In Unlink() 00145 int Rename(const char *, const char *); 00146 virtual 00147 int Stage(const char *, const char *, XrdOucEnv &, int, mode_t, unsigned long long ); 00148 void *Stage_In(void *carg); 00149 int Stat(const char *, struct stat *, int opts=0); 00150 int StatFS(const char *path, char *buff, int &blen); 00151 int StatFS(const char *path, unsigned long long &Opt, 00152 long long &fSize, long long &fSpace); 00153 int StatLS(XrdOucEnv &env, const char *path, char *buff, int &blen); 00154 int StatVS(XrdOssVSInfo *sP, const char *sname=0, int updt=0); 00155 int StatXA(const char *path, char *buff, int &blen); 00156 int StatXP(const char *path, unsigned long long &attr); 00157 int Truncate(const char *, unsigned long long Size); 00158 int Unlink(const char *, int Opts=0); 00159 00160 int Stats(char *bp, int bl); 00161 00162 static int AioInit(); 00163 static int AioAllOk; 00164 00165 static int runOld; // Run in backward compatability mode 00166 00167 static char tryMmap; // Memory mapped files enabled 00168 static char chkMmap; // Memory mapped files are selective 00169 00170 int MSS_Closedir(void *); 00171 int MSS_Create(const char *path, mode_t, XrdOucEnv &); 00172 void *MSS_Opendir(const char *, int &rc); 00173 int MSS_Readdir(void *fd, char *buff, int blen); 00174 int MSS_Remdir(const char *, const char *) {return -ENOTSUP;} 00175 int MSS_Rename(const char *, const char *); 00176 int MSS_Stat(const char *, struct stat *buff=0); 00177 int MSS_Unlink(const char *); 00178 00179 static const int MaxArgs = 15; 00180 00181 char *ConfigFN; // -> Pointer to the config file name 00182 int Hard_FD_Limit; // Hard file descriptor limit 00183 int MaxTwiddle; // Maximum seconds of internal wait 00184 char *LocalRoot; // -> Path prefix for local filename 00185 char *RemoteRoot; // -> Path prefix for remote filename 00186 int StageRealTime; // If 1, Invoke stage command on demand 00187 int StageAsync; // If 1, return EINPROGRESS to the caller 00188 int StageCreate; // If 1, use open path to create files 00189 int StageFormat; // Format for default stagecmd 00190 char *StageCmd; // -> Staging command to use 00191 char *StageMsg; // -> Staging message to be passed 00192 XrdOucMsubs *StageSnd; // -> Parsed Message 00193 XrdFrmProxy *StageFrm; // -> Built-in stagecmd or zero 00194 00195 char *StageEvents; // -> file:////<adminpath> if async staging 00196 int StageEvSize; // Length of above 00197 int StageActLen; // Length of below 00198 char *StageAction; // -> "wq " if sync | "wfn " if async 00199 00200 char *StageArg[MaxArgs]; 00201 int StageAln[MaxArgs]; 00202 int StageAnum; // Count of valid Arg/Aln array elements 00203 char *RSSCmd; // -> Remote Storage Service Command 00204 int isMSSC; // RSSCmd is old-style msscmd 00205 int RSSTout; // RSSCmd response timeout 00206 long long MaxSize; // Maximum file size (*obsolete*) 00207 int FDFence; // Smallest file FD number allowed 00208 int FDLimit; // Largest file FD number allowed 00209 unsigned long long DirFlags;// Default directory settings 00210 int Trace; // Trace flags 00211 int Solitary; // True if running in stand-alone mode 00212 char *CompSuffix; // -> Compressed file suffix or null for autodetect 00213 int CompSuflen; // Length of suffix 00214 int OptFlags; // General option flags 00215 00216 char *N2N_Lib; // -> Name2Name Library Path 00217 char *N2N_Parms; // -> Name2Name Object Parameters 00218 XrdOucName2Name *lcl_N2N; // -> File mapper for local files 00219 XrdOucName2Name *rmt_N2N; // -> File mapper for remote files 00220 XrdOucName2Name *the_N2N; // -> File mapper object 00221 XrdOucPListAnchor RPList; // The real path list 00222 OssDPath *DPList; // The stat path list 00223 int lenDP; 00224 short numDP; 00225 short numCG; 00226 00227 XrdOssSys(); 00228 virtual ~XrdOssSys() {} 00229 00230 protected: 00231 // Cache management related data and methods 00232 // 00233 long long minalloc; // Minimum allocation 00234 int ovhalloc; // Allocation overage 00235 int fuzalloc; // Allocation fuzz 00236 int cscanint; // Seconds between cache scans 00237 int xfrspeed; // Average transfer speed (bytes/second) 00238 int xfrovhd; // Minimum seconds to get a file 00239 int xfrhold; // Second hold limit on failing requests 00240 int xfrkeep; // Second keep queued requests 00241 int xfrthreads; // Number of threads for staging 00242 int xfrtcount; // Actual count of threads (used for dtr) 00243 long long pndbytes; // Total bytes to be staged (pending) 00244 long long stgbytes; // Total bytes being staged (active) 00245 long long totbytes; // Total bytes were staged (active+pending) 00246 int totreqs; // Total successful requests 00247 int badreqs; // Total unsuccessful requests 00248 00249 XrdOucProg *StageProg; // Command or manager than handles staging 00250 XrdOucProg *RSSProg; // Command for Remote Storage Services 00251 00252 char *UDir; // -> Usage logdir 00253 char *QFile; // -> Quota file 00254 00255 int Alloc_Cache(XrdOssCreateInfo &, XrdOucEnv &); 00256 int Alloc_Local(XrdOssCreateInfo &, XrdOucEnv &); 00257 int BreakLink(const char *local_path, struct stat &statbuff); 00258 int CalcTime(); 00259 int CalcTime(XrdOssStage_Req *req); 00260 int SetFattr(XrdOssCreateInfo &crInfo, int datfd, time_t mtime); 00261 void doScrub(); 00262 int Find(XrdOssStage_Req *req, void *carg); 00263 int getCname(const char *path, struct stat *sbuff, char *cgbuff); 00264 int getStats(char *buff, int blen); 00265 int GetFile(XrdOssStage_Req *req); 00266 int getID(const char *, XrdOucEnv &, char *, int); 00267 time_t HasFile(const char *fn, const char *sfx, time_t *mTime=0); 00268 int Stage_QT(const char *, const char *, XrdOucEnv &, int, mode_t); 00269 int Stage_RT(const char *, const char *, XrdOucEnv &, unsigned long long); 00270 00271 // Configuration related methods 00272 // 00273 void ConfigMio(XrdSysError &Eroute); 00274 int ConfigN2N(XrdSysError &Eroute); 00275 int ConfigProc(XrdSysError &Eroute); 00276 void ConfigSpace(); 00277 void ConfigSpace(const char *Lfn); 00278 void ConfigSpath(XrdSysError &Eroute, const char *Pn, 00279 unsigned long long &Fv, int noMSS); 00280 int ConfigStage(XrdSysError &Eroute); 00281 int ConfigStageC(XrdSysError &Eroute); 00282 void ConfigStats(XrdSysError &Eroute); 00283 void ConfigStats(dev_t Devnum, char *lP); 00284 int ConfigXeq(char *, XrdOucStream &, XrdSysError &); 00285 void List_Path(const char *, const char *, unsigned long long, XrdSysError &); 00286 int xalloc(XrdOucStream &Config, XrdSysError &Eroute); 00287 int xcache(XrdOucStream &Config, XrdSysError &Eroute); 00288 int xcompdct(XrdOucStream &Config, XrdSysError &Eroute); 00289 int xcachescan(XrdOucStream &Config, XrdSysError &Eroute); 00290 int xdefault(XrdOucStream &Config, XrdSysError &Eroute); 00291 int xfdlimit(XrdOucStream &Config, XrdSysError &Eroute); 00292 int xmaxsz(XrdOucStream &Config, XrdSysError &Eroute); 00293 int xmemf(XrdOucStream &Config, XrdSysError &Eroute); 00294 int xnml(XrdOucStream &Config, XrdSysError &Eroute); 00295 int xpath(XrdOucStream &Config, XrdSysError &Eroute); 00296 int xspace(XrdOucStream &Config, XrdSysError &Eroute, int *isCD=0); 00297 int xspaceBuild(char *grp, char *fn, int isxa, XrdSysError &Eroute); 00298 int xstg(XrdOucStream &Config, XrdSysError &Eroute); 00299 int xusage(XrdOucStream &Config, XrdSysError &Eroute); 00300 int xtrace(XrdOucStream &Config, XrdSysError &Eroute); 00301 int xxfr(XrdOucStream &Config, XrdSysError &Eroute); 00302 00303 // Mass storage related methods 00304 // 00305 int tranmode(char *); 00306 int MSS_Xeq(XrdOucStream **xfd, int okerr, 00307 const char *cmd, const char *arg1=0, const char *arg2=0); 00308 00309 // Other methods 00310 // 00311 int RenameLink(char *old_path, char *new_path); 00312 int RenameLink2(int Llen, char *oLnk, char *old_path, 00313 char *nLnk, char *new_path); 00314 int RenameLink3(char *cPath, char *old_path, char *new_path); 00315 }; 00316 00317 /******************************************************************************/ 00318 /* A P I S p e c i f i c D e f i n e s */ 00319 /******************************************************************************/ 00320 00321 // The Check_RO macro is valid only for XrdOssSys objects. 00322 // 00323 #define Check_RO(act, flags, path, opname) \ 00324 XRDEXP_REMOTE & (flags = PathOpts(path)); \ 00325 if (flags & XRDEXP_NOTRW) \ 00326 return OssEroute.Emsg(#act, -XRDOSS_E8005, opname, path) 00327 #endif