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 
13 #include <string.h>
14 #include <unistd.h>
15 #include <sys/uio.h>
16 
17 #include "Xrd/XrdLink.hh"
18 #include "XrdCms/XrdCmsTypes.hh"
19 #include "XrdCms/XrdCmsRRQ.hh"
20 #include "XrdSys/XrdSysPthread.hh"
21 
22 class XrdCmsBaseFR;
23 class XrdCmsBaseFS;
24 class XrdCmsDrop;
25 class XrdCmsPrepArgs;
26 class XrdCmsRRData;
27 class XrdCmsSelected;
28 class XrdOucProg;
29 
31 {
32 friend class XrdCmsCluster;
33 public:
34  char *Ident; // -> role hostname
35  char isDisable; //0 Set via admin command to temporarily remove node
36  char isOffline; //1 Set when a link failure occurs
37  char isNoStage; //2 Set upon a nostage event
38  char isMan; //3 Set when node acts as manager
39  char isPeer; //4 Set when node acts as peer manager
40  char isProxy; //5 Set when node acts as a proxy
41  char isSuspend; //6 Set upon a suspend event
42  char isBound; //7 Set when node is in the configuration
43  char isRW; //0 Set when node can write or stage data
44  char isKnown; //1 Set when we have recieved a "state"
45  char isConn; //2 Set when node is network connected
46  char isGone; //3 Set when node must be deleted
47  char isPerm; //4 Set when node is permanently bound
48  char isReserved[2];
49  char RoleID; // The converted XrdCmsRole::RoleID
50  char TimeZone; // Time zone in +UTC-
51  char TZValid; // Time zone has been set
52 
53 static const char allowsRW = 0x01; // in isRW -> Server allows r/w access
54 static const char allowsSS = 0x02; // in isRW -> Server can stage data
55 
56 unsigned int DiskTotal; // Total disk space in GB
57  int DiskNums; // Number of file systems
58  int DiskMinF; // Minimum MB needed for selection
59  int DiskFree; // Largest free MB
60  int DiskUtil; // Total disk utilization
61 unsigned int ConfigID; // Configuration identifier
62 
63 const char *do_Avail(XrdCmsRRData &Arg);
64 const char *do_Chmod(XrdCmsRRData &Arg);
65 const char *do_Disc(XrdCmsRRData &Arg);
66 const char *do_Gone(XrdCmsRRData &Arg);
67 const char *do_Have(XrdCmsRRData &Arg);
68 const char *do_Load(XrdCmsRRData &Arg);
69 const char *do_Locate(XrdCmsRRData &Arg);
70 static int do_LocFmt(char *buff, XrdCmsSelected *sP, SMask_t pf, SMask_t wf);
71 const char *do_Mkdir(XrdCmsRRData &Arg);
72 const char *do_Mkpath(XrdCmsRRData &Arg);
73 const char *do_Mv(XrdCmsRRData &Arg);
74 const char *do_Ping(XrdCmsRRData &Arg);
75 const char *do_Pong(XrdCmsRRData &Arg);
76 const char *do_PrepAdd(XrdCmsRRData &Arg);
77 const char *do_PrepDel(XrdCmsRRData &Arg);
78 const char *do_Rm(XrdCmsRRData &Arg);
79 const char *do_Rmdir(XrdCmsRRData &Arg);
80 const char *do_Select(XrdCmsRRData &Arg);
81 static int do_SelPrep(XrdCmsPrepArgs &Arg);
82 const char *do_Space(XrdCmsRRData &Arg);
83 const char *do_State(XrdCmsRRData &Arg);
84 static void do_StateDFS(XrdCmsBaseFR *rP, int rc);
85  int do_StateFWD(XrdCmsRRData &Arg);
86 const char *do_StatFS(XrdCmsRRData &Arg);
87 const char *do_Stats(XrdCmsRRData &Arg);
88 const char *do_Status(XrdCmsRRData &Arg);
89 const char *do_Trunc(XrdCmsRRData &Arg);
90 const char *do_Try(XrdCmsRRData &Arg);
91 const char *do_Update(XrdCmsRRData &Arg);
92 const char *do_Usage(XrdCmsRRData &Arg);
93 
94  void Disc(const char *reason=0, int needLock=1);
95 
96 inline int ID(int &INum) {INum = Instance; return NodeID;}
97 
98 inline int Inst() {return Instance;}
99 
100 inline int isNode(SMask_t smask) {return (smask & NodeMask) != 0;}
101 inline int isNode(const char *hn)
102  {return Link && !strcmp(Link->Host(), hn);}
103 inline int isNode(unsigned int ipa)
104  {return ipa == IPAddr;}
105 inline int isNode(unsigned int ipa, const char *nid)
106  {return ipa == IPAddr && (nid ? !strcmp(myNID, nid) : 1);}
107 inline char *Name() {return (myName ? myName : (char *)"?");}
108 
109 inline char *Name(int &len, int &port)
110  {len = myNlen; port = Port; return myName;}
111 
112 inline SMask_t Mask() {return NodeMask;}
113 
114 inline void Lock() {myMutex.Lock(); isLocked = 1;}
115 inline void UnLock() {isLocked = 0; myMutex.UnLock();}
116 
117 static void Report_Usage(XrdLink *lp);
118 
119 inline int Send(const char *buff, int blen=0)
120  {return (isOffline ? -1 : Link->Send(buff, blen));}
121 inline int Send(const struct iovec *iov, int iovcnt, int iotot=0)
122  {return (isOffline ? -1 : Link->Send(iov, iovcnt, iotot));}
123 
124  void setName(XrdLink *lnkp, int port);
125 
126  void setShare(int shrval)
127  {if (shrval > 99) Shrem = Shrip = Share = 0;
128  else {Shrem = Share = shrval; Shrip = 100 - shrval;}
129  }
130 
131  int setTZone(int tZone)
132  {TimeZone = tZone & 0x0f;
133  if (tZone & 0x10) TimeZone = -TimeZone;
134  TZValid = (tZone != 0);
135  return TimeZone;
136  }
137 
138 inline void setSlot(short rslot) {RSlot = rslot;}
139 inline short getSlot() {return RSlot;}
140 
141  void SyncSpace();
142 
143  XrdCmsNode(XrdLink *lnkp, int port=0,
144  const char *sid=0, int lvl=0, int id=-1);
145  ~XrdCmsNode();
146 
147 private:
148 static const int fsL2PFail1 = 999991;
149 static const int fsL2PFail2 = 999992;
150 
151  int fsExec(XrdOucProg *Prog, char *Arg1, char *Arg2=0);
152 const char *fsFail(const char *Who, const char *What, const char *Path, int rc);
153  int getMode(const char *theMode, mode_t &Mode);
154  int getSize(const char *theSize, long long &Size);
155 
158 unsigned int IPAddr;
160 time_t DropTime;
162 int IPV6Len; // 12345678901234567890123456
163 char IPV6[28]; // [::123.123.123.123]:123456
164 
166 int NodeID;
168 int Port;
170 int myCNUM;
171 char *myCID;
172 char *myNID;
173 char *myName;
174 int myNlen;
175 
177 int myCost; // Overall cost (determined by location)
178 int myLoad; // Overall load
179 int myMass; // Overall load including space utilization
180 int RefW; // Number of times used for writing
182 int RefR; // Number of times used for redirection
184 short RSlot;
185 char isLocked;
186 char Share; // Share of requests for this node (0 -> n/a)
187 char Shrem; // Share of requests left
188 char Shrip; // Share of requests to skip
189 char Rsvd[2];
190 int Shrin; // Share intervals used
191 
192 // The following fields are used to keep the supervisor's free space value
193 //
195 static int LastFree;
196 };
197 #endif