xrootd
XrdCmsNode.hh
Go to the documentation of this file.
00001 #ifndef __CMS_NODE__H
00002 #define __CMS_NODE__H
00003 /******************************************************************************/
00004 /*                                                                            */
00005 /*                         X r d C m s N o d e . h h                          */
00006 /*                                                                            */
00007 /* (c) 2007 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-AC02-76-SFO0515 with the Department of Energy              */
00011 /******************************************************************************/
00012 
00013 #include <string.h>
00014 #include <unistd.h>
00015 #include <sys/uio.h>
00016   
00017 #include "Xrd/XrdLink.hh"
00018 #include "XrdCms/XrdCmsTypes.hh"
00019 #include "XrdCms/XrdCmsRRQ.hh"
00020 #include "XrdSys/XrdSysPthread.hh"
00021 
00022 class XrdCmsBaseFR;
00023 class XrdCmsBaseFS;
00024 class XrdCmsDrop;
00025 class XrdCmsPrepArgs;
00026 class XrdCmsRRData;
00027 class XrdCmsSelected;
00028 class XrdOucProg;
00029 
00030 class XrdCmsNode
00031 {
00032 friend class XrdCmsCluster;
00033 public:
00034        char  *Ident;        // -> role hostname
00035        char   isDisable;    //0 Set via admin command to temporarily remove node
00036        char   isOffline;    //1 Set when a link failure occurs
00037        char   isNoStage;    //2 Set upon a nostage event
00038        char   isMan;        //3 Set when node acts as manager
00039        char   isPeer;       //4 Set when node acts as peer manager
00040        char   isProxy;      //5 Set when node acts as a proxy
00041        char   isSuspend;    //6 Set upon a suspend event
00042        char   isBound;      //7 Set when node is in the configuration
00043        char   isRW;         //0 Set when node can write or stage data
00044        char   isKnown;      //1 Set when we have recieved a "state"
00045        char   isConn;       //2 Set when node is network connected
00046        char   isGone;       //3 Set when node must be deleted
00047        char   isPerm;       //4 Set when node is permanently bound
00048        char   isReserved[2];
00049        char   RoleID;       // The converted XrdCmsRole::RoleID
00050 
00051 static const char allowsRW = 0x01; // in isRW -> Server allows r/w access
00052 static const char allowsSS = 0x02; // in isRW -> Server can stage data
00053 
00054 unsigned int    DiskTotal;    // Total disk space in GB
00055          int    DiskNums;     // Number of file systems
00056          int    DiskMinF;     // Minimum MB needed for selection
00057          int    DiskFree;     // Largest free MB
00058          int    DiskUtil;     // Total disk utilization
00059 unsigned int    ConfigID;     // Configuration identifier
00060 
00061 const  char  *do_Avail(XrdCmsRRData &Arg);
00062 const  char  *do_Chmod(XrdCmsRRData &Arg);
00063 const  char  *do_Disc(XrdCmsRRData &Arg);
00064 const  char  *do_Gone(XrdCmsRRData &Arg);
00065 const  char  *do_Have(XrdCmsRRData &Arg);
00066 const  char  *do_Load(XrdCmsRRData &Arg);
00067 const  char  *do_Locate(XrdCmsRRData &Arg);
00068 static int    do_LocFmt(char *buff, XrdCmsSelected *sP, SMask_t pf, SMask_t wf);
00069 const  char  *do_Mkdir(XrdCmsRRData &Arg);
00070 const  char  *do_Mkpath(XrdCmsRRData &Arg);
00071 const  char  *do_Mv(XrdCmsRRData &Arg);
00072 const  char  *do_Ping(XrdCmsRRData &Arg);
00073 const  char  *do_Pong(XrdCmsRRData &Arg);
00074 const  char  *do_PrepAdd(XrdCmsRRData &Arg);
00075 const  char  *do_PrepDel(XrdCmsRRData &Arg);
00076 const  char  *do_Rm(XrdCmsRRData &Arg);
00077 const  char  *do_Rmdir(XrdCmsRRData &Arg);
00078 const  char  *do_Select(XrdCmsRRData &Arg);
00079 static int    do_SelPrep(XrdCmsPrepArgs &Arg);
00080 const  char  *do_Space(XrdCmsRRData &Arg);
00081 const  char  *do_State(XrdCmsRRData &Arg);
00082 static void   do_StateDFS(XrdCmsBaseFR *rP, int rc);
00083        int    do_StateFWD(XrdCmsRRData &Arg);
00084 const  char  *do_StatFS(XrdCmsRRData &Arg);
00085 const  char  *do_Stats(XrdCmsRRData &Arg);
00086 const  char  *do_Status(XrdCmsRRData &Arg);
00087 const  char  *do_Trunc(XrdCmsRRData &Arg);
00088 const  char  *do_Try(XrdCmsRRData &Arg);
00089 const  char  *do_Update(XrdCmsRRData &Arg);
00090 const  char  *do_Usage(XrdCmsRRData &Arg);
00091 
00092        void   Disc(const char *reason=0, int needLock=1);
00093 
00094 inline int    ID(int &INum) {INum = Instance; return NodeID;}
00095 
00096 inline int    Inst() {return Instance;}
00097 
00098 inline int    isNode(SMask_t smask) {return (smask & NodeMask) != 0;}
00099 inline int    isNode(const char *hn)
00100                     {return Link && !strcmp(Link->Host(), hn);}
00101 inline int    isNode(unsigned int ipa)
00102                     {return ipa == IPAddr;}
00103 inline int    isNode(unsigned int ipa, const char *nid)
00104                     {return ipa == IPAddr && (nid ? !strcmp(myNID, nid) : 1);}
00105 inline char  *Name()   {return (myName ? myName : (char *)"?");}
00106 
00107 inline char  *Name(int &len, int &port)
00108                        {len = myNlen; port = Port; return myName;}
00109 
00110 inline SMask_t Mask() {return NodeMask;}
00111 
00112 inline void    Lock() {myMutex.Lock(); isLocked = 1;}
00113 inline void  UnLock() {isLocked = 0; myMutex.UnLock();}
00114 
00115 static void  Report_Usage(XrdLink *lp);
00116 
00117 inline int   Send(const char *buff, int blen=0)
00118                  {return (isOffline ? -1 : Link->Send(buff, blen));}
00119 inline int   Send(const struct iovec *iov, int iovcnt, int iotot=0)
00120                  {return (isOffline ? -1 : Link->Send(iov, iovcnt, iotot));}
00121 
00122        void  setName(XrdLink *lnkp, int port);
00123 
00124        void  setShare(int shrval)
00125                      {if (shrval > 99) Shrem = Shrip = Share = 0;
00126                          else {Shrem = Share = shrval; Shrip = 100 - shrval;}
00127                      }
00128 
00129 inline void  setSlot(short rslot) {RSlot = rslot;}
00130 inline short getSlot() {return RSlot;}
00131 
00132        void  SyncSpace();
00133 
00134              XrdCmsNode(XrdLink *lnkp, int port=0,
00135                         const char *sid=0, int lvl=0, int id=-1);
00136             ~XrdCmsNode();
00137 
00138 private:
00139 static const int fsL2PFail1 = 999991;
00140 static const int fsL2PFail2 = 999992;
00141 
00142        int   fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0);
00143 const  char *fsFail(const char *Who, const char *What, const char *Path, int rc);
00144        int   getMode(const char *theMode, mode_t &Mode);
00145        int   getSize(const char *theSize, long long &Size);
00146 
00147 XrdSysMutex        myMutex;
00148 XrdLink           *Link;
00149 unsigned int       IPAddr;
00150 XrdCmsNode        *Next;
00151 time_t             DropTime;
00152 XrdCmsDrop        *DropJob;  
00153 int                IPV6Len;  // 12345678901234567890123456
00154 char               IPV6[28]; // [::123.123.123.123]:123456
00155 
00156 SMask_t            NodeMask;
00157 int                NodeID;
00158 int                Instance;
00159 int                Port;
00160 int                myLevel;
00161 int                myCNUM;
00162 char              *myCID;
00163 char              *myNID;
00164 char              *myName;
00165 int                myNlen;
00166 
00167 int                logload;
00168 int                myCost;       // Overall cost (determined by location)
00169 int                myLoad;       // Overall load
00170 int                myMass;       // Overall load including space utilization
00171 int                RefW;         // Number of times used for writing
00172 int                RefTotW;
00173 int                RefR;         // Number of times used for redirection
00174 int                RefTotR;
00175 short              RSlot;
00176 char               isLocked;
00177 char               Share;        // Share of requests for this node (0 -> n/a)
00178 char               Shrem;        // Share of requests left
00179 char               Shrip;        // Share of requests to skip
00180 char               Rsvd[2];
00181 int                Shrin;        // Share intervals used
00182 
00183 // The following fields are used to keep the supervisor's free space value
00184 //
00185 static XrdSysMutex mlMutex;
00186 static int         LastFree;
00187 };
00188 #endif