00001 #ifndef __OLB_SERVER__H
00002 #define __OLB_SERVER__H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <string.h>
00016 #include <unistd.h>
00017 #include <sys/uio.h>
00018
00019 #include "XrdNet/XrdNetLink.hh"
00020 #include "XrdOlb/XrdOlbTypes.hh"
00021 #include "XrdOlb/XrdOlbReq.hh"
00022 #include "XrdOlb/XrdOlbRRQ.hh"
00023 #include "XrdSys/XrdSysPthread.hh"
00024
00025 class XrdOlbCInfo;
00026 class XrdOlbDrop;
00027 class XrdOlbPInfo;
00028 class XrdOlbPrepArgs;
00029
00030 class XrdOlbServer
00031 {
00032 public:
00033 friend class XrdOlbManager;
00034
00035 char isDisable;
00036 char isOffline;
00037 char isNoStage;
00038 char isSpecial;
00039 char isMan;
00040 char isPeer;
00041 char isProxy;
00042 char isSuspend;
00043 char isActive;
00044 char isBound;
00045 char isRW;
00046 char isKnown;
00047 char isBusy;
00048 char isGone;
00049
00050 int do_Locate(char *, const char *, SMask_t hfVec, SMask_t rwVec);
00051
00052 inline int Inst() {return Instance;}
00053
00054 inline int isServer(SMask_t smask) {return (smask & ServMask) != 0;}
00055 inline int isServer(const char *hn)
00056 {return Link && !strcmp(Link->Name(), hn);}
00057 inline int isServer(unsigned int ipa)
00058 {return ipa == IPAddr;}
00059 inline int isServer(unsigned int ipa, int port)
00060 {return ipa == IPAddr && port == Port && port;}
00061 inline int isServer(unsigned int ipa, int port, char *sid)
00062 {if (sid) return ipa == IPAddr && !strcmp(mySID, sid);
00063 return ipa == IPAddr && port == Port && port;
00064 }
00065 inline char *Name() {return (myName ? myName : (char *)"?");}
00066 inline const char *Nick() {return (myNick ? myNick : (char *)"?");}
00067 inline void Lock() {myMutex.Lock();}
00068 inline void UnLock() {myMutex.UnLock();}
00069
00070 int Login(int Port, int Status, int Lvl);
00071
00072 void Process_Director(void);
00073 int Process_Requests(void);
00074 int Process_Responses(void);
00075
00076 static int Resume(XrdOlbPrepArgs *pargs);
00077
00078 int Send(const char *buff, int blen=0);
00079 int Send(const struct iovec *iov, int iovcnt);
00080
00081 void setName(XrdNetLink *lnkp, int port);
00082
00083 static void setRelay(XrdNetLink *rlyp) {Relay = rlyp;}
00084
00085 static void setSpace(int Dfree, int Dutil) {dsk_free = Dfree; dsk_totu = Dutil;}
00086
00087 XrdOlbServer(XrdNetLink *lnkp, int port=0, char *sid=0);
00088 ~XrdOlbServer();
00089
00090 private:
00091 int do_AvKb(char *rid);
00092 int do_Chmod(char *rid, int do4real);
00093 int do_Delay(char *rid);
00094 int do_Disc(char *rid, int sendDisc);
00095 int do_Gone(char *rid);
00096 int do_Have(char *rid);
00097 int do_Load(char *rid);
00098 int do_Mkdir(char *rid, int do4real);
00099 int do_Mkpath(char *rid, int do4real);
00100 int do_Mv(char *rid, int do4real);
00101 int do_Ping(char *rid);
00102 int do_Pong(char *rid);
00103 int do_Port(char *rid);
00104 int do_PrepAdd(char *rid, int server=0);
00105 static int do_PrepAdd4Real(XrdOlbPrepArgs *pargs);
00106 int do_PrepDel(char *rid, int server=0);
00107 static int do_PrepSel(XrdOlbPrepArgs *pargs, int stage);
00108 int do_Rm(char *rid, int do4real);
00109 int do_Rmdir(char *rid, int do4real);
00110 int do_RST(char *rid);
00111 int do_Select(char *rid, int refresh=0);
00112 int do_Space(char *rid);
00113 int do_State(char *rid, int reset);
00114 int do_StateFWD(char *tp, int reset);
00115 int do_Stats(char *rid, int wantdata);
00116 int do_StNst(char *rid, int Resume);
00117 int do_SuRes(char *rid, int Resume);
00118 int do_Try(char *rid);
00119 int do_Usage(char *rid);
00120 int getMode(const char *, const char *, const char *, mode_t &);
00121 static int Inform(const char *cmd, XrdOlbPrepArgs *pargs);
00122 static int isOnline(char *path, int upt=1, XrdNetLink *lnk=0);
00123 int Mkpath(char *local_path, mode_t mode);
00124 char *prepScan(char **Line,XrdOlbPrepArgs *pargs,const char *Etxt);
00125 char *Receive(char *idbuff, int blen);
00126 int Reissue(char *rid, const char *op, char *arg1, char *path, char *arg3=0);
00127
00128 static XrdNetLink *Relay;
00129 XrdSysMutex myMutex;
00130 XrdNetLink *Link;
00131 unsigned int IPAddr;
00132 XrdOlbServer *Next;
00133 time_t DropTime;
00134 XrdOlbDrop *DropJob;
00135 XrdOlbRRQInfo Info;
00136 XrdOlbReq Req;
00137
00138 SMask_t ServMask;
00139 int ServID;
00140 int Instance;
00141 int Port;
00142 int myLevel;
00143 char *mySID;
00144 char *myName;
00145 char *myNick;
00146 char *Stype;
00147
00148 static const int redr_iov_cnt = 3;
00149 struct iovec redr_iov[redr_iov_cnt];
00150
00151 int pingpong;
00152 int newload;
00153 int logload;
00154 int DiskFree;
00155 int DiskNums;
00156 int DiskTotu;
00157 int myCost;
00158 int myLoad;
00159 int RefA;
00160 int RefTotA;
00161 int RefR;
00162 int RefTotR;
00163
00164
00165
00166 static XrdSysMutex mlMutex;
00167 static int xeq_load;
00168 static int cpu_load;
00169 static int mem_load;
00170 static int pag_load;
00171 static int net_load;
00172 static int dsk_free;
00173 static int dsk_totu;
00174 };
00175 #endif