xrootd

XrdOssApi.hh

Go to the documentation of this file.
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