00001 #ifndef __OLB_MANAGER__H
00002 #define __OLB_MANAGER__H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <stdlib.h>
00016 #include <string.h>
00017 #include <strings.h>
00018
00019 #include "XrdOlb/XrdOlbManList.hh"
00020 #include "XrdOlb/XrdOlbTypes.hh"
00021 #include "XrdSys/XrdSysPthread.hh"
00022
00023 class XrdNetLink;
00024 class XrdNetWork;
00025 class XrdOlbDrop;
00026 class XrdOlbServer;
00027
00028
00029
00030 #define OLB_LS_BEST 0x0001
00031 #define OLB_LS_ALL 0x0002
00032 #define OLB_LS_IPO 0x0004
00033
00034
00035
00036 #define OLB_SERVER_DISABLE 0x0001
00037 #define OLB_SERVER_NOSTAGE 0x0002
00038 #define OLB_SERVER_OFFLINE 0x0004
00039 #define OLB_SERVER_SUSPEND 0x0008
00040 #define OLB_SERVER_NOSPACE 0x0020
00041 #define OLB_SERVER_ISRW 0x0040
00042
00043 #define OLB_SERVER_ISMANGR 0x0100
00044 #define OLB_SERVER_ISPEER 0x0200
00045 #define OLB_SERVER_ISPROXY 0x0400
00046 #define OLB_SERVER_NOSERVR 0x0700
00047
00048
00049
00050
00051
00052 class XrdOlbSInfo
00053 {
00054 public:
00055
00056 XrdOlbSInfo *next;
00057 char *Name;
00058 SMask_t Mask;
00059 int Id;
00060 unsigned int IPAddr;
00061 int Port;
00062 int Load;
00063 int Util;
00064 int Free;
00065 int RefTotA;
00066 int RefTotR;
00067 int Status;
00068
00069 XrdOlbSInfo(const char *sname, XrdOlbSInfo *np=0)
00070 {Name = (sname ? strdup(sname) : 0); next=np;}
00071
00072 ~XrdOlbSInfo() {if (Name) free(Name);}
00073 };
00074
00075
00076
00077
00078
00079
00080
00081 const int OLB_noStage = 1;
00082 const int OLB_Suspend = 2;
00083 const int OLB_Special = 4;
00084 const int OLB_isMan = 8;
00085 const int OLB_Lost = 16;
00086 const int OLB_isPeer = 32;
00087 const int OLB_isProxy = 64;
00088
00089
00090
00091 const int OLB_needrw = 1;
00092 const int OLB_newfile = 3;
00093 const int OLB_peersok = 4;
00094
00095
00096
00097
00098
00099
00100
00101 class XrdOlbManager
00102 {
00103 public:
00104 friend class XrdOlbDrop;
00105
00106 static const int MTMax = 16;
00107 static const int STMax = 64;
00108
00109 int ServCnt;
00110 char hasData;
00111
00112 void Broadcast(SMask_t smask, char *buff, int blen);
00113 void Broadcast(SMask_t smask, const struct iovec *, int iovcnt);
00114 SMask_t getMask(unsigned int IPv4adr);
00115 int haveManagers() {return MTHi >= 0;};
00116 void Inform(const char *cmd, int clen=0, char *arg=0, int alen=0);
00117 void Inform(SMask_t mmask, const char *cmd, int clen=0);
00118 XrdOlbSInfo *ListServers(SMask_t mask=(SMask_t)-1, int opts=0);
00119 void *Login(XrdNetLink *lnkp);
00120 void *MonPerf(void);
00121 void *MonPing(void);
00122 void *MonRefs(void);
00123 void *Pander(char *manager, int port);
00124 void Remove_Server(const char *reason, int sent, int sinst, int immed=0);
00125 void Reset(void);
00126 void ResetRef(SMask_t smask);
00127 void Resume();
00128 int SelServer(int pt, char *path, SMask_t pmsk, SMask_t amsk, char *hb,
00129 const struct iovec *iodata=0, int iovcnt=0);
00130 int SelServer(int opts, SMask_t pmask, char *hbuff);
00131 void setNet(XrdNetWork *net) {NetTCPs = net;}
00132 void setPort(int port) {Port = port;}
00133 void Snooze(int slpsec);
00134 void Space(int none, int doinform=1);
00135 void Stage(int ison, int doinform=1);
00136 int Stats(char *bfr, int bln);
00137 void Suspend(int doinform=1);
00138
00139 XrdOlbManager();
00140 ~XrdOlbManager() {}
00141
00142 private:
00143 SMask_t AddPath(XrdOlbServer *sp);
00144 int Add_Manager(XrdOlbServer *sp);
00145 XrdOlbServer *AddServer(XrdNetLink *lp, int port, int Status,
00146 int sport, char *sid);
00147 XrdOlbServer *calcDelay(int nump, int numd, int numf, int numo,
00148 int nums, int &delay, const char **reason);
00149 int Drop_Server(int sent, int sinst, XrdOlbDrop *djp=0);
00150 void *Login_Failed(const char *reason, XrdNetLink *lp, XrdOlbServer *sp=0);
00151 void Record(char *path, const char *reason);
00152 void Remove_Manager(const char *reason, XrdOlbServer *sp);
00153 XrdOlbServer *SelbyCost(SMask_t mask, int &nump, int &delay,
00154 const char **reason, int needspace);
00155 XrdOlbServer *SelbyLoad(SMask_t mask, int &nump, int &delay,
00156 const char **reason, int needspace);
00157 XrdOlbServer *SelbyRef( SMask_t mask, int &nump, int &delay,
00158 const char **reason, int needspace);
00159 void sendAList(XrdNetLink *lp);
00160 void setAltMan(int snum, unsigned int ipaddr, int port);
00161
00162 static const int AltSize = 24;
00163
00164 XrdSysMutex XXMutex;
00165 XrdSysMutex STMutex;
00166 XrdOlbServer *ServTab[STMax];
00167 XrdOlbServer *ServBat[STMax];
00168 XrdSysMutex MTMutex;
00169 XrdOlbServer *MastTab[MTMax];
00170 XrdNetWork *NetTCPs;
00171 char AltMans[STMax*AltSize];
00172 char *AltMend;
00173 int AltMent;
00174
00175 int MTHi;
00176 int STHi;
00177 int XWait;
00178 int XnoStage;
00179 int Port;
00180 int SelAcnt;
00181 int SelRcnt;
00182 int doReset;
00183 SMask_t resetMask;
00184 SMask_t peerHost;
00185 SMask_t peerMask;
00186 };
00187
00188 namespace XrdOlb
00189 {
00190 extern XrdOlbManager Manager;
00191 }
00192 #endif