xrootd
XrdCmsNode.hh
Go to the documentation of this file.
1 #ifndef __CMS_NODE__H
2 #define __CMS_NODE__H
3 /******************************************************************************/
4 /* */
5 /* X r d C m s N o d e . h h */
6 /* */
7 /* (c) 2007 by the Board of Trustees of the Leland Stanford, Jr., University */
8 /* All Rights Reserved */
9 /* Produced by Andrew Hanushevsky for Stanford University under contract */
10 /* DE-AC02-76-SFO0515 with the Department of Energy */
11 /* */
12 /* This file is part of the XRootD software suite. */
13 /* */
14 /* XRootD is free software: you can redistribute it and/or modify it under */
15 /* the terms of the GNU Lesser General Public License as published by the */
16 /* Free Software Foundation, either version 3 of the License, or (at your */
17 /* option) any later version. */
18 /* */
19 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */
20 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
21 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
22 /* License for more details. */
23 /* */
24 /* You should have received a copy of the GNU Lesser General Public License */
25 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
26 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
27 /* */
28 /* The copyright holder's institutional names and contributor's names may not */
29 /* be used to endorse or promote products derived from this software without */
30 /* specific prior written permission of the institution or contributor. */
31 /******************************************************************************/
32 
33 #include <string.h>
34 #include <unistd.h>
35 #include <netinet/in.h>
36 #include <sys/uio.h>
37 
38 #include "Xrd/XrdLink.hh"
39 #include "XrdCms/XrdCmsTypes.hh"
40 #include "XrdCms/XrdCmsRRQ.hh"
41 #include "XrdNet/XrdNetIF.hh"
42 #include "XrdNet/XrdNetAddr.hh"
43 #include "XrdSys/XrdSysPthread.hh"
44 
45 class XrdCmsBaseFR;
46 class XrdCmsBaseFS;
47 class XrdCmsClustID;
48 class XrdCmsDrop;
49 class XrdCmsManager;
50 class XrdCmsPrepArgs;
51 class XrdCmsRRData;
52 class XrdCmsSelect;
53 class XrdCmsSelected;
54 class XrdOucProg;
55 
57 {
58 friend class XrdCmsCluster;
59 public:
60  char *Ident; // -> role hostname
61  char hasNet; //0 Network selection mask
62  char isBad; //1 Set on an event that makes it unselectable
63  char isOffline; //2 Set when a link failure occurs
64  char isRW; //3 Set when node can write or stage data
65  char isNoStage; //4 Set upon a nostage event
66  char isMan; //5 Set when node acts as manager
67  char isPeer; //6 Set when node acts as peer manager
68  char isBound; //7 Set when node is in the configuration
69  char isKnown; //0 Set when we have recieved a "state"
70  char isConn; //1 Set when node is network connected
71  char isGone; //2 Set when node must be deleted
72  char isPerm; //3 Set when node is permanently bound
73  char incUL; //4 Set when unlock count nedds to be incremented
74  char RoleID; //5 The converted XrdCmsRole::RoleID
75  char TimeZone; //6 Time zone in +UTC-
76  char TZValid; //7 Time zone has been set
77 
78 static const char isBlisted = 0x01; // in isBad -> Node is black listed
79 static const char isDisabled = 0x02; // in isBad -> Node is disable (internal)
80 static const char isSuspend = 0x04; // in isBad -> Node is suspended via event
81 static const char isDoomed = 0x08; // in isBad -> Node socket must be closed
82 
83 static const char allowsRW = 0x01; // in isRW -> Server allows r/w access
84 static const char allowsSS = 0x02; // in isRW -> Server can stage data
85 
86 unsigned int DiskTotal; // Total disk space in GB
87  int DiskNums; // Number of file systems
88  int DiskMinF; // Minimum MB needed for selection
89  int DiskFree; // Largest free MB
90  int DiskUtil; // Total disk utilization
91 unsigned int ConfigID; // Configuration identifier
92 
93 const char *do_Avail(XrdCmsRRData &Arg);
94 const char *do_Chmod(XrdCmsRRData &Arg);
95 const char *do_Disc(XrdCmsRRData &Arg);
96 const char *do_Gone(XrdCmsRRData &Arg);
97 const char *do_Have(XrdCmsRRData &Arg);
98 const char *do_Load(XrdCmsRRData &Arg);
99 const char *do_Locate(XrdCmsRRData &Arg);
100 static int do_LocFmt(char *buff, XrdCmsSelected *sP,
101  SMask_t pf, SMask_t wf,
102  bool lsall=false, bool lsuniq=false);
103 const char *do_Mkdir(XrdCmsRRData &Arg);
104 const char *do_Mkpath(XrdCmsRRData &Arg);
105 const char *do_Mv(XrdCmsRRData &Arg);
106 const char *do_Ping(XrdCmsRRData &Arg);
107 const char *do_Pong(XrdCmsRRData &Arg);
108 const char *do_PrepAdd(XrdCmsRRData &Arg);
109 const char *do_PrepDel(XrdCmsRRData &Arg);
110 const char *do_Rm(XrdCmsRRData &Arg);
111 const char *do_Rmdir(XrdCmsRRData &Arg);
112  int do_SelAvoid(XrdCmsRRData &Arg, XrdCmsSelect &Sel,
113  char *Avoid, bool &doRedir);
114 const char *do_Select(XrdCmsRRData &Arg);
115 static int do_SelPrep(XrdCmsPrepArgs &Arg);
116 const char *do_Space(XrdCmsRRData &Arg);
117 const char *do_State(XrdCmsRRData &Arg);
118 static void do_StateDFS(XrdCmsBaseFR *rP, int rc);
119  int do_StateFWD(XrdCmsRRData &Arg);
120 const char *do_StatFS(XrdCmsRRData &Arg);
121 const char *do_Stats(XrdCmsRRData &Arg);
122 const char *do_Status(XrdCmsRRData &Arg);
123 const char *do_Trunc(XrdCmsRRData &Arg);
124 const char *do_Try(XrdCmsRRData &Arg);
125 const char *do_Update(XrdCmsRRData &Arg);
126 const char *do_Usage(XrdCmsRRData &Arg);
127 
128  void Delete(XrdSysMutex &gMutex);
129 
130  void Disc(const char *reason=0, int needLock=1);
131 
132 inline int ID(int &INum) {INum = Instance; return NodeID;}
133 
134 inline int Inst() {return Instance;}
135 
136  bool inDomain() {return netIF.InDomain(&netID);}
137 
138 inline int isNode(SMask_t smask) {return (smask & NodeMask) != 0;}
139 
140 inline int isNode(const XrdNetAddr *addr) // Only for avoid processing!
141  {return netID.Same(addr);}
142 
143 inline int isNode(XrdLink *lp, const char *nid, int port)
144  {if (nid)
145  {if (strcmp(myNID, nid)) return 0;
146  if (*nid == '*') return 1;
147  }
148  return netID.Same(lp->NetAddr()) && port == netIF.Port();
149  }
150 
151 inline char *Name() {return (myName ? myName : (char *)"?");}
152 
153 inline SMask_t Mask() {return NodeMask;}
154 
155 inline void g2Ref(XrdSysMutex &gMutex) {lkCount++; gMutex.UnLock();}
156 
157 inline void Ref2g(XrdSysMutex &gMutex) {gMutex.Lock(); lkCount--;}
158 
159 inline void g2nLock(XrdSysMutex &gMutex)
160  {lkCount++; // gMutex must be held
161  gMutex.UnLock(); // Safe because lkCount != ulCount
162  nodeMutex.Lock(); // Downgrade to node lock
163  incUL = 1;
164  isLocked = 1;
165  }
166 
167 inline void n2gLock(XrdSysMutex &gMutex)
168  {isLocked = 0;
169  if (incUL)
170  {ulCount++; incUL = 0;
171  if (isGone) nodeMutex.Signal();
172  }
173  nodeMutex.UnLock(); // Release this node
174  gMutex.Lock(); // Upgade to global mutex
175  }
176 
177 inline void Lock(bool doinc)
178  {if (!doinc) nodeMutex.Lock();
179  else {lkCount++; // Global lock must be held
180  nodeMutex.Lock();
181  incUL = 1;
182  }
183  isLocked = 1;
184  }
185 inline void UnLock() {isLocked = 0;
186  if (incUL)
187  {ulCount++; incUL = 0;
188  if (isGone) nodeMutex.Signal();
189  }
190  nodeMutex.UnLock();
191  }
192 
193 static void Report_Usage(XrdLink *lp);
194 
195 inline int Send(const char *buff, int blen=0)
196  {return (isOffline ? -1 : Link->Send(buff, blen));}
197 inline int Send(const struct iovec *iov, int iovcnt, int iotot=0)
198  {return (isOffline ? -1 : Link->Send(iov, iovcnt, iotot));}
199 
200  void setManager(XrdCmsManager *mP) {Manager = mP;}
201 
202  void setName(XrdLink *lnkp, const char *theIF, int port);
203 
204  void setShare(int shrval)
205  {if (shrval > 99) Shrem = Shrip = Share = 0;
206  else {Shrem = Share = shrval; Shrip = 100 - shrval;}
207  }
208 
209  int setTZone(int tZone)
210  {TimeZone = tZone & 0x0f;
211  if (tZone & 0x10) TimeZone = -TimeZone;
212  TZValid = (tZone != 0);
213  return TimeZone;
214  }
215 
216  void setVersion(unsigned short vnum) {myVersion = vnum;}
217 
218 inline void setSlot(short rslot) {RSlot = rslot;}
219 inline short getSlot() {return RSlot;}
220 
221 inline void ShowIF() {netIF.Display("=====> ");}
222 
223  void SyncSpace();
224 
225  XrdCmsNode(XrdLink *lnkp, const char *theIF=0, const char *sid=0,
226  int port=0, int lvl=0, int id=-1);
227  ~XrdCmsNode();
228 
229 private:
230 static const int fsL2PFail1 = 999991;
231 static const int fsL2PFail2 = 999992;
232 
233  void DeleteWarn(XrdSysMutex &gMutex, unsigned int &lkVal);
234  int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0);
235 const char *fsFail(const char *Who, const char *What, const char *Path, int rc);
236  int getMode(const char *theMode, mode_t &Mode);
237  int getSize(const char *theSize, long long &Size);
238 
240 unsigned int lkCount; // Only Modified with global lock held
241 unsigned int ulCount; // Only Modified with node lock held
242 
248 time_t DropTime;
250 
253 int NodeID;
256 short subsPort; // Subscription port number
257 unsigned short myVersion;
258 char *myCID;
259 char *myNID;
260 char *myName;
261 int myNlen;
262 
264 int myCost; // Overall cost (determined by location)
265 int myLoad; // Overall load
266 int myMass; // Overall load including space utilization
267 int RefW; // Number of times used for writing
269 int RefR; // Number of times used for redirection
271 short RSlot;
272 char isLocked;
273 char Share; // Share of requests for this node (0 -> n/a)
274 char Shrem; // Share of requests left
275 char Shrip; // Share of requests to skip
276 char Rsvd[2];
277 int Shrin; // Share intervals used
278 
279 // The following fields are used to keep the supervisor's free space value
280 //
282 static int LastFree;
283 };
284 #endif
unsigned int ConfigID
Definition: XrdCmsNode.hh:91
int RefTotW
Definition: XrdCmsNode.hh:268
const char * do_Trunc(XrdCmsRRData &Arg)
int do_SelAvoid(XrdCmsRRData &Arg, XrdCmsSelect &Sel, char *Avoid, bool &doRedir)
short subsPort
Definition: XrdCmsNode.hh:256
Definition: XrdCmsManager.hh:55
char * Ident
Definition: XrdCmsNode.hh:60
XrdCmsNode(XrdLink *lnkp, const char *theIF=0, const char *sid=0, int port=0, int lvl=0, int id=-1)
Definition: XrdCmsPrepArgs.hh:40
void SyncSpace()
static int do_SelPrep(XrdCmsPrepArgs &Arg)
char TimeZone
Definition: XrdCmsNode.hh:75
int myLevel
Definition: XrdCmsNode.hh:255
const char * do_Status(XrdCmsRRData &Arg)
char isNoStage
Definition: XrdCmsNode.hh:65
const char * do_Mkpath(XrdCmsRRData &Arg)
short getSlot()
Definition: XrdCmsNode.hh:219
Definition: XrdCmsCluster.hh:113
void setVersion(unsigned short vnum)
Definition: XrdCmsNode.hh:216
const char * do_Rmdir(XrdCmsRRData &Arg)
void Disc(const char *reason=0, int needLock=1)
Definition: XrdCmsClustID.hh:40
char isKnown
Definition: XrdCmsNode.hh:69
const char * do_Pong(XrdCmsRRData &Arg)
static const int fsL2PFail1
Definition: XrdCmsNode.hh:230
int myNlen
Definition: XrdCmsNode.hh:261
void setShare(int shrval)
Definition: XrdCmsNode.hh:204
char isConn
Definition: XrdCmsNode.hh:70
void g2nLock(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:159
Definition: XrdCmsSelect.hh:101
int Same(const XrdNetAddrInfo *ipAddr, bool plusPort=false)
int Send(const struct iovec *iov, int iovcnt, int iotot=0)
Definition: XrdCmsNode.hh:197
int isNode(XrdLink *lp, const char *nid, int port)
Definition: XrdCmsNode.hh:143
const char * do_Ping(XrdCmsRRData &Arg)
void n2gLock(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:167
char * myCID
Definition: XrdCmsNode.hh:258
char Shrem
Definition: XrdCmsNode.hh:274
int isNode(const XrdNetAddr *addr)
Definition: XrdCmsNode.hh:140
short RSlot
Definition: XrdCmsNode.hh:271
static const char allowsRW
Definition: XrdCmsNode.hh:83
void DeleteWarn(XrdSysMutex &gMutex, unsigned int &lkVal)
int Inst()
Definition: XrdCmsNode.hh:134
int RefR
Definition: XrdCmsNode.hh:269
int RefTotR
Definition: XrdCmsNode.hh:270
const char * do_Chmod(XrdCmsRRData &Arg)
Definition: XrdNetIF.hh:48
int setTZone(int tZone)
Definition: XrdCmsNode.hh:209
int do_StateFWD(XrdCmsRRData &Arg)
int DiskNums
Definition: XrdCmsNode.hh:87
static bool InDomain(XrdNetAddrInfo *epaddr)
void Signal()
Definition: XrdSysPthread.hh:84
XrdNetAddr netID
Definition: XrdCmsNode.hh:244
Definition: XrdCmsBaseFS.hh:48
int myMass
Definition: XrdCmsNode.hh:266
char isBound
Definition: XrdCmsNode.hh:68
void setManager(XrdCmsManager *mP)
Definition: XrdCmsNode.hh:200
XrdCmsClustID * cidP
Definition: XrdCmsNode.hh:251
XrdCmsManager * Manager
Definition: XrdCmsNode.hh:246
int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0)
void Delete(XrdSysMutex &gMutex)
const char * do_Try(XrdCmsRRData &Arg)
Definition: XrdNetAddr.hh:41
char Rsvd[2]
Definition: XrdCmsNode.hh:276
static int do_LocFmt(char *buff, XrdCmsSelected *sP, SMask_t pf, SMask_t wf, bool lsall=false, bool lsuniq=false)
int myCost
Definition: XrdCmsNode.hh:264
unsigned int ulCount
Definition: XrdCmsNode.hh:241
const char * do_PrepAdd(XrdCmsRRData &Arg)
unsigned int lkCount
Definition: XrdCmsNode.hh:240
void setSlot(short rslot)
Definition: XrdCmsNode.hh:218
int Shrin
Definition: XrdCmsNode.hh:277
int RefW
Definition: XrdCmsNode.hh:267
int Instance
Definition: XrdCmsNode.hh:254
Definition: XrdSysPthread.hh:165
char RoleID
Definition: XrdCmsNode.hh:74
unsigned int DiskTotal
Definition: XrdCmsNode.hh:86
static XrdSysMutex mlMutex
Definition: XrdCmsNode.hh:281
const char * do_Avail(XrdCmsRRData &Arg)
const char * do_Space(XrdCmsRRData &Arg)
Definition: XrdOucIOVec.hh:65
const char * fsFail(const char *Who, const char *What, const char *Path, int rc)
char incUL
Definition: XrdCmsNode.hh:73
int Port()
Definition: XrdNetIF.hh:276
SMask_t NodeMask
Definition: XrdCmsNode.hh:252
const char * do_Mv(XrdCmsRRData &Arg)
static const char allowsSS
Definition: XrdCmsNode.hh:84
int getSize(const char *theSize, long long &Size)
char isPeer
Definition: XrdCmsNode.hh:67
Definition: XrdSysPthread.hh:78
Definition: XrdOucProg.hh:37
unsigned short myVersion
Definition: XrdCmsNode.hh:257
char TZValid
Definition: XrdCmsNode.hh:76
Definition: XrdCmsRRData.hh:51
Definition: XrdCmsBaseFS.hh:87
XrdCmsNode * Next
Definition: XrdCmsNode.hh:247
const char * do_PrepDel(XrdCmsRRData &Arg)
unsigned long long SMask_t
Definition: XrdCmsTypes.hh:33
int getMode(const char *theMode, mode_t &Mode)
SMask_t Mask()
Definition: XrdCmsNode.hh:153
const char * do_Select(XrdCmsRRData &Arg)
const char * do_Mkdir(XrdCmsRRData &Arg)
int DiskFree
Definition: XrdCmsNode.hh:89
char isOffline
Definition: XrdCmsNode.hh:63
int NodeID
Definition: XrdCmsNode.hh:253
const char * do_Usage(XrdCmsRRData &Arg)
XrdSysCondVar nodeMutex
Definition: XrdCmsNode.hh:239
void setName(XrdLink *lnkp, const char *theIF, int port)
static int LastFree
Definition: XrdCmsNode.hh:282
const char * do_State(XrdCmsRRData &Arg)
char isPerm
Definition: XrdCmsNode.hh:72
char * myNID
Definition: XrdCmsNode.hh:259
static void Report_Usage(XrdLink *lp)
XrdCmsDrop * DropJob
Definition: XrdCmsNode.hh:249
const char * do_Gone(XrdCmsRRData &Arg)
const char * do_StatFS(XrdCmsRRData &Arg)
char Shrip
Definition: XrdCmsNode.hh:275
char * myName
Definition: XrdCmsNode.hh:260
const char * do_Update(XrdCmsRRData &Arg)
void Lock(bool doinc)
Definition: XrdCmsNode.hh:177
const char * do_Load(XrdCmsRRData &Arg)
const char * do_Locate(XrdCmsRRData &Arg)
XrdNetIF netIF
Definition: XrdCmsNode.hh:245
const char * do_Have(XrdCmsRRData &Arg)
time_t DropTime
Definition: XrdCmsNode.hh:248
char * Name()
Definition: XrdCmsNode.hh:151
char isRW
Definition: XrdCmsNode.hh:64
void Lock()
Definition: XrdSysPthread.hh:222
void Ref2g(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:157
const char * do_Stats(XrdCmsRRData &Arg)
bool inDomain()
Definition: XrdCmsNode.hh:136
static const char isDoomed
Definition: XrdCmsNode.hh:81
static const char isSuspend
Definition: XrdCmsNode.hh:80
static const char isBlisted
Definition: XrdCmsNode.hh:78
int Send(const char *buff, int blen=0)
Definition: XrdCmsNode.hh:195
static const char isDisabled
Definition: XrdCmsNode.hh:79
char isMan
Definition: XrdCmsNode.hh:66
void ShowIF()
Definition: XrdCmsNode.hh:221
static void do_StateDFS(XrdCmsBaseFR *rP, int rc)
friend class XrdCmsDrop
Definition: XrdCmsCluster.hh:116
void UnLock()
Definition: XrdSysPthread.hh:94
char isGone
Definition: XrdCmsNode.hh:71
Definition: XrdCmsNode.hh:56
int DiskUtil
Definition: XrdCmsNode.hh:90
int logload
Definition: XrdCmsNode.hh:263
void UnLock()
Definition: XrdCmsNode.hh:185
char isLocked
Definition: XrdCmsNode.hh:272
void Display(const char *pfx="=====> ")
void g2Ref(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:155
void UnLock()
Definition: XrdSysPthread.hh:224
static const int fsL2PFail2
Definition: XrdCmsNode.hh:231
char isBad
Definition: XrdCmsNode.hh:62
Definition: XrdCmsSelect.hh:43
const char * do_Disc(XrdCmsRRData &Arg)
int ID(int &INum)
Definition: XrdCmsNode.hh:132
char hasNet
Definition: XrdCmsNode.hh:61
XrdLink * Link
Definition: XrdCmsNode.hh:243
void Lock()
Definition: XrdSysPthread.hh:82
int DiskMinF
Definition: XrdCmsNode.hh:88
int isNode(SMask_t smask)
Definition: XrdCmsNode.hh:138
const char * do_Rm(XrdCmsRRData &Arg)
int myLoad
Definition: XrdCmsNode.hh:265
char Share
Definition: XrdCmsNode.hh:273