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"
44
45class XrdCmsBaseFR;
46class XrdCmsBaseFS;
47class XrdCmsClustID;
48class XrdCmsDrop;
49class XrdCmsManager;
50class XrdCmsPrepArgs;
51class XrdCmsRRData;
52class XrdCmsSelect;
53class XrdCmsSelected;
54class XrdOucProg;
55
57{
58friend class XrdCmsCluster;
59public:
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
78static const char isBlisted = 0x01; // in isBad -> Node is black listed
79static const char isDisabled = 0x02; // in isBad -> Node is disable (internal)
80static const char isSuspend = 0x04; // in isBad -> Node is suspended via event
81static const char isDoomed = 0x08; // in isBad -> Node socket must be closed
82
83static const char allowsRW = 0x01; // in isRW -> Server allows r/w access
84static const char allowsSS = 0x02; // in isRW -> Server can stage data
85
86unsigned 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
91unsigned int ConfigID; // Configuration identifier
92
93const char *do_Avail(XrdCmsRRData &Arg);
94const char *do_Chmod(XrdCmsRRData &Arg);
95const char *do_Disc(XrdCmsRRData &Arg);
96const char *do_Gone(XrdCmsRRData &Arg);
97const char *do_Have(XrdCmsRRData &Arg);
98const char *do_Load(XrdCmsRRData &Arg);
99const char *do_Locate(XrdCmsRRData &Arg);
100static int do_LocFmt(char *buff, XrdCmsSelected *sP,
101 SMask_t pf, SMask_t wf,
102 bool lsall=false, bool lsuniq=false);
103const char *do_Mkdir(XrdCmsRRData &Arg);
104const char *do_Mkpath(XrdCmsRRData &Arg);
105const char *do_Mv(XrdCmsRRData &Arg);
106const char *do_Ping(XrdCmsRRData &Arg);
107const char *do_Pong(XrdCmsRRData &Arg);
108const char *do_PrepAdd(XrdCmsRRData &Arg);
109const char *do_PrepDel(XrdCmsRRData &Arg);
110const char *do_Rm(XrdCmsRRData &Arg);
111const char *do_Rmdir(XrdCmsRRData &Arg);
113 char *Avoid, bool &doRedir);
114const char *do_Select(XrdCmsRRData &Arg);
115static int do_SelPrep(XrdCmsPrepArgs &Arg);
116const char *do_Space(XrdCmsRRData &Arg);
117const char *do_State(XrdCmsRRData &Arg);
118static void do_StateDFS(XrdCmsBaseFR *rP, int rc);
120const char *do_StatFS(XrdCmsRRData &Arg);
121const char *do_Stats(XrdCmsRRData &Arg);
122const char *do_Status(XrdCmsRRData &Arg);
123const char *do_Trunc(XrdCmsRRData &Arg);
124const char *do_Try(XrdCmsRRData &Arg);
125const char *do_Update(XrdCmsRRData &Arg);
126const char *do_Usage(XrdCmsRRData &Arg);
127
128 void Delete(XrdSysMutex &gMutex);
129
130 void Disc(const char *reason=0, int needLock=1);
131
132inline int ID(int &INum) {INum = Instance; return NodeID;}
133
134inline int Inst() {return Instance;}
135
136 bool inDomain() {return netIF.InDomain(&netID);}
137
138inline int isNode(SMask_t smask) {return (smask & NodeMask) != 0;}
139
140inline int isNode(const XrdNetAddr *addr) // Only for avoid processing!
141 {return netID.Same(addr);}
142
143inline 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
151inline char *Name() {return (myName ? myName : (char *)"?");}
152
153inline SMask_t Mask() {return NodeMask;}
154
155inline void g2Ref(XrdSysMutex &gMutex) {lkCount++; gMutex.UnLock();}
156
157inline void Ref2g(XrdSysMutex &gMutex) {gMutex.Lock(); lkCount--;}
158
159inline 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
167inline 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
177inline 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 }
185inline void UnLock() {isLocked = 0;
186 if (incUL)
187 {ulCount++; incUL = 0;
188 if (isGone) nodeMutex.Signal();
189 }
191 }
192
193static void Report_Usage(XrdLink *lp);
194
195inline int Send(const char *buff, int blen=0)
196 {return (isOffline ? -1 : Link->Send(buff, blen));}
197inline int Send(const struct iovec *iov, int iovcnt, int iotot=0)
198 {return (isOffline ? -1 : Link->Send(iov, iovcnt, iotot));}
199
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
218inline void setSlot(short rslot) {RSlot = rslot;}
219inline short getSlot() {return RSlot;}
220
221inline 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);
228
229private:
230static const int fsL2PFail1 = 999991;
231static const int fsL2PFail2 = 999992;
232
233 void DeleteWarn(XrdSysMutex &gMutex, unsigned int &lkVal);
234 int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0);
235const 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
240unsigned int lkCount; // Only Modified with global lock held
241unsigned int ulCount; // Only Modified with node lock held
242
248time_t DropTime;
250
256short subsPort; // Subscription port number
257unsigned short myVersion;
258char *myCID;
259char *myNID;
260char *myName;
262
264int myCost; // Overall cost (determined by location)
265int myLoad; // Overall load
266int myMass; // Overall load including space utilization
267int RefW; // Number of times used for writing
269int RefR; // Number of times used for redirection
271short RSlot;
273char Share; // Share of requests for this node (0 -> n/a)
274char Shrem; // Share of requests left
275char Shrip; // Share of requests to skip
276char Rsvd[2];
277int Shrin; // Share intervals used
278
279// The following fields are used to keep the supervisor's free space value
280//
282static int LastFree;
283};
284#endif
unsigned long long SMask_t
Definition: XrdCmsTypes.hh:33
Definition: XrdCmsBaseFS.hh:49
Definition: XrdCmsBaseFS.hh:88
Definition: XrdCmsClustID.hh:41
Definition: XrdCmsCluster.hh:114
friend class XrdCmsDrop
Definition: XrdCmsCluster.hh:116
Definition: XrdCmsManager.hh:56
Definition: XrdCmsNode.hh:57
char * myNID
Definition: XrdCmsNode.hh:259
const char * do_PrepDel(XrdCmsRRData &Arg)
char isPerm
Definition: XrdCmsNode.hh:72
void setManager(XrdCmsManager *mP)
Definition: XrdCmsNode.hh:200
static int do_SelPrep(XrdCmsPrepArgs &Arg)
char Rsvd[2]
Definition: XrdCmsNode.hh:276
int do_StateFWD(XrdCmsRRData &Arg)
const char * do_Gone(XrdCmsRRData &Arg)
XrdCmsNode * Next
Definition: XrdCmsNode.hh:247
const char * do_Locate(XrdCmsRRData &Arg)
XrdNetIF netIF
Definition: XrdCmsNode.hh:245
int DiskMinF
Definition: XrdCmsNode.hh:88
int DiskFree
Definition: XrdCmsNode.hh:89
const char * do_Update(XrdCmsRRData &Arg)
int RefTotR
Definition: XrdCmsNode.hh:270
static const char allowsRW
Definition: XrdCmsNode.hh:83
const char * do_Try(XrdCmsRRData &Arg)
void g2nLock(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:159
char * Ident
Definition: XrdCmsNode.hh:60
const char * fsFail(const char *Who, const char *What, const char *Path, int rc)
int Instance
Definition: XrdCmsNode.hh:254
char isLocked
Definition: XrdCmsNode.hh:272
const char * do_State(XrdCmsRRData &Arg)
void setShare(int shrval)
Definition: XrdCmsNode.hh:204
int isNode(XrdLink *lp, const char *nid, int port)
Definition: XrdCmsNode.hh:143
void Ref2g(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:157
int DiskNums
Definition: XrdCmsNode.hh:87
char isKnown
Definition: XrdCmsNode.hh:69
unsigned int ConfigID
Definition: XrdCmsNode.hh:91
char incUL
Definition: XrdCmsNode.hh:73
int myLoad
Definition: XrdCmsNode.hh:265
char isConn
Definition: XrdCmsNode.hh:70
XrdCmsDrop * DropJob
Definition: XrdCmsNode.hh:249
char TZValid
Definition: XrdCmsNode.hh:76
XrdSysCondVar nodeMutex
Definition: XrdCmsNode.hh:239
const char * do_Space(XrdCmsRRData &Arg)
int Send(const char *buff, int blen=0)
Definition: XrdCmsNode.hh:195
static const char allowsSS
Definition: XrdCmsNode.hh:84
char isGone
Definition: XrdCmsNode.hh:71
int DiskUtil
Definition: XrdCmsNode.hh:90
int RefW
Definition: XrdCmsNode.hh:267
int do_SelAvoid(XrdCmsRRData &Arg, XrdCmsSelect &Sel, char *Avoid, bool &doRedir)
const char * do_Select(XrdCmsRRData &Arg)
const char * do_Mv(XrdCmsRRData &Arg)
const char * do_Trunc(XrdCmsRRData &Arg)
char Shrem
Definition: XrdCmsNode.hh:274
int setTZone(int tZone)
Definition: XrdCmsNode.hh:209
const char * do_Usage(XrdCmsRRData &Arg)
time_t DropTime
Definition: XrdCmsNode.hh:248
char Share
Definition: XrdCmsNode.hh:273
int Inst()
Definition: XrdCmsNode.hh:134
const char * do_Chmod(XrdCmsRRData &Arg)
unsigned short myVersion
Definition: XrdCmsNode.hh:257
char TimeZone
Definition: XrdCmsNode.hh:75
char isPeer
Definition: XrdCmsNode.hh:67
void g2Ref(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:155
void SyncSpace()
void setVersion(unsigned short vnum)
Definition: XrdCmsNode.hh:216
short subsPort
Definition: XrdCmsNode.hh:256
short RSlot
Definition: XrdCmsNode.hh:271
int isNode(const XrdNetAddr *addr)
Definition: XrdCmsNode.hh:140
static const char isDisabled
Definition: XrdCmsNode.hh:79
char RoleID
Definition: XrdCmsNode.hh:74
const char * do_Load(XrdCmsRRData &Arg)
int myNlen
Definition: XrdCmsNode.hh:261
int isNode(SMask_t smask)
Definition: XrdCmsNode.hh:138
SMask_t Mask()
Definition: XrdCmsNode.hh:153
int Send(const struct iovec *iov, int iovcnt, int iotot=0)
Definition: XrdCmsNode.hh:197
int getSize(const char *theSize, long long &Size)
void DeleteWarn(XrdSysMutex &gMutex, unsigned int &lkVal)
char * Name()
Definition: XrdCmsNode.hh:151
char isBad
Definition: XrdCmsNode.hh:62
void Lock(bool doinc)
Definition: XrdCmsNode.hh:177
const char * do_Rm(XrdCmsRRData &Arg)
char isOffline
Definition: XrdCmsNode.hh:63
int RefTotW
Definition: XrdCmsNode.hh:268
const char * do_PrepAdd(XrdCmsRRData &Arg)
char * myCID
Definition: XrdCmsNode.hh:258
static void Report_Usage(XrdLink *lp)
const char * do_Ping(XrdCmsRRData &Arg)
const char * do_Have(XrdCmsRRData &Arg)
static void do_StateDFS(XrdCmsBaseFR *rP, int rc)
int RefR
Definition: XrdCmsNode.hh:269
static const char isSuspend
Definition: XrdCmsNode.hh:80
const char * do_Stats(XrdCmsRRData &Arg)
XrdCmsClustID * cidP
Definition: XrdCmsNode.hh:251
const char * do_Disc(XrdCmsRRData &Arg)
const char * do_Avail(XrdCmsRRData &Arg)
unsigned int DiskTotal
Definition: XrdCmsNode.hh:86
int ID(int &INum)
Definition: XrdCmsNode.hh:132
int myMass
Definition: XrdCmsNode.hh:266
static XrdSysMutex mlMutex
Definition: XrdCmsNode.hh:281
char * myName
Definition: XrdCmsNode.hh:260
char isNoStage
Definition: XrdCmsNode.hh:65
void Disc(const char *reason=0, int needLock=1)
char Shrip
Definition: XrdCmsNode.hh:275
int getMode(const char *theMode, mode_t &Mode)
const char * do_Mkpath(XrdCmsRRData &Arg)
int logload
Definition: XrdCmsNode.hh:263
char isMan
Definition: XrdCmsNode.hh:66
unsigned int ulCount
Definition: XrdCmsNode.hh:241
int myCost
Definition: XrdCmsNode.hh:264
void setSlot(short rslot)
Definition: XrdCmsNode.hh:218
XrdCmsNode(XrdLink *lnkp, const char *theIF=0, const char *sid=0, int port=0, int lvl=0, int id=-1)
void UnLock()
Definition: XrdCmsNode.hh:185
const char * do_Pong(XrdCmsRRData &Arg)
XrdNetAddr netID
Definition: XrdCmsNode.hh:244
void ShowIF()
Definition: XrdCmsNode.hh:221
static int do_LocFmt(char *buff, XrdCmsSelected *sP, SMask_t pf, SMask_t wf, bool lsall=false, bool lsuniq=false)
void setName(XrdLink *lnkp, const char *theIF, int port)
const char * do_Mkdir(XrdCmsRRData &Arg)
int myLevel
Definition: XrdCmsNode.hh:255
static const int fsL2PFail1
Definition: XrdCmsNode.hh:230
int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0)
XrdCmsManager * Manager
Definition: XrdCmsNode.hh:246
const char * do_StatFS(XrdCmsRRData &Arg)
char isBound
Definition: XrdCmsNode.hh:68
const char * do_Rmdir(XrdCmsRRData &Arg)
static const char isDoomed
Definition: XrdCmsNode.hh:81
int NodeID
Definition: XrdCmsNode.hh:253
void n2gLock(XrdSysMutex &gMutex)
Definition: XrdCmsNode.hh:167
bool inDomain()
Definition: XrdCmsNode.hh:136
static const int fsL2PFail2
Definition: XrdCmsNode.hh:231
short getSlot()
Definition: XrdCmsNode.hh:219
int Shrin
Definition: XrdCmsNode.hh:277
void Delete(XrdSysMutex &gMutex)
XrdLink * Link
Definition: XrdCmsNode.hh:243
static const char isBlisted
Definition: XrdCmsNode.hh:78
char isRW
Definition: XrdCmsNode.hh:64
const char * do_Status(XrdCmsRRData &Arg)
SMask_t NodeMask
Definition: XrdCmsNode.hh:252
static int LastFree
Definition: XrdCmsNode.hh:282
char hasNet
Definition: XrdCmsNode.hh:61
unsigned int lkCount
Definition: XrdCmsNode.hh:240
Definition: XrdCmsPrepArgs.hh:41
Definition: XrdCmsRRData.hh:52
Definition: XrdCmsSelect.hh:44
Definition: XrdCmsSelect.hh:102
int Same(const XrdNetAddrInfo *ipAddr, bool plusPort=false)
Definition: XrdNetAddr.hh:42
Definition: XrdNetIF.hh:49
void Display(const char *pfx="=====> ")
int Port()
Definition: XrdNetIF.hh:276
static bool InDomain(XrdNetAddrInfo *epaddr)
Definition: XrdOucProg.hh:38
Definition: XrdSysPthread.hh:79
void UnLock()
Definition: XrdSysPthread.hh:94
void Lock()
Definition: XrdSysPthread.hh:82
void Signal()
Definition: XrdSysPthread.hh:84
Definition: XrdSysPthread.hh:166
void Lock()
Definition: XrdSysPthread.hh:220
void UnLock()
Definition: XrdSysPthread.hh:222