|
xrootd
|
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
1.7.5