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