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 <cstring>
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 #include "XrdSys/XrdSysRAtomic.hh"
45 
46 class XrdCmsBaseFR;
47 class XrdCmsBaseFS;
48 class XrdCmsClustID;
49 class XrdCmsDrop;
50 class XrdCmsManager;
51 class XrdCmsPrepArgs;
52 class XrdCmsRRData;
53 class XrdCmsSelect;
54 class XrdCmsSelected;
55 class XrdOucProg;
56 
58 {
59 friend class XrdCmsCluster;
60 public:
61  char *Ident = 0; // -> role hostname
62  char hasNet = 0; //0 Network selection mask
63  char isBad = 0; //1 Set on an event that makes it unselectable
64  char isOffline; //2 Set when a link failure occurs (constructor)
65  char isRW = 0; //3 Set when node can write or stage data
66  char isNoStage = 0; //4 Set upon a nostage event
67  char isMan = 0; //5 Set when node acts as manager
68  char isPeer = 0; //6 Set when node acts as peer manager
69  char isBound = 0; //7 Set when node is in the configuration
70  char isKnown = 0; //0 Set when we have recieved a "state"
71  char isConn = 0; //1 Set when node is network connected
72  char isGone = 0; //2 Set when node must be deleted
73  char isPerm = 0; //3 Set when node is permanently bound
74  char rsvd = 0; //4 Reserved
75  char RoleID = 0; //5 The converted XrdCmsRole::RoleID
76  char TimeZone = 0; //6 Time zone in +UTC-
77  char TZValid = 0; //7 Time zone has been set
78 
79 static const char isBlisted = 0x01; // in isBad -> Node is black listed
80 static const char isDisabled = 0x02; // in isBad -> Node is disable (internal)
81 static const char isSuspend = 0x04; // in isBad -> Node is suspended via event
82 static const char isDoomed = 0x08; // in isBad -> Node socket must be closed
83 
84 static const char allowsRW = 0x01; // in isRW -> Server allows r/w access
85 static const char allowsSS = 0x02; // in isRW -> Server can stage data
86 
87 unsigned int DiskTotal = 0;// Total disk space in GB
88  int DiskNums = 0;// Number of file systems
89  int DiskMinF = 0;// Minimum MB needed for selection
90  int DiskFree = 0;// Largest free MB
91  int DiskUtil = 0;// Total disk utilization
92 unsigned int ConfigID = 0;// Configuration identifier
93 
94 const char *do_Avail(XrdCmsRRData &Arg);
95 const char *do_Chmod(XrdCmsRRData &Arg);
96 const char *do_Disc(XrdCmsRRData &Arg);
97 const char *do_Gone(XrdCmsRRData &Arg);
98 const char *do_Have(XrdCmsRRData &Arg);
99 const char *do_Load(XrdCmsRRData &Arg);
100 const char *do_Locate(XrdCmsRRData &Arg);
101 static int do_LocFmt(char *buff, XrdCmsSelected *sP,
102  SMask_t pf, SMask_t wf,
103  bool lsall=false, bool lsuniq=false);
104 const char *do_Mkdir(XrdCmsRRData &Arg);
105 const char *do_Mkpath(XrdCmsRRData &Arg);
106 const char *do_Mv(XrdCmsRRData &Arg);
107 const char *do_Ping(XrdCmsRRData &Arg);
108 const char *do_Pong(XrdCmsRRData &Arg);
109 const char *do_PrepAdd(XrdCmsRRData &Arg);
110 const char *do_PrepDel(XrdCmsRRData &Arg);
111 const char *do_Rm(XrdCmsRRData &Arg);
112 const char *do_Rmdir(XrdCmsRRData &Arg);
113  int do_SelAvoid(XrdCmsRRData &Arg, XrdCmsSelect &Sel,
114  char *Avoid, bool &doRedir);
115 const char *do_Select(XrdCmsRRData &Arg);
116 static int do_SelPrep(XrdCmsPrepArgs &Arg);
117 const char *do_Space(XrdCmsRRData &Arg);
118 const char *do_State(XrdCmsRRData &Arg);
119 static void do_StateDFS(XrdCmsBaseFR *rP, int rc);
120  int do_StateFWD(XrdCmsRRData &Arg);
121 const char *do_StatFS(XrdCmsRRData &Arg);
122 const char *do_Stats(XrdCmsRRData &Arg);
123 const char *do_Status(XrdCmsRRData &Arg);
124 const char *do_Trunc(XrdCmsRRData &Arg);
125 const char *do_Try(XrdCmsRRData &Arg);
126 const char *do_Update(XrdCmsRRData &Arg);
127 const char *do_Usage(XrdCmsRRData &Arg);
128 
129  void Delete(XrdSysRWLock &gMutex)
130  {XrdSysFusedMutex gMeld(gMutex); Delete(gMeld);}
131 
132  void Delete(XrdSysMutex &gMutex)
133  {XrdSysFusedMutex gMeld(gMutex); Delete(gMeld);}
134 
135  void Delete(XrdSysFusedMutex &gMutex);
136 
137  void Disc(const char *reason=0, int needLock=1);
138 
139 inline int ID(int &INum) {INum = Instance; return NodeID;}
140 
141 inline int Inst() {return Instance;}
142 
143  bool inDomain() {return netIF.InDomain(&netID);}
144 
145 inline int isNode(SMask_t smask) {return (smask & NodeMask) != 0;}
146 
147 inline int isNode(const XrdNetAddr *addr) // Only for avoid processing!
148  {return netID.Same(addr);}
149 
150 inline int isNode(XrdLink *lp, const char *nid, int port)
151  {if (nid)
152  {if (strcmp(myNID, nid)) return 0;
153  if (*nid == '*') return 1;
154  }
155  return netID.Same(lp->NetAddr()) && port == netIF.Port();
156  }
157 
158 inline char *Name() {return (myName ? myName : (char *)"?");}
159 
160 inline SMask_t Mask() {return NodeMask;}
161 
162 inline void g2nLock(XrdSysRWLock &gMutex)
163  {refCnt++; // Keep node alive during transition
164  gMutex.UnLock(); // The lock must have ben held
165  nodeMutex.Lock(); // Downgrade to node lock
166  }
167 
168 inline void n2gLock(XrdSysRWLock &gMutex, bool rdlock=false)
169  {nodeMutex.UnLock(); // Release this node
170  refCnt--; // OK for node to go away
171  if (rdlock) gMutex.ReadLock();
172  else gMutex.WriteLock();
173  }
174 
175 inline void Lock() {refCnt++; nodeMutex.Lock();}
176 
177 inline void UnLock() {nodeMutex.UnLock(); refCnt--;}
178 
179 inline void Ref() {refCnt++;} // Must have global or node locked!
180 inline void unRef() {refCnt--;}
181 
182 static void Report_Usage(XrdLink *lp);
183 
184 inline int Send(const char *buff, int blen=0)
185  {return (isOffline ? -1 : Link->Send(buff, blen));}
186 inline int Send(const struct iovec *iov, int iovcnt, int iotot=0)
187  {return (isOffline ? -1 : Link->Send(iov, iovcnt, iotot));}
188 
189  void setManager(XrdCmsManager *mP) {Manager = mP;}
190 
191  void setName(XrdLink *lnkp, const char *theIF, int port);
192 
193  void setShare(int shrval)
194  {if (shrval > 99) Shrem = Shrip = Share = 0;
195  else {Shrem = Share = shrval; Shrip = 100 - shrval;}
196  }
197 
198  int setTZone(int tZone)
199  {TimeZone = tZone & 0x0f;
200  if (tZone & 0x10) TimeZone = -TimeZone;
201  TZValid = (tZone != 0);
202  return TimeZone;
203  }
204 
205  void setVersion(unsigned short vnum) {myVersion = vnum;}
206 
207 inline void setSlot(short rslot) {RSlot = rslot;}
208 inline short getSlot() {return RSlot;}
209 
210 inline void ShowIF() {netIF.Display("=====> ");}
211 
212  void SyncSpace();
213 
214  XrdCmsNode(XrdLink *lnkp, const char *theIF=0, const char *sid=0,
215  int port=0, int lvl=0, int id=-1);
216  ~XrdCmsNode();
217 
218 private:
219 static const int fsL2PFail1 = 999991;
220 static const int fsL2PFail2 = 999992;
221 
222  void DeleteWarn(unsigned int lkVal);
223  int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0);
224 const char *fsFail(const char *Who, const char *What, const char *Path, int rc);
225  int getMode(const char *theMode, mode_t &Mode);
226  int getSize(const char *theSize, long long &Size);
227  void setHash(XrdCmsSelect &Sel, int acount);
228 
229 XrdSysMutex nodeMutex;
230 RAtomic_uint refCnt{0}; // Tracks references to this onnject
231 
232 XrdLink *Link; // Constructor
233 XrdNetAddr netID; // Constructor
234 XrdNetIF netIF; // Constructor
235 XrdCmsManager *Manager = 0;
236 time_t DropTime = 0;
237 XrdCmsDrop *DropJob = 0;
238 
239 XrdCmsClustID *cidP = 0;
240 SMask_t NodeMask;
241 int NodeID;
242 int Instance;
243 int myLevel;
244 short subsPort = 0; // Subscription port number
245 unsigned short myVersion; // Constructor
246 char *myCID; // Constructor
247 char *myNID; // Constructor
248 char *myName = 0;
249 int myNlen = 0;
250 
251 int logload;
252 int myCost = 0; // Overall cost (determined by location)
253 int myLoad = 0; // Overall load
254 int myMass = 0; // Overall load including space utilization
255 RAtomic_int RefW{0}; // Number of times used for writing
256 RAtomic_int RefTotW{0}; // Actual total w/o share adjustments
257 RAtomic_int RefR{0}; // Number of times used for redirection
258 RAtomic_int RefTotR{0}; // Actual total w/o share adjustments
259 short RSlot = 0;
260 char Share = 0; // Share of requests for this node (0 -> n/a)
261 RAtomic_char Shrem{0}; // Share of requests left
262 RAtomic_char Shrin{0}; // Share intervals used
263 char Shrip = 0; // Share of requests to skip (set once)
264 char Rsvd[3];
265 
266 // The following fields are used to keep the supervisor's free space value
267 //
268 static XrdSysMutex mlMutex;
269 static int LastFree;
270 };
271 #endif
unsigned long long SMask_t
Definition: XrdCmsTypes.hh:33
int Mode
XrdOucString Path
const char * do_PrepDel(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:893
char isPerm
Definition: XrdCmsNode.hh:73
void setManager(XrdCmsManager *mP)
Definition: XrdCmsNode.hh:189
int do_StateFWD(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1403
const char * do_Gone(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:366
const char * do_Locate(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:533
int DiskMinF
Definition: XrdCmsNode.hh:89
int DiskFree
Definition: XrdCmsNode.hh:90
const char * do_Update(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1722
static const char allowsRW
Definition: XrdCmsNode.hh:84
const char * do_Try(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1700
char * Ident
Definition: XrdCmsNode.hh:61
const char * do_State(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1301
void setShare(int shrval)
Definition: XrdCmsNode.hh:193
int isNode(XrdLink *lp, const char *nid, int port)
Definition: XrdCmsNode.hh:150
int DiskNums
Definition: XrdCmsNode.hh:88
void Ref()
Definition: XrdCmsNode.hh:179
char isKnown
Definition: XrdCmsNode.hh:70
unsigned int ConfigID
Definition: XrdCmsNode.hh:92
char isConn
Definition: XrdCmsNode.hh:71
char TZValid
Definition: XrdCmsNode.hh:77
void Delete(XrdSysRWLock &gMutex)
Definition: XrdCmsNode.hh:129
static void do_StateDFS(XrdCmsBaseFR *rP, int rc)
void n2gLock(XrdSysRWLock &gMutex, bool rdlock=false)
Definition: XrdCmsNode.hh:168
const char * do_Space(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1258
int Send(const char *buff, int blen=0)
Definition: XrdCmsNode.hh:184
static const char allowsSS
Definition: XrdCmsNode.hh:85
char isGone
Definition: XrdCmsNode.hh:72
int DiskUtil
Definition: XrdCmsNode.hh:91
int do_SelAvoid(XrdCmsRRData &Arg, XrdCmsSelect &Sel, char *Avoid, bool &doRedir)
Definition: XrdCmsNode.cc:986
void unRef()
Definition: XrdCmsNode.hh:180
const char * do_Select(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1057
const char * do_Mv(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:788
const char * do_Trunc(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1666
int setTZone(int tZone)
Definition: XrdCmsNode.hh:198
static void Report_Usage(XrdLink *lp)
Definition: XrdCmsNode.cc:1752
const char * do_Usage(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1738
int Inst()
Definition: XrdCmsNode.hh:141
const char * do_Chmod(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:307
char TimeZone
Definition: XrdCmsNode.hh:76
char isPeer
Definition: XrdCmsNode.hh:68
void SyncSpace()
Definition: XrdCmsNode.cc:1793
void setVersion(unsigned short vnum)
Definition: XrdCmsNode.hh:205
void Lock()
Definition: XrdCmsNode.hh:175
int isNode(const XrdNetAddr *addr)
Definition: XrdCmsNode.hh:147
static const char isDisabled
Definition: XrdCmsNode.hh:80
char RoleID
Definition: XrdCmsNode.hh:75
const char * do_Load(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:459
int isNode(SMask_t smask)
Definition: XrdCmsNode.hh:145
SMask_t Mask()
Definition: XrdCmsNode.hh:160
int Send(const struct iovec *iov, int iovcnt, int iotot=0)
Definition: XrdCmsNode.hh:186
char isBad
Definition: XrdCmsNode.hh:63
static int do_SelPrep(XrdCmsPrepArgs &Arg)
Definition: XrdCmsNode.cc:1191
const char * do_Rm(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:918
char isOffline
Definition: XrdCmsNode.hh:64
const char * do_PrepAdd(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:874
void g2nLock(XrdSysRWLock &gMutex)
Definition: XrdCmsNode.hh:162
const char * do_Ping(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:844
const char * do_Have(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:408
static const char isSuspend
Definition: XrdCmsNode.hh:81
const char * do_Stats(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1524
const char * do_Disc(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:341
const char * do_Avail(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:286
unsigned int DiskTotal
Definition: XrdCmsNode.hh:87
int ID(int &INum)
Definition: XrdCmsNode.hh:139
char isNoStage
Definition: XrdCmsNode.hh:66
static int do_LocFmt(char *buff, XrdCmsSelected *sP, SMask_t pf, SMask_t wf, bool lsall=false, bool lsuniq=false)
Definition: XrdCmsNode.cc:659
void Disc(const char *reason=0, int needLock=1)
Definition: XrdCmsNode.cc:256
const char * do_Mkpath(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:756
char isMan
Definition: XrdCmsNode.hh:67
void setSlot(short rslot)
Definition: XrdCmsNode.hh:207
XrdCmsNode(XrdLink *lnkp, const char *theIF=0, const char *sid=0, int port=0, int lvl=0, int id=-1)
Definition: XrdCmsNode.cc:98
void UnLock()
Definition: XrdCmsNode.hh:177
const char * do_Pong(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:862
void ShowIF()
Definition: XrdCmsNode.hh:210
void setName(XrdLink *lnkp, const char *theIF, int port)
Definition: XrdCmsNode.cc:145
const char * do_Mkdir(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:724
const char * do_StatFS(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1481
char isBound
Definition: XrdCmsNode.hh:69
const char * do_Rmdir(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:953
static const char isDoomed
Definition: XrdCmsNode.hh:82
bool inDomain()
Definition: XrdCmsNode.hh:143
short getSlot()
Definition: XrdCmsNode.hh:208
void Delete(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:132
static const char isBlisted
Definition: XrdCmsNode.hh:79
const char * do_Status(XrdCmsRRData &Arg)
Definition: XrdCmsNode.cc:1589
char * Name()
Definition: XrdCmsNode.hh:158
char hasNet
Definition: XrdCmsNode.hh:62
int Same(const XrdNetAddrInfo *ipAddr, bool plusPort=false)
static bool InDomain(XrdNetAddrInfo *epaddr)
Definition: XrdNetIF.cc:622
void Display(const char *pfx="=====> ")
Definition: XrdNetIF.cc:142
int Port()
Definition: XrdNetIF.hh:322
XrdVersionInfo myVersion