00001 #ifndef __XRDXROOTDMONITOR__
00002 #define __XRDXROOTDMONITOR__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <inttypes.h>
00034 #include <stdlib.h>
00035 #include <time.h>
00036 #include <netinet/in.h>
00037 #include <sys/types.h>
00038
00039 #include "XrdSys/XrdSysPthread.hh"
00040 #include "XrdXrootd/XrdXrootdMonData.hh"
00041 #include "XProtocol/XPtypes.hh"
00042
00043
00044
00045
00046
00047 #define XROOTD_MON_ALL 1
00048 #define XROOTD_MON_FILE 2
00049 #define XROOTD_MON_IO 4
00050 #define XROOTD_MON_INFO 8
00051 #define XROOTD_MON_USER 16
00052 #define XROOTD_MON_AUTH 32
00053 #define XROOTD_MON_PATH (XROOTD_MON_IO | XROOTD_MON_FILE)
00054 #define XROOTD_MON_REDR 64
00055 #define XROOTD_MON_IOV 128
00056 #define XROOTD_MON_FSTA 256
00057
00058 #define XROOTD_MON_FSLFN 1
00059 #define XROOTD_MON_FSOPS 2
00060 #define XROOTD_MON_FSSSQ 4
00061 #define XROOTD_MON_FSXFR 8
00062
00063 class XrdScheduler;
00064 class XrdNetMsg;
00065 class XrdXrootdMonFile;
00066
00067
00068
00069
00070
00071 class XrdXrootdMonitor
00072 {
00073 public:
00074 class User;
00075 friend class User;
00076 friend class XrdXrootdMonFile;
00077
00078
00079
00080 inline void Add_rd(kXR_unt32 dictid,
00081 kXR_int32 rlen,
00082 kXR_int64 offset)
00083 {Add_io(dictid, rlen, offset);}
00084
00085 inline void Add_rv(kXR_unt32 dictid,
00086 kXR_int32 rlen,
00087 kXR_int16 vcnt,
00088 kXR_char vseq,
00089 kXR_char vtype)
00090 {if (lastWindow != currWindow) Mark();
00091 else if (nextEnt == lastEnt) Flush();
00092 monBuff->info[nextEnt].arg0.id[0] = vtype;
00093 monBuff->info[nextEnt].arg0.id[1] = vseq;
00094 monBuff->info[nextEnt].arg0.sVal[1] = vcnt;
00095 monBuff->info[nextEnt].arg0.rTot[1] = 0;
00096 monBuff->info[nextEnt].arg1.buflen = rlen;
00097 monBuff->info[nextEnt++].arg2.dictid = dictid;
00098 }
00099
00100 inline void Add_wr(kXR_unt32 dictid,
00101 kXR_int32 wlen,
00102 kXR_int64 offset)
00103 {Add_io(dictid,(kXR_int32)htonl(-wlen),offset);}
00104
00105 void appID(char *id);
00106
00107 void Close(kXR_unt32 dictid, long long rTot, long long wTot);
00108
00109 void Disc(kXR_unt32 dictid, int csec, char Flags=0);
00110
00111 static void Defaults(char *dest1, int m1, char *dest2, int m2);
00112 static void Defaults(int msz, int rsz, int wsz,
00113 int flush, int flash, int iDent, int rnm,
00114 int fsint=0, int fsopt=0, int fsion=0);
00115
00116 static void Ident() {Send(-1, idRec, idLen);}
00117
00118 static int Init(XrdScheduler *sp, XrdSysError *errp,
00119 const char *iHost, const char *iProg,
00120 const char *iName, int Port);
00121
00122 void Open(kXR_unt32 dictid, off_t fsize);
00123
00124 static int Redirect() {return monREDR;}
00125
00126 static int Redirect(kXR_unt32 mID, const char *hName, int Port,
00127 const char opC, const char *Path);
00128
00129 static time_t Tick();
00130
00131 class User
00132 {
00133 public:
00134
00135 XrdXrootdMonitor *Agent;
00136 kXR_unt32 Did;
00137 char Iops;
00138 char Fops;
00139 short Len;
00140 char *Name;
00141
00142 inline int Auths() {return XrdXrootdMonitor::monAUTH;}
00143
00144 void Clear() {if (Name) {free(Name); Name = 0; Len = 0;}
00145 if (Agent) {Agent->unAlloc(Agent); Agent = 0;}
00146 Did = 0; Iops = Fops = 0;
00147 }
00148
00149 void Enable();
00150
00151 void Disable();
00152
00153 inline int Files() {return (Agent ? Fops : 0);}
00154
00155 inline int Fstat() {return monFSTAT;}
00156
00157 inline int Info() {return (Agent ? XrdXrootdMonitor::monINFO : 0);}
00158
00159 inline int InOut() {return (Agent ? Iops : 0);}
00160
00161 inline int Logins() {return (Agent ? XrdXrootdMonitor::monUSER : 0);}
00162
00163 inline kXR_unt32 MapInfo(const char *Info)
00164 {return XrdXrootdMonitor::Map(XROOTD_MON_MAPINFO,
00165 *this, Info);
00166 }
00167
00168 inline kXR_unt32 MapPath(const char *Path)
00169 {return XrdXrootdMonitor::Map(XROOTD_MON_MAPPATH,
00170 *this, Path);
00171 }
00172
00173 void Register(const char *Uname, const char *Hname,
00174 const char *Pname);
00175
00176 void Report(const char *Info)
00177 {Did=XrdXrootdMonitor::Map(XROOTD_MON_MAPUSER,*this,Info);}
00178
00179 inline int Ready() {return XrdXrootdMonitor::monACTIVE;}
00180
00181 User() : Agent(0), Did(0), Iops(0), Fops(0), Len(0), Name(0) {}
00182 ~User() {Clear();}
00183 };
00184
00185 static XrdXrootdMonitor *altMon;
00186
00187 XrdXrootdMonitor();
00188
00189 static const int rdrMax = 8;
00190
00191 private:
00192 ~XrdXrootdMonitor();
00193
00194 static
00195 struct MonRdrBuff
00196 {MonRdrBuff *Next;
00197 XrdXrootdMonBurr *Buff;
00198 int nextEnt;
00199 int flushIt;
00200 kXR_int32 lastTOD;
00201 XrdSysMutex Mutex;
00202 } rdrMon[rdrMax];
00203 static MonRdrBuff *rdrMP;
00204 static XrdSysMutex rdrMutex;
00205
00206 inline void Add_io(kXR_unt32 duid, kXR_int32 blen, kXR_int64 offs)
00207 {if (lastWindow != currWindow) Mark();
00208 else if (nextEnt == lastEnt) Flush();
00209 monBuff->info[nextEnt].arg0.val = offs;
00210 monBuff->info[nextEnt].arg1.buflen = blen;
00211 monBuff->info[nextEnt++].arg2.dictid = duid;
00212 }
00213 static XrdXrootdMonitor *Alloc(int force=0);
00214 unsigned char do_Shift(long long xTot, unsigned int &xVal);
00215 void Dup(XrdXrootdMonTrace *mrec);
00216 static void fillHeader(XrdXrootdMonHeader *hdr,
00217 const char id, int size);
00218 static MonRdrBuff *Fetch();
00219 void Flush();
00220 static void Flush(MonRdrBuff *mP);
00221 static kXR_unt32 GetDictID();
00222 static kXR_unt32 Map(char code, XrdXrootdMonitor::User &uInfo,
00223 const char *path);
00224 void Mark();
00225 static int Send(int mmode, void *buff, int size);
00226 static void startClock();
00227 static void unAlloc(XrdXrootdMonitor *monp);
00228
00229 static XrdScheduler *Sched;
00230 static XrdSysError *eDest;
00231 static XrdSysMutex windowMutex;
00232 static char *idRec;
00233 static int idLen;
00234 static char *Dest1;
00235 static int monMode1;
00236 static XrdNetMsg *InetDest1;
00237 static char *Dest2;
00238 static int monMode2;
00239 static XrdNetMsg *InetDest2;
00240 XrdXrootdMonBuff *monBuff;
00241 static int monBlen;
00242 int nextEnt;
00243 static int lastEnt;
00244 static int lastRnt;
00245 static int autoFlash;
00246 static int autoFlush;
00247 static int FlushTime;
00248 static kXR_int32 startTime;
00249 kXR_int32 lastWindow;
00250 static kXR_int32 currWindow;
00251 static int rdrTOD;
00252 static int rdrWin;
00253 static int rdrNum;
00254 static kXR_int32 sizeWindow;
00255 static int isEnabled;
00256 static int numMonitor;
00257 static int monIdent;
00258 static int monRlen;
00259 static char sidName[16];
00260 static short sidSize;
00261 static char monIO;
00262 static char monINFO;
00263 static char monFILE;
00264 static char monREDR;
00265 static char monUSER;
00266 static char monAUTH;
00267 static char monACTIVE;
00268 static char monFSTAT;
00269 static char monCLOCK;
00270 };
00271 #endif