00001 #ifndef __CMS_CLUSTER__H
00002 #define __CMS_CLUSTER__H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <stdlib.h>
00014 #include <string.h>
00015 #include <strings.h>
00016
00017 #include "XrdCms/XrdCmsTypes.hh"
00018 #include "XrdOuc/XrdOucTList.hh"
00019 #include "XrdSys/XrdSysPthread.hh"
00020
00021 class XrdLink;
00022 class XrdCmsDrop;
00023 class XrdCmsNode;
00024 class XrdCmsSelect;
00025 namespace XrdCms
00026 {
00027 struct CmsRRHdr;
00028 }
00029
00030
00031
00032
00033
00034 namespace XrdCms
00035 {
00036
00037
00038
00039 static const int CMS_noStage = 1;
00040 static const int CMS_Suspend = 2;
00041 static const int CMS_Perm = 4;
00042 static const int CMS_isMan = 8;
00043 static const int CMS_Lost = 16;
00044 static const int CMS_isPeer = 32;
00045 static const int CMS_isProxy = 64;
00046 static const int CMS_noSpace =128;
00047
00048
00049
00050 class SpaceData
00051 {
00052 public:
00053
00054 long long Total;
00055 int wMinF;
00056 int wFree;
00057 int wNum;
00058 int wUtil;
00059 int sFree;
00060 int sNum;
00061 int sUtil;
00062
00063 SpaceData() : Total(0), wMinF(0),
00064 wFree(0), wNum(0), wUtil(0),
00065 sFree(0), sNum(0), sUtil(0) {}
00066 ~SpaceData() {}
00067 };
00068 }
00069
00070
00071
00072
00073
00074
00075
00076 class XrdCmsBaseFR;
00077 class XrdCmsSelected;
00078
00079 class XrdCmsCluster
00080 {
00081 public:
00082 friend class XrdCmsDrop;
00083
00084 int NodeCnt;
00085
00086
00087
00088 XrdCmsNode *Add(XrdLink *lp, int dport, int Status,
00089 int sport, const char *theNID);
00090
00091
00092
00093 SMask_t Broadcast(SMask_t, const struct iovec *, int, int tot=0);
00094
00095 SMask_t Broadcast(SMask_t smask, XrdCms::CmsRRHdr &Hdr,
00096 char *Data, int Dlen=0);
00097
00098 SMask_t Broadcast(SMask_t smask, XrdCms::CmsRRHdr &Hdr,
00099 void *Data, int Dlen);
00100
00101
00102
00103 int Broadsend(SMask_t smask, XrdCms::CmsRRHdr &Hdr,
00104 void *Data, int Dlen);
00105
00106
00107
00108 SMask_t getMask(unsigned int IPv4adr);
00109
00110
00111
00112 SMask_t getMask(const char *Cid);
00113
00114
00115
00116 enum CmsLSOpts {LS_Best = 0x0001, LS_All = 0x0002,
00117 LS_IPO = 0x0004, LS_IPV6 = 0x0008};
00118
00119 XrdCmsSelected *List(SMask_t mask, CmsLSOpts opts);
00120
00121
00122
00123 int Locate(XrdCmsSelect &Sel);
00124
00125
00126
00127 void *MonPerf();
00128
00129
00130
00131 void *MonRefs();
00132
00133
00134
00135 void Remove(const char *reason, XrdCmsNode *theNode, int immed=0);
00136
00137
00138
00139 void ResetRef(SMask_t smask);
00140
00141
00142
00143 int Select(XrdCmsSelect &Sel);
00144
00145 int Select(int isrw, SMask_t pmask, int &port,
00146 char *hbuff, int &hlen);
00147
00148
00149
00150 void Space(XrdCms::SpaceData &sData, SMask_t smask);
00151
00152
00153
00154 int Stats(char *bfr, int bln);
00155
00156 XrdCmsCluster();
00157 ~XrdCmsCluster() {}
00158
00159 private:
00160 int Assign(const char *Cid);
00161 XrdCmsNode *calcDelay(int nump, int numd, int numf, int numo,
00162 int nums, int &delay, const char **reason);
00163 int Drop(int sent, int sinst, XrdCmsDrop *djp=0);
00164 void Record(char *path, const char *reason);
00165 int Multiple(SMask_t mVec);
00166 enum {eExists, eDups, eROfs, eNoRep, eNoEnt};
00167 int SelFail(XrdCmsSelect &Sel, int rc);
00168 int SelNode(XrdCmsSelect &Sel, SMask_t pmask, SMask_t amask);
00169 XrdCmsNode *SelbyCost(SMask_t, int &, int &, const char **, int);
00170 XrdCmsNode *SelbyLoad(SMask_t, int &, int &, const char **, int);
00171 XrdCmsNode *SelbyRef (SMask_t, int &, int &, const char **, int);
00172 int SelDFS(XrdCmsSelect &Sel, SMask_t amask,
00173 SMask_t &pmask, SMask_t &smask, int isRW);
00174 void sendAList(XrdLink *lp);
00175 void setAltMan(int snum, unsigned int ipaddr, int port);
00176
00177
00178 static const int AltSize = 24;
00179
00180 XrdSysMutex cidMutex;
00181 XrdOucTList *cidFirst;
00182
00183 XrdSysMutex XXMutex;
00184 XrdSysMutex STMutex;
00185 XrdCmsNode *NodeTab[STMax];
00186
00187 int STHi;
00188 int SelAcnt;
00189 int SelRcnt;
00190 int doReset;
00191
00192
00193
00194
00195
00196 char AltMans[STMax*AltSize];
00197 char *AltMend;
00198 int AltMent;
00199
00200
00201
00202 SMask_t resetMask;
00203 SMask_t peerHost;
00204 SMask_t peerMask;
00205 };
00206
00207 namespace XrdCms
00208 {
00209 extern XrdCmsCluster Cluster;
00210 }
00211 #endif