00001 #ifndef __CMS_NODE__H
00002 #define __CMS_NODE__H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <string.h>
00034 #include <unistd.h>
00035 #include <netinet/in.h>
00036 #include <sys/uio.h>
00037
00038 #include "Xrd/XrdLink.hh"
00039 #include "XrdCms/XrdCmsTypes.hh"
00040 #include "XrdCms/XrdCmsRRQ.hh"
00041 #include "XrdNet/XrdNetIF.hh"
00042 #include "XrdNet/XrdNetAddr.hh"
00043 #include "XrdSys/XrdSysPthread.hh"
00044
00045 class XrdCmsBaseFR;
00046 class XrdCmsBaseFS;
00047 class XrdCmsClustID;
00048 class XrdCmsDrop;
00049 class XrdCmsManager;
00050 class XrdCmsPrepArgs;
00051 class XrdCmsRRData;
00052 class XrdCmsSelect;
00053 class XrdCmsSelected;
00054 class XrdOucProg;
00055
00056 class XrdCmsNode
00057 {
00058 friend class XrdCmsCluster;
00059 public:
00060 char *Ident;
00061 char hasNet;
00062 char isBad;
00063 char isOffline;
00064 char isRW;
00065 char isNoStage;
00066 char isMan;
00067 char isPeer;
00068 char isBound;
00069 char isKnown;
00070 char isConn;
00071 char isGone;
00072 char isPerm;
00073 char incUL;
00074 char RoleID;
00075 char TimeZone;
00076 char TZValid;
00077
00078 static const char isBlisted = 0x01;
00079 static const char isDisabled = 0x02;
00080 static const char isSuspend = 0x04;
00081 static const char isDoomed = 0x08;
00082
00083 static const char allowsRW = 0x01;
00084 static const char allowsSS = 0x02;
00085
00086 unsigned int DiskTotal;
00087 int DiskNums;
00088 int DiskMinF;
00089 int DiskFree;
00090 int DiskUtil;
00091 unsigned int ConfigID;
00092
00093 const char *do_Avail(XrdCmsRRData &Arg);
00094 const char *do_Chmod(XrdCmsRRData &Arg);
00095 const char *do_Disc(XrdCmsRRData &Arg);
00096 const char *do_Gone(XrdCmsRRData &Arg);
00097 const char *do_Have(XrdCmsRRData &Arg);
00098 const char *do_Load(XrdCmsRRData &Arg);
00099 const char *do_Locate(XrdCmsRRData &Arg);
00100 static int do_LocFmt(char *buff, XrdCmsSelected *sP,
00101 SMask_t pf, SMask_t wf,
00102 bool lsall=false, bool lsuniq=false);
00103 const char *do_Mkdir(XrdCmsRRData &Arg);
00104 const char *do_Mkpath(XrdCmsRRData &Arg);
00105 const char *do_Mv(XrdCmsRRData &Arg);
00106 const char *do_Ping(XrdCmsRRData &Arg);
00107 const char *do_Pong(XrdCmsRRData &Arg);
00108 const char *do_PrepAdd(XrdCmsRRData &Arg);
00109 const char *do_PrepDel(XrdCmsRRData &Arg);
00110 const char *do_Rm(XrdCmsRRData &Arg);
00111 const char *do_Rmdir(XrdCmsRRData &Arg);
00112 int do_SelAvoid(XrdCmsRRData &Arg, XrdCmsSelect &Sel,
00113 char *Avoid, bool &doRedir);
00114 const char *do_Select(XrdCmsRRData &Arg);
00115 static int do_SelPrep(XrdCmsPrepArgs &Arg);
00116 const char *do_Space(XrdCmsRRData &Arg);
00117 const char *do_State(XrdCmsRRData &Arg);
00118 static void do_StateDFS(XrdCmsBaseFR *rP, int rc);
00119 int do_StateFWD(XrdCmsRRData &Arg);
00120 const char *do_StatFS(XrdCmsRRData &Arg);
00121 const char *do_Stats(XrdCmsRRData &Arg);
00122 const char *do_Status(XrdCmsRRData &Arg);
00123 const char *do_Trunc(XrdCmsRRData &Arg);
00124 const char *do_Try(XrdCmsRRData &Arg);
00125 const char *do_Update(XrdCmsRRData &Arg);
00126 const char *do_Usage(XrdCmsRRData &Arg);
00127
00128 void Delete(XrdSysMutex &gMutex);
00129
00130 void Disc(const char *reason=0, int needLock=1);
00131
00132 inline int ID(int &INum) {INum = Instance; return NodeID;}
00133
00134 inline int Inst() {return Instance;}
00135
00136 bool inDomain() {return netIF.InDomain(&netID);}
00137
00138 inline int isNode(SMask_t smask) {return (smask & NodeMask) != 0;}
00139
00140 inline int isNode(const XrdNetAddr *addr)
00141 {return netID.Same(addr);}
00142
00143 inline int isNode(XrdLink *lp, const char *nid, int port)
00144 {if (nid)
00145 {if (strcmp(myNID, nid)) return 0;
00146 if (*nid == '*') return 1;
00147 }
00148 return netID.Same(lp->NetAddr()) && port == netIF.Port();
00149 }
00150
00151 inline char *Name() {return (myName ? myName : (char *)"?");}
00152
00153 inline SMask_t Mask() {return NodeMask;}
00154
00155 inline void g2Ref(XrdSysMutex &gMutex) {lkCount++; gMutex.UnLock();}
00156
00157 inline void Ref2g(XrdSysMutex &gMutex) {gMutex.Lock(); lkCount--;}
00158
00159 inline void g2nLock(XrdSysMutex &gMutex)
00160 {lkCount++;
00161 gMutex.UnLock();
00162 nodeMutex.Lock();
00163 incUL = 1;
00164 isLocked = 1;
00165 }
00166
00167 inline void n2gLock(XrdSysMutex &gMutex)
00168 {isLocked = 0;
00169 if (incUL)
00170 {ulCount++; incUL = 0;
00171 if (isGone) nodeMutex.Signal();
00172 }
00173 nodeMutex.UnLock();
00174 gMutex.Lock();
00175 }
00176
00177 inline void Lock(bool doinc)
00178 {if (!doinc) nodeMutex.Lock();
00179 else {lkCount++;
00180 nodeMutex.Lock();
00181 incUL = 1;
00182 }
00183 isLocked = 1;
00184 }
00185 inline void UnLock() {isLocked = 0;
00186 if (incUL)
00187 {ulCount++; incUL = 0;
00188 if (isGone) nodeMutex.Signal();
00189 }
00190 nodeMutex.UnLock();
00191 }
00192
00193 static void Report_Usage(XrdLink *lp);
00194
00195 inline int Send(const char *buff, int blen=0)
00196 {return (isOffline ? -1 : Link->Send(buff, blen));}
00197 inline int Send(const struct iovec *iov, int iovcnt, int iotot=0)
00198 {return (isOffline ? -1 : Link->Send(iov, iovcnt, iotot));}
00199
00200 void setManager(XrdCmsManager *mP) {Manager = mP;}
00201
00202 void setName(XrdLink *lnkp, const char *theIF, int port);
00203
00204 void setShare(int shrval)
00205 {if (shrval > 99) Shrem = Shrip = Share = 0;
00206 else {Shrem = Share = shrval; Shrip = 100 - shrval;}
00207 }
00208
00209 int setTZone(int tZone)
00210 {TimeZone = tZone & 0x0f;
00211 if (tZone & 0x10) TimeZone = -TimeZone;
00212 TZValid = (tZone != 0);
00213 return TimeZone;
00214 }
00215
00216 void setVersion(unsigned short vnum) {myVersion = vnum;}
00217
00218 inline void setSlot(short rslot) {RSlot = rslot;}
00219 inline short getSlot() {return RSlot;}
00220
00221 inline void ShowIF() {netIF.Display("=====> ");}
00222
00223 void SyncSpace();
00224
00225 XrdCmsNode(XrdLink *lnkp, const char *theIF=0, const char *sid=0,
00226 int port=0, int lvl=0, int id=-1);
00227 ~XrdCmsNode();
00228
00229 private:
00230 static const int fsL2PFail1 = 999991;
00231 static const int fsL2PFail2 = 999992;
00232
00233 void DeleteWarn(XrdSysMutex &gMutex, unsigned int &lkVal);
00234 int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0);
00235 const char *fsFail(const char *Who, const char *What, const char *Path, int rc);
00236 int getMode(const char *theMode, mode_t &Mode);
00237 int getSize(const char *theSize, long long &Size);
00238
00239 XrdSysCondVar nodeMutex;
00240 unsigned int lkCount;
00241 unsigned int ulCount;
00242
00243 XrdLink *Link;
00244 XrdNetAddr netID;
00245 XrdNetIF netIF;
00246 XrdCmsManager *Manager;
00247 XrdCmsNode *Next;
00248 time_t DropTime;
00249 XrdCmsDrop *DropJob;
00250
00251 XrdCmsClustID *cidP;
00252 SMask_t NodeMask;
00253 int NodeID;
00254 int Instance;
00255 int myLevel;
00256 short subsPort;
00257 unsigned short myVersion;
00258 char *myCID;
00259 char *myNID;
00260 char *myName;
00261 int myNlen;
00262
00263 int logload;
00264 int myCost;
00265 int myLoad;
00266 int myMass;
00267 int RefW;
00268 int RefTotW;
00269 int RefR;
00270 int RefTotR;
00271 short RSlot;
00272 char isLocked;
00273 char Share;
00274 char Shrem;
00275 char Shrip;
00276 char Rsvd[2];
00277 int Shrin;
00278
00279
00280
00281 static XrdSysMutex mlMutex;
00282 static int LastFree;
00283 };
00284 #endif