xrootd
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
230 RAtomic_uint refCnt{0}; // Tracks references to this onnject
231 
232 XrdLink *Link; // Constructor
233 XrdNetAddr netID; // Constructor
234 XrdNetIF netIF; // Constructor
236 time_t DropTime = 0;
238 
241 int NodeID;
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 
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 //
269 static int LastFree;
270 };
271 #endif
unsigned int ConfigID
Definition: XrdCmsNode.hh:92
char rsvd
Definition: XrdCmsNode.hh:74
const char * do_Trunc(XrdCmsRRData &Arg)
int do_SelAvoid(XrdCmsRRData &Arg, XrdCmsSelect &Sel, char *Avoid, bool &doRedir)
RAtomic_int RefTotW
Definition: XrdCmsNode.hh:256
RAtomic_int RefW
Definition: XrdCmsNode.hh:255
short subsPort
Definition: XrdCmsNode.hh:244
Definition: XrdCmsManager.hh:55
char * Ident
Definition: XrdCmsNode.hh:61
XrdCmsNode(XrdLink *lnkp, const char *theIF=0, const char *sid=0, int port=0, int lvl=0, int id=-1)
Definition: XrdCmsPrepArgs.hh:40
RAtomic_uint refCnt
Definition: XrdCmsNode.hh:230
void SyncSpace()
static int do_SelPrep(XrdCmsPrepArgs &Arg)
char TimeZone
Definition: XrdCmsNode.hh:76
RAtomic_int RefR
Definition: XrdCmsNode.hh:257
int myLevel
Definition: XrdCmsNode.hh:243
const char * do_Status(XrdCmsRRData &Arg)
char isNoStage
Definition: XrdCmsNode.hh:66
const char * do_Mkpath(XrdCmsRRData &Arg)
Definition: XrdSysPthread.hh:329
short getSlot()
Definition: XrdCmsNode.hh:208
Definition: XrdCmsCluster.hh:114
void setVersion(unsigned short vnum)
Definition: XrdCmsNode.hh:205
const char * do_Rmdir(XrdCmsRRData &Arg)
void Disc(const char *reason=0, int needLock=1)
Definition: XrdCmsClustID.hh:40
char isKnown
Definition: XrdCmsNode.hh:70
const char * do_Pong(XrdCmsRRData &Arg)
static const int fsL2PFail1
Definition: XrdCmsNode.hh:219
int myNlen
Definition: XrdCmsNode.hh:249
void setShare(int shrval)
Definition: XrdCmsNode.hh:193
char isConn
Definition: XrdCmsNode.hh:71
Definition: XrdCmsSelect.hh:104
int Same(const XrdNetAddrInfo *ipAddr, bool plusPort=false)
int Send(const struct iovec *iov, int iovcnt, int iotot=0)
Definition: XrdCmsNode.hh:186
int isNode(XrdLink *lp, const char *nid, int port)
Definition: XrdCmsNode.hh:150
void unRef()
Definition: XrdCmsNode.hh:180
const char * do_Ping(XrdCmsRRData &Arg)
char * myCID
Definition: XrdCmsNode.hh:246
int isNode(const XrdNetAddr *addr)
Definition: XrdCmsNode.hh:147
short RSlot
Definition: XrdCmsNode.hh:259
static const char allowsRW
Definition: XrdCmsNode.hh:84
int Inst()
Definition: XrdCmsNode.hh:141
void g2nLock(XrdSysRWLock &gMutex)
Definition: XrdCmsNode.hh:162
void DeleteWarn(unsigned int lkVal)
const char * do_Chmod(XrdCmsRRData &Arg)
Definition: XrdNetIF.hh:48
int setTZone(int tZone)
Definition: XrdCmsNode.hh:198
int do_StateFWD(XrdCmsRRData &Arg)
RAtomic_int RefTotR
Definition: XrdCmsNode.hh:258
int DiskNums
Definition: XrdCmsNode.hh:88
static bool InDomain(XrdNetAddrInfo *epaddr)
void ReadLock()
Definition: XrdSysPthread.hh:342
XrdNetAddr netID
Definition: XrdCmsNode.hh:233
Definition: XrdCmsBaseFS.hh:48
int myMass
Definition: XrdCmsNode.hh:254
char isBound
Definition: XrdCmsNode.hh:69
RAtomic_char Shrem
Definition: XrdCmsNode.hh:261
void setManager(XrdCmsManager *mP)
Definition: XrdCmsNode.hh:189
XrdCmsClustID * cidP
Definition: XrdCmsNode.hh:239
XrdCmsManager * Manager
Definition: XrdCmsNode.hh:235
int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0)
void Delete(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:132
const char * do_Try(XrdCmsRRData &Arg)
Definition: XrdNetAddr.hh:41
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:252
void Lock()
Definition: XrdCmsNode.hh:175
const char * do_PrepAdd(XrdCmsRRData &Arg)
void setSlot(short rslot)
Definition: XrdCmsNode.hh:207
Definition: XrdSysPthread.hh:433
int Instance
Definition: XrdCmsNode.hh:242
Definition: XrdSysPthread.hh:164
char RoleID
Definition: XrdCmsNode.hh:75
unsigned int DiskTotal
Definition: XrdCmsNode.hh:87
static XrdSysMutex mlMutex
Definition: XrdCmsNode.hh:268
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)
int Port()
Definition: XrdNetIF.hh:276
SMask_t NodeMask
Definition: XrdCmsNode.hh:240
void WriteLock()
Definition: XrdSysPthread.hh:343
const char * do_Mv(XrdCmsRRData &Arg)
static const char allowsSS
Definition: XrdCmsNode.hh:85
int getSize(const char *theSize, long long &Size)
char isPeer
Definition: XrdCmsNode.hh:68
void Ref()
Definition: XrdCmsNode.hh:179
Definition: XrdOucProg.hh:37
unsigned short myVersion
Definition: XrdCmsNode.hh:245
char TZValid
Definition: XrdCmsNode.hh:77
void setHash(XrdCmsSelect &Sel, int acount)
char Rsvd[3]
Definition: XrdCmsNode.hh:264
Definition: XrdCmsRRData.hh:51
Definition: XrdCmsBaseFS.hh:87
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:160
const char * do_Select(XrdCmsRRData &Arg)
const char * do_Mkdir(XrdCmsRRData &Arg)
int DiskFree
Definition: XrdCmsNode.hh:90
char isOffline
Definition: XrdCmsNode.hh:64
int NodeID
Definition: XrdCmsNode.hh:241
const char * do_Usage(XrdCmsRRData &Arg)
void setName(XrdLink *lnkp, const char *theIF, int port)
static int LastFree
Definition: XrdCmsNode.hh:269
const char * do_State(XrdCmsRRData &Arg)
char isPerm
Definition: XrdCmsNode.hh:73
char * myNID
Definition: XrdCmsNode.hh:247
static void Report_Usage(XrdLink *lp)
XrdCmsDrop * DropJob
Definition: XrdCmsNode.hh:237
const char * do_Gone(XrdCmsRRData &Arg)
const char * do_StatFS(XrdCmsRRData &Arg)
char Shrip
Definition: XrdCmsNode.hh:263
char * myName
Definition: XrdCmsNode.hh:248
const char * do_Update(XrdCmsRRData &Arg)
const char * do_Load(XrdCmsRRData &Arg)
const char * do_Locate(XrdCmsRRData &Arg)
XrdNetIF netIF
Definition: XrdCmsNode.hh:234
const char * do_Have(XrdCmsRRData &Arg)
time_t DropTime
Definition: XrdCmsNode.hh:236
char * Name()
Definition: XrdCmsNode.hh:158
char isRW
Definition: XrdCmsNode.hh:65
void Lock()
Definition: XrdSysPthread.hh:222
const char * do_Stats(XrdCmsRRData &Arg)
void n2gLock(XrdSysRWLock &gMutex, bool rdlock=false)
Definition: XrdCmsNode.hh:168
bool inDomain()
Definition: XrdCmsNode.hh:143
static const char isDoomed
Definition: XrdCmsNode.hh:82
XrdSysMutex nodeMutex
Definition: XrdCmsNode.hh:229
void Delete(XrdSysRWLock &gMutex)
Definition: XrdCmsNode.hh:129
static const char isSuspend
Definition: XrdCmsNode.hh:81
static const char isBlisted
Definition: XrdCmsNode.hh:79
int Send(const char *buff, int blen=0)
Definition: XrdCmsNode.hh:184
static const char isDisabled
Definition: XrdCmsNode.hh:80
char isMan
Definition: XrdCmsNode.hh:67
void ShowIF()
Definition: XrdCmsNode.hh:210
static void do_StateDFS(XrdCmsBaseFR *rP, int rc)
friend class XrdCmsDrop
Definition: XrdCmsCluster.hh:117
char isGone
Definition: XrdCmsNode.hh:72
Definition: XrdCmsNode.hh:57
int DiskUtil
Definition: XrdCmsNode.hh:91
int logload
Definition: XrdCmsNode.hh:251
void UnLock()
Definition: XrdCmsNode.hh:177
void Display(const char *pfx="=====> ")
void UnLock()
Definition: XrdSysPthread.hh:224
static const int fsL2PFail2
Definition: XrdCmsNode.hh:220
char isBad
Definition: XrdCmsNode.hh:63
RAtomic_char Shrin
Definition: XrdCmsNode.hh:262
Definition: XrdCmsSelect.hh:43
const char * do_Disc(XrdCmsRRData &Arg)
void UnLock()
Definition: XrdSysPthread.hh:348
int ID(int &INum)
Definition: XrdCmsNode.hh:139
char hasNet
Definition: XrdCmsNode.hh:62
XrdLink * Link
Definition: XrdCmsNode.hh:232
int DiskMinF
Definition: XrdCmsNode.hh:89
int isNode(SMask_t smask)
Definition: XrdCmsNode.hh:145
const char * do_Rm(XrdCmsRRData &Arg)
int myLoad
Definition: XrdCmsNode.hh:253
char Share
Definition: XrdCmsNode.hh:260