xrootd
XrdCmsCluster.hh
Go to the documentation of this file.
1#ifndef __CMS_CLUSTER__H
2#define __CMS_CLUSTER__H
3/******************************************************************************/
4/* */
5/* X r d C m s C l u s t e r . 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 <stdlib.h>
34#include <string.h>
35#include <strings.h>
36#include <netinet/in.h>
37
38#include "XrdCms/XrdCmsTypes.hh"
39#include "XrdOuc/XrdOucTList.hh"
40#include "XrdOuc/XrdOucEnum.hh"
42
43class XrdLink;
44class XrdCmsDrop;
45class XrdCmsNode;
46class XrdCmsSelect;
47class XrdCmsSelector;
48class XrdNetAddr;
49
50namespace XrdCms
51{
52struct CmsRRHdr;
53}
54
55/******************************************************************************/
56/* O p t i o n F l a g s */
57/******************************************************************************/
58
59namespace XrdCms
60{
61
62// Flags passed to Add()
63//
64static const int CMS_noStage = 1;
65static const int CMS_Suspend = 2;
66static const int CMS_Perm = 4;
67static const int CMS_isMan = 8;
68static const int CMS_Lost = 16;
69static const int CMS_isPeer = 32;
70static const int CMS_isProxy = 64;
71static const int CMS_noSpace =128;
72static const int CMS_isSuper =256;
73
74static const int CMS_isVers3 =0x01000000;
75
78
79// Class passed to Space()
80//
82{
83public:
84
85long long Total; // Total space
86long long TotFr; // Total space free
87int wMinF; // Free space minimum to select wFree node
88int wFree; // Free space for nodes providing r/w access (largest one)
89int wNum; // Number of nodes providing r/w access
90int wUtil; // Average utilization (largest one)
91int sFree; // Free space for nodes providing staging (largest one)
92int sNum; // Number of nodes providing staging
93int sUtil; // Average utilization (largest one)
94
95 SpaceData() : Total(0), TotFr(0),wMinF(0),
96 wFree(0), wNum(0), wUtil(0),
97 sFree(0), sNum(0), sUtil(0) {}
99};
100}
101
102/******************************************************************************/
103/* C l a s s X r d C m s C l u s t e r */
104/******************************************************************************/
105
106// This a single-instance global class
107//
108class XrdCmsBaseFR;
109class XrdCmsClustID;
110class XrdCmsSelected;
111class XrdOucTList;
112
114{
115public:
116friend class XrdCmsDrop;
117
118int NodeCnt; // Number of active nodes
119
120// Called to add a new node to the cluster. Status values are defined above.
121//
122XrdCmsNode *Add(XrdLink *lp, int dport, int Status,
123 int sport, const char *theNID, const char *theIF);
124
125// Put nodes in or remove from a blacklist
126//
127virtual void BlackList(XrdOucTList *blP);
128
129// Sends a message to all nodes matching smask (three forms for convenience)
130//
131SMask_t Broadcast(SMask_t, const struct iovec *, int, int tot=0);
132
134 char *Data, int Dlen=0);
135
137 void *Data, int Dlen);
138
139// Sends a message to a single node in a round-robbin fashion.
140//
142 void *Data, int Dlen);
143
144// Returns the node mask matching the given IP address
145//
147
148// Returns the node mask matching the given cluster ID
149//
150SMask_t getMask(const char *Cid);
151
152// Extracts out node information. Opts are one or more of CmsLSOpts
153//
154enum CmsLSOpts {LS_NULL=0, LS_IPO=0x0100, LS_IDNT=0x0200,
155 LS_ANY =0x0400, LS_IFMASK = 0x0f};
156
157XrdCmsSelected *List(SMask_t mask, CmsLSOpts opts, bool &oksel);
158
159// Returns the location of a file
160//
162
163// Always run as a separate thread to monitor subscribed node performance
164//
165void *MonPerf();
166
167// Alwats run as a separate thread to maintain the node reference count
168//
169void *MonRefs();
170
171// Return total number of redirect references (sloppy as we don't lock it)
172//
173long long Refs() {return SelWcnt+SelWtot+SelRcnt+SelRtot;}
174
175// Called to remove a node from the cluster
176//
177void Remove(XrdCmsNode *theNode);
178
179void Remove(const char *reason, XrdCmsNode *theNode, int immed=0);
180
181// Called to reset the node reference counts for nodes matching smask
182//
183void ResetRef(SMask_t smask);
184
185// Called to select the best possible node to serve a file (two forms)
186//
187static const int RetryErr = -3;
188static const int RetryOut = -4;
190
191int Select(SMask_t pmask, int &port, char *hbuff, int &hlen,
192 int isrw, int isMulti, int ifWant);
193
194// Manipulate the global selection lock
195//
196void SLock(bool dolock)
197 {if (dolock) STMutex.Lock();
198 else STMutex.UnLock();
199 }
200
201// Called to get cluster space (for managers and supervisors only)
202//
203void Space(XrdCms::SpaceData &sData, SMask_t smask);
204
205// Called to return statistics
206//
207int Stats(char *bfr, int bln); // Server
208int Statt(char *bfr, int bln); // Manager
209
211virtual ~XrdCmsCluster() {} // This object should never be deleted
212
213private:
214XrdCmsNode *AddAlt(XrdCmsClustID *cidP, XrdLink *lp, int port, int Status,
215 int sport, const char *theNID, const char *theIF);
217int Drop(int sent, int sinst, XrdCmsDrop *djp=0);
218void Record(char *path, const char *reason, bool force=false);
219bool maxBits(SMask_t mVec, int mbits);
221enum {eExists, eDups, eROfs, eNoRep, eNoSel, eNoEnt}; // Passed to SelFail
222int SelFail(XrdCmsSelect &Sel, int rc);
223int SelNode(XrdCmsSelect &Sel, SMask_t pmask, SMask_t amask);
228 SMask_t &pmask, SMask_t &smask, int isRW);
230void setAltMan(int snum, XrdLink *lp, int port);
231int Unreachable(XrdCmsSelect &Sel, bool none);
233
234// Number of <host>:Port characters per entry was INET6_ADDRSTRLEN+10
235//
236static const int AltSize = 254; // We may revert to IP address
237
238XrdSysMutex XXMutex; // Protects cluster summary state variables
239XrdSysMutex STMutex; // Protects all node information variables
240XrdCmsNode *NodeTab[STMax]; // Current set of nodes
241
242int STHi; // NodeTab high watermark
243int doReset; // Must send reset event to Managers[resetMask]
244long long SelWcnt; // Curr number of r/w selections (successful)
245long long SelWtot; // Total number of r/w selections (successful)
246long long SelRcnt; // Curr number of r/o selections (successful)
247long long SelRtot; // Total number of r/o selections (successful)
248long long SelTcnt; // Total number of all selections
249
250// The following is a list of IP:Port tokens that identify supervisor nodes.
251// The information is sent via the try request to redirect nodes; as needed.
252// The list is alays rotated by one entry each time it is sent.
253//
254char AltMans[STMax*AltSize]; // ||123.123.123.123:12345|| = 21
257
258// The foloowing three variables are protected by the STMutex
259//
260SMask_t resetMask; // Nodes to receive a reset event
261SMask_t peerHost; // Nodes that are acting as peers
262SMask_t peerMask; // Always ~peerHost
263};
264
266
267namespace XrdCms
268{
270}
271#endif
#define STMax
Definition: XrdCmsTypes.hh:39
unsigned long long SMask_t
Definition: XrdCmsTypes.hh:33
#define XRDOUC_ENUM_OPERATORS(T)
Definition: XrdOucEnum.hh:22
Definition: XrdCmsBaseFS.hh:49
Definition: XrdCmsClustID.hh:41
Definition: XrdCmsCluster.hh:114
SMask_t getMask(const XrdNetAddr *addr)
SMask_t peerHost
Definition: XrdCmsCluster.hh:261
void Space(XrdCms::SpaceData &sData, SMask_t smask)
int Select(SMask_t pmask, int &port, char *hbuff, int &hlen, int isrw, int isMulti, int ifWant)
int SelFail(XrdCmsSelect &Sel, int rc)
XrdCmsNode * SelbyCost(SMask_t, XrdCmsSelector &selR)
int Broadsend(SMask_t smask, XrdCms::CmsRRHdr &Hdr, void *Data, int Dlen)
SMask_t getMask(const char *Cid)
long long Refs()
Definition: XrdCmsCluster.hh:173
bool maxBits(SMask_t mVec, int mbits)
int Unreachable(XrdCmsSelect &Sel, bool none)
long long SelWtot
Definition: XrdCmsCluster.hh:245
void * MonPerf()
void SLock(bool dolock)
Definition: XrdCmsCluster.hh:196
static const int RetryOut
Definition: XrdCmsCluster.hh:188
int Drop(int sent, int sinst, XrdCmsDrop *djp=0)
XrdCmsNode * NodeTab[STMax]
Definition: XrdCmsCluster.hh:240
void setAltMan(int snum, XrdLink *lp, int port)
int Unuseable(XrdCmsSelect &Sel)
void Remove(const char *reason, XrdCmsNode *theNode, int immed=0)
int SelNode(XrdCmsSelect &Sel, SMask_t pmask, SMask_t amask)
long long SelRcnt
Definition: XrdCmsCluster.hh:246
int Select(XrdCmsSelect &Sel)
int STHi
Definition: XrdCmsCluster.hh:242
XrdCmsNode * SelbyRef(SMask_t, XrdCmsSelector &selR)
void sendAList(XrdLink *lp)
int Locate(XrdCmsSelect &Sel)
char * AltMend
Definition: XrdCmsCluster.hh:255
void ResetRef(SMask_t smask)
int SelDFS(XrdCmsSelect &Sel, SMask_t amask, SMask_t &pmask, SMask_t &smask, int isRW)
int Multiple(SMask_t mVec)
static const int AltSize
Definition: XrdCmsCluster.hh:236
SMask_t Broadcast(SMask_t smask, XrdCms::CmsRRHdr &Hdr, void *Data, int Dlen)
long long SelWcnt
Definition: XrdCmsCluster.hh:244
long long SelTcnt
Definition: XrdCmsCluster.hh:248
int doReset
Definition: XrdCmsCluster.hh:243
SMask_t Broadcast(SMask_t, const struct iovec *, int, int tot=0)
SMask_t resetMask
Definition: XrdCmsCluster.hh:260
char AltMans[STMax *AltSize]
Definition: XrdCmsCluster.hh:254
int AltMent
Definition: XrdCmsCluster.hh:256
long long SelRtot
Definition: XrdCmsCluster.hh:247
void * MonRefs()
XrdCmsSelected * List(SMask_t mask, CmsLSOpts opts, bool &oksel)
XrdSysMutex XXMutex
Definition: XrdCmsCluster.hh:238
static const int RetryErr
Definition: XrdCmsCluster.hh:187
XrdCmsNode * Add(XrdLink *lp, int dport, int Status, int sport, const char *theNID, const char *theIF)
int NodeCnt
Definition: XrdCmsCluster.hh:118
XrdCmsNode * AddAlt(XrdCmsClustID *cidP, XrdLink *lp, int port, int Status, int sport, const char *theNID, const char *theIF)
XrdSysMutex STMutex
Definition: XrdCmsCluster.hh:239
SMask_t Broadcast(SMask_t smask, XrdCms::CmsRRHdr &Hdr, char *Data, int Dlen=0)
void Remove(XrdCmsNode *theNode)
CmsLSOpts
Definition: XrdCmsCluster.hh:154
@ LS_IDNT
Definition: XrdCmsCluster.hh:154
@ LS_ANY
Definition: XrdCmsCluster.hh:155
@ LS_IFMASK
Definition: XrdCmsCluster.hh:155
@ LS_NULL
Definition: XrdCmsCluster.hh:154
@ LS_IPO
Definition: XrdCmsCluster.hh:154
int Stats(char *bfr, int bln)
virtual ~XrdCmsCluster()
Definition: XrdCmsCluster.hh:211
@ eNoSel
Definition: XrdCmsCluster.hh:221
@ eDups
Definition: XrdCmsCluster.hh:221
@ eNoRep
Definition: XrdCmsCluster.hh:221
@ eROfs
Definition: XrdCmsCluster.hh:221
@ eNoEnt
Definition: XrdCmsCluster.hh:221
@ eExists
Definition: XrdCmsCluster.hh:221
SMask_t peerMask
Definition: XrdCmsCluster.hh:262
XrdCmsNode * calcDelay(XrdCmsSelector &selR)
friend class XrdCmsDrop
Definition: XrdCmsCluster.hh:116
int Statt(char *bfr, int bln)
XrdCmsNode * SelbyLoad(SMask_t, XrdCmsSelector &selR)
virtual void BlackList(XrdOucTList *blP)
void Record(char *path, const char *reason, bool force=false)
Definition: XrdCmsNode.hh:57
Definition: XrdCmsSelect.hh:44
Definition: XrdCmsSelect.hh:102
Definition: XrdCmsSelect.hh:139
Definition: XrdCmsCluster.hh:82
int wNum
Definition: XrdCmsCluster.hh:89
int wFree
Definition: XrdCmsCluster.hh:88
SpaceData()
Definition: XrdCmsCluster.hh:95
int sNum
Definition: XrdCmsCluster.hh:92
int wUtil
Definition: XrdCmsCluster.hh:90
int sFree
Definition: XrdCmsCluster.hh:91
int wMinF
Definition: XrdCmsCluster.hh:87
~SpaceData()
Definition: XrdCmsCluster.hh:98
int sUtil
Definition: XrdCmsCluster.hh:93
long long Total
Definition: XrdCmsCluster.hh:85
long long TotFr
Definition: XrdCmsCluster.hh:86
Definition: XrdNetAddr.hh:42
Definition: XrdOucTList.hh:42
Definition: XrdSysPthread.hh:166
void Lock()
Definition: XrdSysPthread.hh:220
void UnLock()
Definition: XrdSysPthread.hh:222
Definition: YProtocol.hh:78
static const int CMS_hasAlts
Definition: XrdCmsCluster.hh:77
static const int CMS_isSuper
Definition: XrdCmsCluster.hh:72
static const int CMS_noSpace
Definition: XrdCmsCluster.hh:71
static const int CMS_noStage
Definition: XrdCmsCluster.hh:64
XrdCmsCluster Cluster
static const int CMS_Lost
Definition: XrdCmsCluster.hh:68
static const int CMS_isMan
Definition: XrdCmsCluster.hh:67
static const int CMS_Perm
Definition: XrdCmsCluster.hh:66
static const int CMS_isVers3
Definition: XrdCmsCluster.hh:74
static const int CMS_isPeer
Definition: XrdCmsCluster.hh:69
static const int CMS_isProxy
Definition: XrdCmsCluster.hh:70
static const int CMS_Suspend
Definition: XrdCmsCluster.hh:65
static const int CMS_notServ
Definition: XrdCmsCluster.hh:76
Definition: YProtocol.hh:83