ROOT logo
// $Id: XrdMonSucker.cxx 2823 2012-07-14 02:13:27Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "XrdMonSucker.h"
#include "XrdFileCloseReporter.h"
#include "Glasses/UdpPacketSource.h"
#include "Glasses/ZHashList.h"
#include "Glasses/ZLog.h"
#include "XrdMonSucker.c7"

#include "XrdDomain.h"
#include "XrdServer.h"
#include "XrdUser.h"
#include "XrdFile.h"

#include "Stones/SUdpPacket.h"
#include "Gled/GThread.h"

#include "XrdMon/XrdXrootdMonData.h"

#include <cerrno>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

namespace
{
  const Double_t One_MB = 1024 * 1024;
}

// XrdMonSucker

//______________________________________________________________________________
//
// Enabling trace reports for XrdUser matching those regexps:
//   mTraceDN, mTraceHost, mTraceDomain (clent, not server)
// The match is done at login time.

ClassImp(XrdMonSucker);

//==============================================================================

void XrdMonSucker::_init()
{
  mSuckPort  = 9929;

  mUserKeepSec = 300;
  mUserDeadSec = 86400;
  mServDeadSec = 86400;
  mServIdentSec = 300;
  mServIdentCnt = 5;

  mPacketCount = mSeqIdFailCount = 0;

  mSocket = 0;
  mSuckerThread = 0;
  mLastOldUserCheck  = mLastDeadUserCheck  =
  mLastDeadServCheck = mLastIdentServCheck = GTime(GTime::I_Never);

  bTraceAllNull = true;
}

XrdMonSucker::XrdMonSucker(const Text_t* n, const Text_t* t) :
  ZNameMap(n, t)
{
  _init();
  SetElementFID(XrdDomain::FID());
}

XrdMonSucker::~XrdMonSucker()
{}

void XrdMonSucker::AdEnlightenment()
{
  PARENT_GLASS::AdEnlightenment();
  if (mOpenFiles == 0)
  {
    assign_link<ZHashList>(mOpenFiles, FID(), "OpenFiles");
    mOpenFiles->SetElementFID(XrdFile::FID());
  }
  if (mFCReporters == 0)
  {
    assign_link<ZHashList>(mFCReporters, FID(), "FileCloseReporters");
    mFCReporters->SetElementFID(XrdFileCloseReporter::FID());
    mFCReporters->SetMIRActive(false);
  }
}

//==============================================================================

void XrdMonSucker::AddFileCloseReporter(XrdFileCloseReporter* fcr)
{
  mFCReporters->Add(fcr);
}

void XrdMonSucker::RemoveFileCloseReporter(XrdFileCloseReporter* fcr)
{
  mFCReporters->Remove(fcr);
}

//==============================================================================

void XrdMonSucker::on_file_open(XrdFile* file)
{
  auto_ptr<ZMIR> mir( mOpenFiles->S_Add(file) );
  mSaturn->ShootMIR(mir);
}

void XrdMonSucker::on_file_close(XrdFile* file, XrdUser* user, XrdServer* server)
{
  Stepper<XrdFileCloseReporter> stepper(*mFCReporters);
  while (stepper.step())
  {
    stepper->FileClosed(file, user, server);
  }

  {
    auto_ptr<ZMIR> mir( mOpenFiles->S_Remove(file) );
    mSaturn->ShootMIR(mir);
  }
}

//------------------------------------------------------------------------------

void XrdMonSucker::disconnect_user_and_close_open_files(XrdUser* user, XrdServer* server,
                                                        const GTime& time)
{
  static const Exc_t _eh("XrdMonSucker::disconnect_user_and_close_open_files ");

  {
    GLensReadHolder _lck(user);
    user->SetDisconnectTime(time);
  }

  list<XrdFile*> open_files;
  user->CopyListByGlass<XrdFile>(open_files);
  for (list<XrdFile*>::iterator fi = open_files.begin(); fi != open_files.end(); ++fi)
  {
    XrdFile *file = *fi;
    Bool_t closed = false;
    {
      GLensReadHolder _lck(file);
      if (file->IsOpen())
      {
        file->SetCloseTime(time);
        closed = true;
      }
    }
    if (closed)
    {
      {
        GLensReadHolder _lck(server);
	try
	{
	  server->RemoveFile(file);
	}
	catch (Exc_t exc)
	{
	  if (*mLog)
	    mLog->Put(ZLog::L_Error, _eh, exc);
	}
      }
      on_file_close(file, user, server);
    }
  }
  {
    GLensWriteHolder _lck(server);
    try
    {
      server->DisconnectUser(user);
    }
    catch (Exc_t exc)
    {
      if (*mLog)
	mLog->Put(ZLog::L_Error, _eh, exc);
    }
  }
}

//------------------------------------------------------------------------------

void XrdMonSucker::disconnect_server(XrdServer* server, XrdDomain *domain,
				     const GTime& time)
{
  {
    GMutexHolder _lck(m_xrd_servers_mutex);
    m_xrd_servers.erase(server->m_server_id);
  }
  {
    list<XrdUser*> users;
    server->CopyListByGlass<XrdUser>(users);
    for (list<XrdUser*>::iterator ui = users.begin(); ui != users.end(); ++ui)
    {
      XrdUser *user = *ui;
      disconnect_user_and_close_open_files(user, server, time);
    }
  }
  mSaturn->ShootMIR( mQueen->S_RemoveLenses(server->GetPrevUsers()) );
  mSaturn->ShootMIR( domain->S_RemoveAll(server) );
}

//==============================================================================

void* XrdMonSucker::tl_Suck(XrdMonSucker* s)
{
  s->Suck();
  // Usually cancelled from StopSucker().
  s->mSuckerThread = 0;
  return 0;
}

void XrdMonSucker::Suck()
{
  static const Exc_t _eh("XrdMonSucker::Suck ");

  TPMERegexp ip4addr_re ("(\\d+\\.\\d+\\.\\d+)\\.(\\d+)", "o");
  TPMERegexp username_re("(\\w+)\\.(\\d+):(\\d+)@(.+)", "o");
  TPMERegexp hostname_re("([^\\.]+)\\.(.*)", "o");
  TPMERegexp authinfo_re("^&p=(.*)&n=(.*)&h=(.*)&o=(.*)&r=(.*)&g=(.*)&m=(.*)$", "o");
  TPMERegexp authxxxx_re("^&p=(.*)&n=(.*)&h=(.*)&o=(.*)&r=(.*)$", "o");

  while (true)
  {
    SUdpPacket *p = mUdpQueue.PopFront();

    GTime recv_time(p->mRecvTime);

    {
      GLensReadHolder _lck(this);
      if (++mPacketCount % 1000 == 0)
        Stamp(FID());
    }

    XrdXrootdMonHeader *xmh = (XrdXrootdMonHeader*) p->mBuff;
    Char_t   code = xmh->code;
    UChar_t  pseq = xmh->pseq;
    UShort_t plen = ntohs(xmh->plen);
    Int_t    stod = ntohl(xmh->stod);
    UInt_t   in4a = p->Ip4AsUInt(); // Kept in net order
    UShort_t port = p->mPort;

    SXrdServerId xsid(in4a, stod, port);
    xrd_hash_i   xshi;
    bool         server_not_known;
    {
      GMutexHolder _lck(m_xrd_servers_mutex);
      xshi = m_xrd_servers.find(xsid);
      server_not_known = (xshi == m_xrd_servers.end());
    }

    ZLog::Helper log(*mLog, recv_time, ZLog::L_Info, _eh);

    XrdServer *server = 0;
    XrdDomain *domain = 0;

    if (server_not_known)
    {
      sockaddr_in  sa4;
      sockaddr_in6 sa6;
      sockaddr    *sa = 0;
      socklen_t    sl;
      if (p->mAddrLen == 4)
      {
	sa4.sin_family = AF_INET;
	memcpy(&sa4.sin_addr.s_addr, p->mAddr, p->mAddrLen);
	sa = (sockaddr*) &sa4;
	sl = sizeof(sa4);
      }
      else
      {
	sa6.sin6_family = AF_INET6;
	memcpy(sa6.sin6_addr.s6_addr, p->mAddr, p->mAddrLen);
	sa = (sockaddr*) &sa6;
	sl = sizeof(sa6);
      }

      Char_t   hn_buf[64];
      getnameinfo((sockaddr*) sa, sl, hn_buf, 64, 0, 0, NI_DGRAM);

      TString fqhn(hn_buf);
      fqhn.ToLower();
      if (hostname_re.Match(fqhn) != 3)
      {
        char *foo = (char*) &in4a;
        log.Form(ZLog::L_Error, "New server NS lookup problem: %hhu.%hhu.%hhu.%hhu:%hu, fqdn='%s'.",
                 foo[0], foo[1], foo[2], foo[3], port, hn_buf);
	continue;
      }

      log.Form(ZLog::L_Message, "New server: %s.%s:%hu stod=%d",
	       hostname_re[1].Data(), hostname_re[2].Data(), port, stod);

      server = new XrdServer(GForm("%s.%s : %d : %hu", hostname_re[1].Data(), hostname_re[2].Data(), stod, port),
                             "", hostname_re[1], hostname_re[2], GTime(stod));
      server->m_server_id = xsid;

      domain = static_cast<XrdDomain*>(GetElementByName(server->GetDomain()));
      if (!domain)
      {
        domain = new XrdDomain(server->GetDomain());
        // ZQueen::CheckIn() does write lock.
        mQueen->CheckIn(domain);
        {
          GLensWriteHolder _lck(this);
          Add(domain);
        }
      }

      // ZQueen::CheckIn() does write lock.
      mQueen->CheckIn(server);
      {
        GLensWriteHolder _lck(domain);
        domain->Add(server);
      }
      {
        GMutexHolder _lck(m_xrd_servers_mutex);
        xshi = m_xrd_servers.insert(make_pair(xsid, server)).first;
      }
    }
    else
    {
      server = xshi->second;
      domain = static_cast<XrdDomain*>(GetElementByName(server->GetDomain()));
    }

    {
      GLensReadHolder _lck(server);
      server->IncPacketCount();
      server->SetLastMsgTime(recv_time);
    }
    {
      GLensReadHolder _lck(domain);
      domain->IncPacketCount();
    }

    // Check sequence id. No remedy attempted.
    if (code == 'u' || code == 'd' || code == 't' || code == 'i' || code == 'r')
    {
      if (server->IsSrvSeqInited())
      {
	UChar_t srv_seq = server->IncAndGetSrvSeq();
	if (pseq != srv_seq)
	{
	  log.Form(ZLog::L_Warning, "Sequence-id mismatch at '%s' srv=%hhu, msg=%hhu; code=%c. Ignoring.",
		   server->GetName(), srv_seq, pseq, code);
	  server->InitSrvSeq(pseq);
          {
            GLensReadHolder _lck(server);
            server->IncSeqIdFailCount();
          }
          {
            GLensReadHolder _lck(domain);
            domain->IncSeqIdFailCount();
          }
          {
            GLensReadHolder _lck(this);
            ++mSeqIdFailCount;
            Stamp(FID());
          }
	}
      }
      else
      {
	server->InitSrvSeq(pseq);
      }
    }

    // Check length of message .vs. length claimed by xrd.
    if (p->mBuffLen != plen)
    {
      log.Form(ZLog::L_Warning, "Message size mismatch: got %zd, xrd-len=%hu.", p->mBuffLen, plen);
      // This means either our buf-size is too small or the other guy is pushing it.
      // Should probably stop reporting errors from this IP.
      // XXXX Do additional checks in here about buf-size, got less, etc.
      continue;
    }

    if (code != 't' && code != 'r')
    {
      TString msg;
      msg.Form("Message from %s.%s:%hu, c=%c, seq=%hhu, len=%hu",
               server->GetHost(), server->GetDomain(), port,
               xmh->code, pseq, plen);

      XrdXrootdMonMap *xmm     = (XrdXrootdMonMap*) p->mBuff;
      Int_t            dict_id = ntohl(xmm->dictid);

      (p->mBuff)[plen] = 0; // 0-terminate the buffer at packet length.

      char *prim = xmm->info;
      char *sec  = strstr(prim, "\n");
      if (sec) {
	*(sec++) = 0;
      }

      if (code == 'u')
      {
	msg += TString::Format("\n\tUser map -- id=%d, uname=%s", dict_id, prim);
	TString uname(prim), host, domain;
        Bool_t  numeric_host = false;
        {
          if (username_re.Match(uname) != 5)
          {
            msg += " ... parse error.";
            log.Put(ZLog::L_Error, msg);
            continue;
          }

          if (ip4addr_re.Match(username_re[4]) == 3)
          {
            // Numeric ip, assume private subnet (event though we really don't
            // know as this is blindly taken from client and subnet can
            // actually be anywhere in the world).
            msg += TString::Format("@%s", server->GetDomain());
            host = ip4addr_re[0];
            domain = server->RefDomain();
            numeric_host = true;
          }
          else if (hostname_re.Match(username_re[4]) == 3)
          {
            // Domain given
            host   = hostname_re[1];
            domain = hostname_re[2];
          }
          else
          {
            // No domain, same as XrdServer
            msg += TString::Format(".%s", server->GetDomain());
            host   = username_re[4];
            domain = server->RefDomain();
          }

          if (username_re[1] == mNagiosUser && host.BeginsWith(mNagiosHost) && domain.BeginsWith(mNagiosDomain))
          {
            // msg += TString::Format(" ... it is nagios, skipping it.\n");
            // cout << msg;
            continue;
          }

          // Go figure, in fall 2011 MIT was sending two user-map messages.
	  // The problem with this is that file-map uses user-name to identify
          // user ... and obviously the files were assigned to the wrong one +
          // one session remained open forever.
          {
            XrdUser *xu = server->FindUser(uname);
            if (xu != 0)
            {
              msg += "\n\tUsername was already taken -- deleting old user!";
              disconnect_user_and_close_open_files(xu, server, recv_time);
            }
          }

          if (server->ExistsUserDictId(dict_id))
          {
            msg += "\n\tUser dict_id already taken ... this session will not be tracked.";
            log.Put(ZLog::L_Warning, msg);
            continue;
          }
        }

        XrdUser *user = 0;
        try
        {
          TString  dn;
          {
            TString     group;
            TPMERegexp *a_rep = 0;
            if (authinfo_re.Match(sec) == 8)
            {
              group =  authinfo_re[6];
              dn    =  authinfo_re[7];
              a_rep = &authinfo_re;
            }
            else if (authxxxx_re.Match(sec) == 6)
            {
              group =  "<unknown>";
              dn    =  "<unknown>";
              a_rep = &authxxxx_re;
            }
            else
            {
              msg += GForm("\n\tUnparsable auth-info: '%s'", sec);
            }

            if (a_rep)
            {
              TPMERegexp &a_re = *a_rep;

              msg += GForm("\n\tDN=%s, VO=%s, Role=%s, Group=%s",
                           dn.Data(), a_re[4].Data(), a_re[5].Data(), group.Data());

              user = new XrdUser(uname, "", dn, a_re[4], a_re[5], group,
                                 a_re[2], host, domain, numeric_host, recv_time);
            }
            else
            {
              user = new XrdUser(uname, "", "", "", "", "",
                                 "", host, domain, numeric_host, recv_time);
            }
            // ZQueen::CheckIn() does write lock.
            mQueen->CheckIn(user);
          }

          {
            GLensWriteHolder _lck(server);
            server->AddUser(user, dict_id);
          }
          {
            GLensWriteHolder _lck(user);
            user->SetServer(server);

            if ( ! bTraceAllNull && mTraceDN_RE.Match(dn) &&
                 mTraceHost_RE.Match(host) && mTraceDomain_RE.Match(domain))
            {
              user->SetTraceMon(true);
            }          
          }
        }
        catch (Exc_t exc)
        {
          msg += "\n\tException caught while instantiating XrdUser:\n\t" + exc;
          log.Put(ZLog::L_Error, msg);
          continue;
        }

	// XXX Eventually ... grep / create GridUser.
      }
      else if (code == 'd')
      {
        TString uname(prim);
        TString path (sec);
	msg += TString::Format("\n\tPath map -- id=%d, uname=%s path=%s",
                               dict_id, uname.Data(), path.Data());
	XrdUser *user = server->FindUser(uname);
	if (user)
	{
	  if (server->ExistsFileDictId(dict_id))
	  {
	    msg += "\n\tFile dict_id already taken ... this file will not be tracked.";
            log.Put(ZLog::L_Warning, msg);
	    continue;
	  }

	  // create XrdFile
          try
          {
            XrdFile *file = new XrdFile(path);
            mQueen->CheckIn(file);
            {
              GLensWriteHolder _lck(user);
              user->AddFile(file);
              user->SetLastMsgTime(recv_time);
            }
            {
              GLensWriteHolder _lck(file);
              file->SetUser(user);
              file->SetOpenTime(recv_time);
              file->SetLastMsgTime(recv_time);
            }
            {
              GLensWriteHolder _lck(server);
              server->AddFile(file, dict_id);
            }

            on_file_open(file);
          }
          catch (Exc_t exc)
          {
            msg += "\n\tException caught while instantiating XrdFile:\n\t" + exc;
            log.Put(ZLog::L_Error, msg);
            continue;
          }
	}
	else
	{
          if ( ! uname.BeginsWith(mNagiosUser))
          {
            msg += "\n\tUser not found ... skipping.";
            log.Put(ZLog::L_Warning, msg);
          }
	  continue;
	}
      }
      else if (code == 'i')
      {
        TString uname(prim);
        TString info (sec);
	msg += TString::Format("\n\tInfo map -- id=%d, uname=%s info=%s",
                               dict_id, uname.Data(), info.Data());

	XrdUser *user = server->FindUser(uname);
	if (user)
        {
          GLensWriteHolder _lck(user);
          user->AppendAppInfo(info);
          user->SetLastMsgTime(recv_time);
        }
        else
        {
          msg += "\n\tUser not found ... skipping.";
          log.Put(ZLog::L_Warning, msg);
        }
      }
      else if (code == '=')
      {
	GLensWriteHolder _lck(server);
	server->UpdateSrvIdTime(recv_time);
	msg += TString::Format("\n\tServerId -- uname=%s other=%s", prim, sec);
      }
      else
      {
	msg += TString::Format("\n\tOther %c -- id=%u, uname=%s other=%s", code, dict_id, prim, sec);
      }

      log.Put(msg);
    }
    else if (code == 't') // this is a trace message
    {
      struct local_cache
      {
	XrdServer        *fSrv;
	XrdXrootdMonBuff *fXmb;

	XrdFile          *fFile;
	Int_t             fDictId;

	Int_t             fTi, fTiWEnd; // time-idx, time-idx-window-end
	const Int_t       fN;
	GTime             fTime;
	Double_t          fTimeStep;

	local_cache(XrdServer* s, XrdXrootdMonBuff* b, Int_t plen) :
	  fSrv(s), fXmb(b),
	  fFile(0), fDictId(0),
	  fTi(-1), fTiWEnd(-1),
	  fN((plen - sizeof(XrdXrootdMonHeader)) / sizeof(XrdXrootdMonTrace))
	{}

	XrdXrootdMonTrace& trace()        { return fXmb->info[fTi]; }
	XrdXrootdMonTrace& trace(int idx) { return fXmb->info[idx]; }

	UChar_t trace_type()        { return trace().arg0.id[0]; }
	UChar_t trace_type(int idx) { return trace(idx).arg0.id[0]; }

        Int_t full_delta_time()
        {
          return ntohl(trace(fN-1).arg1.Window) - ntohl(trace(0).arg2.Window);
        }

	Bool_t next(TString& log_msg, Bool_t verbose=false)
	{
	  if (++fTi < fN)
	  {
	    if (trace_type() == XROOTD_MON_WINDOW)
	    {
	      fTiWEnd = fTi + 1;
	      while (fTiWEnd < fN && trace(fTiWEnd).arg0.id[0] != XROOTD_MON_WINDOW)
		++fTiWEnd;
	      if (fTiWEnd >= fN)
		return false;

	      Int_t n_div = fTiWEnd - fTi - 2;
	      fTime = GTime(ntohl(trace().arg2.Window));
	      fTimeStep = (n_div >= 1) ?
		(GTime(ntohl(trace(fTiWEnd).arg1.Window)) - fTime).ToDouble() / n_div :
		0;

              if (verbose)
                log_msg += GForm("\n\tWindow iB=%2d iE=%2d N=%2d delta_t=%f -- start %s.",
                                 fTi, fTiWEnd, fTiWEnd-fTi-1, fTimeStep, fTime.ToDateTimeLocal(false).Data());

	      ++fTi;
	    }
	    else
	    {
	      fTime += fTimeStep;
	    }
	    return true;
	  }
	  return false;
	}

	XrdFile* update(Int_t newid)
	{
	  if (newid != fDictId)
	  {
	    fFile   = fSrv->FindFile(newid);
	    fDictId = newid;
	  }
	  return fFile;
	}

	const char* trace_type_name()
	{
	  const char *c;
	  switch (trace_type())
	  {
	    case XROOTD_MON_APPID:  c = "apm"; break;
	    case XROOTD_MON_CLOSE:  c = "cls"; break;
	    case XROOTD_MON_DISC:   c = "dis"; break;
	    case XROOTD_MON_OPEN:   c = "opn"; break;
	    case XROOTD_MON_WINDOW: c = "win"; break;
	    default:                c = "rdw"; break;
	  }
	  return c;
	}

        XrdUser* find_user()
        {
          // This is called at the beginning of message processing to get the
          // user and to determine if we need to dump debug-level information.
          // This definitely does not work as intended when servers are not
          // configured to send io traces.
          // Ah, this is also used to set the time of last message on a user.
          for (Int_t i = 1; i < fN; ++i)
          {
            XrdXrootdMonTrace &xmt = trace(i);
            UChar_t tt = trace_type(i);
            if (tt <= 0x7F || tt == XROOTD_MON_OPEN || tt == XROOTD_MON_CLOSE)
            {
              update(ntohl(xmt.arg2.dictid));
              if (fFile) return fFile->GetUser();
            }
            else if (tt == XROOTD_MON_DISC)
            {
              return fSrv->FindUser(ntohl(xmt.arg2.dictid));
            }
          }
          return 0;
        }
      };

      local_cache lc(server, (XrdXrootdMonBuff*) p->mBuff, plen);

      XrdUser *us = lc.find_user();
      Bool_t  vrb = us && us->GetTraceMon();
      TString msg, msg_vrb;

      while (lc.next(msg_vrb, vrb))
      {
	Int_t ti = lc.fTi;
	XrdXrootdMonTrace &xmt = lc.trace();
	UChar_t       tt  = lc.trace_type();
	const Char_t *ttn = lc.trace_type_name();

        // if (vrb) msg_vrb += GForm("\n\t%-2d: %hhx %s", ti, tt, ttn);

        XrdFile *file = 0;

        if (tt <= 0x7F)
        {
	  Int_t dict_id = ntohl(xmt.arg2.dictid);
          file = lc.update(dict_id);
          if (file)
          {
	    us = file->GetUser();
            // Int_t rwoff = ntohl(arg.arg0.val);
            Int_t rwlen = ntohl(xmt.arg1.buflen);
            GLensReadHolder _lck(file);
            if (rwlen >= 0)
            {
              file->AddReadSample ( rwlen / One_MB);
            }
            else
            {
              file->AddWriteSample(-rwlen / One_MB);
            }
            file->SetLastMsgTime(lc.fTime);
          }
        }
        else if (tt == XROOTD_MON_READV)
        {
	  Int_t dict_id = ntohl(xmt.arg2.dictid);
          file = lc.update(dict_id);
          if (file)
          {
	    us = file->GetUser();
            Int_t rlen = ntohl(xmt.arg1.buflen);
            Int_t nels = ntohs(xmt.arg0.sVal[1]);
            // Not processed: vcnt and vseq (for multi file read)
            GLensReadHolder _lck(file);
            file->AddVecReadSample(rlen / One_MB, nels);
            file->SetLastMsgTime(lc.fTime);
          }
        }
	else if (tt == XROOTD_MON_OPEN || tt == XROOTD_MON_CLOSE)
	{
	  Int_t dict_id = ntohl(xmt.arg2.dictid);
	  file = lc.update(dict_id);
          if (vrb) msg_vrb += GForm("\n\t%2d: %s, file='%s'", ti, ttn, file ? file->GetName() : "<nil>");
          if (file)
          {
	    us = file->GetUser();
            if (tt == XROOTD_MON_OPEN)
            {
              msg += GForm("\n\tOpen file='%s'", file ? file->GetName() : "<nil>");
              union { Long64_t val; UChar_t id[8]; } jebo;
              jebo.val = xmt.arg0.val;
              jebo.id[0] = 0;

	      GLensReadHolder _lck(file);
              file->SetSizeMB(net2host(jebo.val) / One_MB);
	      // This should, in principle, be always true ... but some
	      // pre-3.1 xrootds can get this screwed up pretty badly.
	      if (lc.fTime < file->RefOpenTime())
	      {
		file->SetOpenTime(lc.fTime);
	      }
	      file->SetLastMsgTime(lc.fTime);
            }
            else
            {
	      {
		GLensReadHolder _lck(file);
		file->SetLastMsgTime(lc.fTime);
		ULong64_t x;
		x = ntohl(xmt.arg0.rTot[1]);
		x <<= xmt.arg0.id[1];
		file->SetRTotalMB(x / One_MB);
		x = ntohl(xmt.arg1.wTot);
		x <<= xmt.arg0.id[2];
		file->SetWTotalMB(x / One_MB);
		file->SetCloseTime(lc.fTime);
	      }
              msg += GForm("\n\tClose file='%s'", file ? file->GetName() : "<nil>");
	      {
		GLensReadHolder _lck(server);
		try
		{
		  server->RemoveFile(file);
		}
		catch (Exc_t exc)
		{
		  if (*mLog)
		    mLog->Put(ZLog::L_Error, _eh, exc);
		}
	      }
              on_file_close(file, us, server);
            }
          }
	}
	else if (tt == XROOTD_MON_DISC)
	{
	  Int_t    dict_id        = ntohl(xmt.arg2.dictid);
	  XrdUser *us_from_server = server->FindUser(dict_id);
	  if (us != us_from_server)
	  {
	    log.Form(ZLog::L_Warning, _eh + "us != us_from_server: us=%p ('%s'), us_from_server=%p ('%s')",
                     us,             us ? us->GetName() : "",
                     us_from_server, us_from_server ? us_from_server->GetName() : "");
	    if (us_from_server) {
	      us = us_from_server;
	    }
	  }

          bool disconn_p = true;
          TString extra;
          if (xmt.arg0.id[1] & XROOTD_MON_FORCED) {
            extra += "(forced)";
          }
          if (xmt.arg0.id[1] & XROOTD_MON_BOUNDP) {
            disconn_p = false;
            extra += "(bound-path)";
          }

          msg += GForm("\n\tDisconnect%s user='%s'", extra.Data(), us ? us->GetName() : "<nil>");

	  if (vrb) msg_vrb += GForm("\n\t%2d: %s%s, user=%s", ti, ttn, extra.Data(), us ? us->GetName() : "<nil>");
	  if (disconn_p && us)
	  {
            disconnect_user_and_close_open_files(us, server, lc.fTime);
	  }
	}
      } // while trace entries

      if ( ! msg.IsNull() || vrb)
      {
        TString txt;
        txt.Form("Trace from %s.%s:%hu, user='%s', N=%d, dt=%d, seq=%hhu, len=%hu.",
                 server->GetHost(), server->GetDomain(), port, us ? us->GetName() : "<nil>",
                 lc.fN, lc.full_delta_time(), pseq, plen);
        txt += msg;
        if (vrb) txt += msg_vrb;
        log.Put(txt);
      }

      if (us)
      {
        GLensReadHolder _lck(us);
        us->SetLastMsgTime(lc.fTime);
      }

    } // else -- trace message handling
    else if (code == 'r')
    {
      // XXXX Check for 'r' records, dump basic info to see what else to check / account for.
      //  - 'r' probably has the pseq but it will be coming from a master /
      //    redirector which I never tried before.
      //     . enable on xrootd.t2 - report to some other port not to screw up
      //       production system;
      //     . have some printouts

      XrdXrootdMonBurr *rb = (XrdXrootdMonBurr*) p->mBuff;
      
      TString txt;
      txt.Form("Redirect trace from %s.%s:%hu, seq=%hhu, len=%hu.",
               server->GetHost(), server->GetDomain(), port, pseq, plen);

      // XXXX In progress ... redirect message processing.
      if (false)
      {
        int rb_to_read = plen - sizeof(XrdXrootdMonHeader) - sizeof(kXR_int64);
        int i          = 0;
        int prev_win   = 0;
        XrdXrootdMonRedir *rr = rb->info;
        while (rb_to_read > 0)
        {
          int len = 8 * (rr->arg0.Dent + 1);
        
          txt += TString::Format("\n  %3d - 0x%02hhx len=%3d: ",
                                 i, rr->arg0.Type, len);

          if (rr->arg0.Type == 0) // time window
          {
            txt += TString::Format("window prev_len=%d, start=%d",
                                   ntohl(rr->arg0.Window), ntohl(rr->arg1.Window));
          }
          else
          {
            UInt_t uid = ntohl(rr->arg1.dictid);
            XrdUser *user = server->FindUser(uid);
            txt += TString::Format("uid=%u, %s\n        %s",
                                   uid, user ? user->GetName() : "<unknown>",
                                   (const char*)(&rr->arg1.dictid) + 4);
          }

          rr = (XrdXrootdMonRedir*) ((char*) rr + len);
          rb_to_read -= len;
          ++i;
        }

        // Hack to get redirect messages printed out with little extra noise.
        log.Put(ZLog::L_Fatal, txt);
      }
      else
      {
        log.Put(txt);
      }
    }

    p->DecRefCount();
  } // while (true) main loop
}

//==============================================================================

void XrdMonSucker::StartSucker()
{
  static const Exc_t _eh("XrdMonSucker::StartSucker ");

  {
    GLensReadHolder _lck(this);
    if (mSuckerThread)
      throw _eh + "already running.";

    mSuckerThread  = new GThread("XrdMonSucker-Sucker",
                                 (GThread_foo) tl_Suck, this, false);

    mCheckerThread = new GThread("XrdMonSucker-Checker",
                                 (GThread_foo) tl_Check, this, false);
  }
  mSuckerThread->SetNice(0);
  mSuckerThread->Spawn();

  mLastOldUserCheck  = mLastDeadUserCheck  =
  mLastDeadServCheck = mLastIdentServCheck = GTime::ApproximateTime();

  mCheckerThread->SetNice(20);
  mCheckerThread->Spawn();

  mSource->RegisterConsumer(&mUdpQueue);

  {
    GLensReadHolder _lck(this);
    Stamp(FID());
  }
}

void XrdMonSucker::StopSucker()
{
  static const Exc_t _eh("XrdMonSucker::StopSucker ");

  GThread *thr = 0;
  {
    GLensReadHolder _lck(this);
    if ( ! GThread::IsValidPtr(mSuckerThread))
      throw _eh + "not running.";
    thr = mSuckerThread;
    GThread::InvalidatePtr(mSuckerThread);
  }

  mSource->UnregisterConsumer(&mUdpQueue);

  mCheckerThread->Cancel();
  mCheckerThread->Join();
  delete mCheckerThread;

  thr->Cancel();
  thr->Join();
  delete thr;
  close(mSocket);
  {
    GLensReadHolder _lck(this);
    mSocket = 0;
    mSuckerThread = 0;
    mCheckerThread = 0;
  }
}

//==============================================================================

void* XrdMonSucker::tl_Check(XrdMonSucker* s)
{
  s->Check();
  // Usually cancelled from StopSucker().
  s->mCheckerThread = 0;
  return 0;
}

void XrdMonSucker::Check()
{
  static const Exc_t _eh("XrdMonSucker::Check ");

  while (true)
  {
    GTime now = GTime::ApproximateTime();

    {
      bool stamp_p = false;
      GLensReadHolder _lck(this);
      if ((now - mLastOldUserCheck).GetSec() > mUserKeepSec)
      {
        mSaturn->ShootMIR( S_CleanUpOldUsers() );
        mLastOldUserCheck = now;
        stamp_p = true;
      }
      if ((now - mLastDeadUserCheck).GetSec() > mUserDeadSec/100)
      {
        mSaturn->ShootMIR( S_CleanUpDeadUsers() );
        mLastDeadUserCheck = now;
        stamp_p = true;
      }
      if ((now - mLastDeadServCheck).GetSec() > mServDeadSec/100)
      {
        mSaturn->ShootMIR( S_CleanUpDeadServers() );
        mLastDeadServCheck = now;
        stamp_p = true;
      }
      if ((now - mLastIdentServCheck).GetSec() > mServIdentSec)
      {
        mSaturn->ShootMIR( S_CleanUpNoIdentServers() );
        mLastIdentServCheck = now;
        stamp_p = true;
      }
      if (stamp_p)
      {
        Stamp(FID());
      }
    }

    GTime::SleepMiliSec(30000);
  }
}

//------------------------------------------------------------------------------

void XrdMonSucker::CleanUpOldUsers()
{
  static const Exc_t _eh("XrdMonSucker::CleanUpOldUsers ");
  assert_MIR_presence(_eh, ZGlass::MC_IsDetached);

  GTime now = GTime::ApproximateTime();

  ZLog::Helper log(*mLog, now, ZLog::L_Message, _eh);

  list<XrdDomain*> domains;
  CopyListByGlass<XrdDomain>(domains);

  for (list<XrdDomain*>::iterator di = domains.begin(); di != domains.end(); ++di)
  {
    XrdDomain *d = *di;
    list<XrdServer*> servers;
    d->CopyListByGlass<XrdServer>(servers, false, true);

    Int_t n_wiped = 0;
    for (list<XrdServer*>::iterator si = servers.begin(); si != servers.end(); ++si)
    {
      XrdServer *s = *si;
      list<XrdUser*> users;
      s->GetPrevUsers()->CopyListByGlass<XrdUser>(users);

      for (list<XrdUser*>::iterator ui = users.begin(); ui != users.end(); ++ui)
      {
        XrdUser *u = *ui;
        Int_t delta;
        {
          GLensReadHolder _lck(u);
          delta = (Int_t) (now - u->RefDisconnectTime()).GetSec();
        }
        if (delta > mUserKeepSec)
        {
          ++n_wiped;
          mQueen->RemoveLens(u);
        }
        else
        {
          // These are time-ordered ... so the rest are newer.
          break;
        }
      }

      s->DecEyeRefCount();
    }
    if (n_wiped > 0)
    {
      log.SetTime(GTime::ApproximateTime());
      log.Form("Removed %d previous users for domain '%s'.", n_wiped, d->GetName());
    }
  }
}

void XrdMonSucker::CleanUpDeadUsers()
{
  static const Exc_t _eh("XrdMonSucker::CleanUpDeadUsers ");

  assert_MIR_presence(_eh, ZGlass::MC_IsDetached);

  GTime now = GTime::ApproximateTime();

  ZLog::Helper log(*mLog, now, ZLog::L_Message, _eh);

  list<XrdDomain*> domains;
  CopyListByGlass<XrdDomain>(domains);

  for (list<XrdDomain*>::iterator di = domains.begin(); di != domains.end(); ++di)
  {
    XrdDomain *d = *di;
    list<XrdServer*> servers;
    d->CopyListByGlass<XrdServer>(servers, false, true);

    Int_t n_wiped = 0;
    for (list<XrdServer*>::iterator si = servers.begin(); si != servers.end(); ++si)
    {
      XrdServer *s = *si;
      list<XrdUser*> users;
      s->CopyListByGlass<XrdUser>(users);

      for (list<XrdUser*>::iterator ui = users.begin(); ui != users.end(); ++ui)
      {
        XrdUser *u = *ui;
        Int_t delta;
        {
          GLensReadHolder _lck(u);
          delta = (Int_t) (now - u->RefLastMsgTime()).GetSec();
        }
        if (delta > mUserDeadSec)
        {
          ++n_wiped;
          disconnect_user_and_close_open_files(u, s, now);
        }
      }

      s->DecEyeRefCount();
    }
    if (n_wiped > 0)
    {
      log.SetTime(GTime::ApproximateTime());
      log.Form("Removed %d dead users for domain '%s'.", n_wiped, d->GetName());
    }
  }
}

//------------------------------------------------------------------------------

void XrdMonSucker::CleanUpDeadServers()
{
  static const Exc_t _eh("XrdMonSucker::CleanUpDeadServers ");

  assert_MIR_presence(_eh, ZGlass::MC_IsDetached);

  GTime now = GTime::ApproximateTime();

  ZLog::Helper log(*mLog, now, ZLog::L_Message, _eh);

  list<XrdDomain*> domains;
  CopyListByGlass<XrdDomain>(domains);

  for (list<XrdDomain*>::iterator di = domains.begin(); di != domains.end(); ++di)
  {
    XrdDomain *domain = *di;
    list<XrdServer*> servers;
    domain->CopyListByGlass<XrdServer>(servers, false, true);

    for (list<XrdServer*>::iterator si = servers.begin(); si != servers.end(); ++si)
    {
      XrdServer *server = *si;
      Int_t delta;
      {
        GLensReadHolder _lck(server);
        delta = (Int_t) (now - server->RefLastMsgTime()).GetSec();
      }
      if (delta > mServDeadSec)
      {
        log.SetTime(GTime::ApproximateTime());
        log.Form("Removing unactive server '%s'.", server->GetName());

	disconnect_server(server, domain, now);
      }

      server->DecEyeRefCount();
    }
  }
}

void XrdMonSucker::CleanUpNoIdentServers()
{
  static const Exc_t _eh("XrdMonSucker::CleanUpNoIdentServers ");

  assert_MIR_presence(_eh, ZGlass::MC_IsDetached);

  GTime now = GTime::ApproximateTime();

  ZLog::Helper log(*mLog, now, ZLog::L_Message, _eh);

  list<XrdDomain*> domains;
  CopyListByGlass<XrdDomain>(domains);

  for (list<XrdDomain*>::iterator di = domains.begin(); di != domains.end(); ++di)
  {
    XrdDomain *domain = *di;
    list<XrdServer*> servers;
    domain->CopyListByGlass<XrdServer>(servers, false, true);

    for (list<XrdServer*>::iterator si = servers.begin(); si != servers.end(); ++si)
    {
      XrdServer *server = *si;
      Int_t ident_delta, delta;
      {
        GLensReadHolder _lck(server);

	ident_delta = server->GetAvgSrvIdDelta();
	if (ident_delta <= 0) goto done;

        delta = (Int_t) (now - server->RefLastMsgTime()).GetSec();
      }
      if (delta > mServIdentCnt * ident_delta)
      {
        log.SetTime(GTime::ApproximateTime());
        log.Form("Removing unactive server '%s'.", server->GetName());

	disconnect_server(server, domain, now);
      }
    done:
      server->DecEyeRefCount();
    }
  }
}

//==============================================================================

void XrdMonSucker::EmitTraceRERay()
{
  bTraceAllNull = mTraceDN.IsNull() && mTraceHost.IsNull() && mTraceDomain.IsNull();
  if ( ! bTraceAllNull)
  {
    mTraceDN_RE    .Reset(mTraceDN, "o");
    mTraceHost_RE  .Reset(mTraceHost, "o");
    mTraceDomain_RE.Reset(mTraceDomain, "o");
  }
}
 XrdMonSucker.cxx:1
 XrdMonSucker.cxx:2
 XrdMonSucker.cxx:3
 XrdMonSucker.cxx:4
 XrdMonSucker.cxx:5
 XrdMonSucker.cxx:6
 XrdMonSucker.cxx:7
 XrdMonSucker.cxx:8
 XrdMonSucker.cxx:9
 XrdMonSucker.cxx:10
 XrdMonSucker.cxx:11
 XrdMonSucker.cxx:12
 XrdMonSucker.cxx:13
 XrdMonSucker.cxx:14
 XrdMonSucker.cxx:15
 XrdMonSucker.cxx:16
 XrdMonSucker.cxx:17
 XrdMonSucker.cxx:18
 XrdMonSucker.cxx:19
 XrdMonSucker.cxx:20
 XrdMonSucker.cxx:21
 XrdMonSucker.cxx:22
 XrdMonSucker.cxx:23
 XrdMonSucker.cxx:24
 XrdMonSucker.cxx:25
 XrdMonSucker.cxx:26
 XrdMonSucker.cxx:27
 XrdMonSucker.cxx:28
 XrdMonSucker.cxx:29
 XrdMonSucker.cxx:30
 XrdMonSucker.cxx:31
 XrdMonSucker.cxx:32
 XrdMonSucker.cxx:33
 XrdMonSucker.cxx:34
 XrdMonSucker.cxx:35
 XrdMonSucker.cxx:36
 XrdMonSucker.cxx:37
 XrdMonSucker.cxx:38
 XrdMonSucker.cxx:39
 XrdMonSucker.cxx:40
 XrdMonSucker.cxx:41
 XrdMonSucker.cxx:42
 XrdMonSucker.cxx:43
 XrdMonSucker.cxx:44
 XrdMonSucker.cxx:45
 XrdMonSucker.cxx:46
 XrdMonSucker.cxx:47
 XrdMonSucker.cxx:48
 XrdMonSucker.cxx:49
 XrdMonSucker.cxx:50
 XrdMonSucker.cxx:51
 XrdMonSucker.cxx:52
 XrdMonSucker.cxx:53
 XrdMonSucker.cxx:54
 XrdMonSucker.cxx:55
 XrdMonSucker.cxx:56
 XrdMonSucker.cxx:57
 XrdMonSucker.cxx:58
 XrdMonSucker.cxx:59
 XrdMonSucker.cxx:60
 XrdMonSucker.cxx:61
 XrdMonSucker.cxx:62
 XrdMonSucker.cxx:63
 XrdMonSucker.cxx:64
 XrdMonSucker.cxx:65
 XrdMonSucker.cxx:66
 XrdMonSucker.cxx:67
 XrdMonSucker.cxx:68
 XrdMonSucker.cxx:69
 XrdMonSucker.cxx:70
 XrdMonSucker.cxx:71
 XrdMonSucker.cxx:72
 XrdMonSucker.cxx:73
 XrdMonSucker.cxx:74
 XrdMonSucker.cxx:75
 XrdMonSucker.cxx:76
 XrdMonSucker.cxx:77
 XrdMonSucker.cxx:78
 XrdMonSucker.cxx:79
 XrdMonSucker.cxx:80
 XrdMonSucker.cxx:81
 XrdMonSucker.cxx:82
 XrdMonSucker.cxx:83
 XrdMonSucker.cxx:84
 XrdMonSucker.cxx:85
 XrdMonSucker.cxx:86
 XrdMonSucker.cxx:87
 XrdMonSucker.cxx:88
 XrdMonSucker.cxx:89
 XrdMonSucker.cxx:90
 XrdMonSucker.cxx:91
 XrdMonSucker.cxx:92
 XrdMonSucker.cxx:93
 XrdMonSucker.cxx:94
 XrdMonSucker.cxx:95
 XrdMonSucker.cxx:96
 XrdMonSucker.cxx:97
 XrdMonSucker.cxx:98
 XrdMonSucker.cxx:99
 XrdMonSucker.cxx:100
 XrdMonSucker.cxx:101
 XrdMonSucker.cxx:102
 XrdMonSucker.cxx:103
 XrdMonSucker.cxx:104
 XrdMonSucker.cxx:105
 XrdMonSucker.cxx:106
 XrdMonSucker.cxx:107
 XrdMonSucker.cxx:108
 XrdMonSucker.cxx:109
 XrdMonSucker.cxx:110
 XrdMonSucker.cxx:111
 XrdMonSucker.cxx:112
 XrdMonSucker.cxx:113
 XrdMonSucker.cxx:114
 XrdMonSucker.cxx:115
 XrdMonSucker.cxx:116
 XrdMonSucker.cxx:117
 XrdMonSucker.cxx:118
 XrdMonSucker.cxx:119
 XrdMonSucker.cxx:120
 XrdMonSucker.cxx:121
 XrdMonSucker.cxx:122
 XrdMonSucker.cxx:123
 XrdMonSucker.cxx:124
 XrdMonSucker.cxx:125
 XrdMonSucker.cxx:126
 XrdMonSucker.cxx:127
 XrdMonSucker.cxx:128
 XrdMonSucker.cxx:129
 XrdMonSucker.cxx:130
 XrdMonSucker.cxx:131
 XrdMonSucker.cxx:132
 XrdMonSucker.cxx:133
 XrdMonSucker.cxx:134
 XrdMonSucker.cxx:135
 XrdMonSucker.cxx:136
 XrdMonSucker.cxx:137
 XrdMonSucker.cxx:138
 XrdMonSucker.cxx:139
 XrdMonSucker.cxx:140
 XrdMonSucker.cxx:141
 XrdMonSucker.cxx:142
 XrdMonSucker.cxx:143
 XrdMonSucker.cxx:144
 XrdMonSucker.cxx:145
 XrdMonSucker.cxx:146
 XrdMonSucker.cxx:147
 XrdMonSucker.cxx:148
 XrdMonSucker.cxx:149
 XrdMonSucker.cxx:150
 XrdMonSucker.cxx:151
 XrdMonSucker.cxx:152
 XrdMonSucker.cxx:153
 XrdMonSucker.cxx:154
 XrdMonSucker.cxx:155
 XrdMonSucker.cxx:156
 XrdMonSucker.cxx:157
 XrdMonSucker.cxx:158
 XrdMonSucker.cxx:159
 XrdMonSucker.cxx:160
 XrdMonSucker.cxx:161
 XrdMonSucker.cxx:162
 XrdMonSucker.cxx:163
 XrdMonSucker.cxx:164
 XrdMonSucker.cxx:165
 XrdMonSucker.cxx:166
 XrdMonSucker.cxx:167
 XrdMonSucker.cxx:168
 XrdMonSucker.cxx:169
 XrdMonSucker.cxx:170
 XrdMonSucker.cxx:171
 XrdMonSucker.cxx:172
 XrdMonSucker.cxx:173
 XrdMonSucker.cxx:174
 XrdMonSucker.cxx:175
 XrdMonSucker.cxx:176
 XrdMonSucker.cxx:177
 XrdMonSucker.cxx:178
 XrdMonSucker.cxx:179
 XrdMonSucker.cxx:180
 XrdMonSucker.cxx:181
 XrdMonSucker.cxx:182
 XrdMonSucker.cxx:183
 XrdMonSucker.cxx:184
 XrdMonSucker.cxx:185
 XrdMonSucker.cxx:186
 XrdMonSucker.cxx:187
 XrdMonSucker.cxx:188
 XrdMonSucker.cxx:189
 XrdMonSucker.cxx:190
 XrdMonSucker.cxx:191
 XrdMonSucker.cxx:192
 XrdMonSucker.cxx:193
 XrdMonSucker.cxx:194
 XrdMonSucker.cxx:195
 XrdMonSucker.cxx:196
 XrdMonSucker.cxx:197
 XrdMonSucker.cxx:198
 XrdMonSucker.cxx:199
 XrdMonSucker.cxx:200
 XrdMonSucker.cxx:201
 XrdMonSucker.cxx:202
 XrdMonSucker.cxx:203
 XrdMonSucker.cxx:204
 XrdMonSucker.cxx:205
 XrdMonSucker.cxx:206
 XrdMonSucker.cxx:207
 XrdMonSucker.cxx:208
 XrdMonSucker.cxx:209
 XrdMonSucker.cxx:210
 XrdMonSucker.cxx:211
 XrdMonSucker.cxx:212
 XrdMonSucker.cxx:213
 XrdMonSucker.cxx:214
 XrdMonSucker.cxx:215
 XrdMonSucker.cxx:216
 XrdMonSucker.cxx:217
 XrdMonSucker.cxx:218
 XrdMonSucker.cxx:219
 XrdMonSucker.cxx:220
 XrdMonSucker.cxx:221
 XrdMonSucker.cxx:222
 XrdMonSucker.cxx:223
 XrdMonSucker.cxx:224
 XrdMonSucker.cxx:225
 XrdMonSucker.cxx:226
 XrdMonSucker.cxx:227
 XrdMonSucker.cxx:228
 XrdMonSucker.cxx:229
 XrdMonSucker.cxx:230
 XrdMonSucker.cxx:231
 XrdMonSucker.cxx:232
 XrdMonSucker.cxx:233
 XrdMonSucker.cxx:234
 XrdMonSucker.cxx:235
 XrdMonSucker.cxx:236
 XrdMonSucker.cxx:237
 XrdMonSucker.cxx:238
 XrdMonSucker.cxx:239
 XrdMonSucker.cxx:240
 XrdMonSucker.cxx:241
 XrdMonSucker.cxx:242
 XrdMonSucker.cxx:243
 XrdMonSucker.cxx:244
 XrdMonSucker.cxx:245
 XrdMonSucker.cxx:246
 XrdMonSucker.cxx:247
 XrdMonSucker.cxx:248
 XrdMonSucker.cxx:249
 XrdMonSucker.cxx:250
 XrdMonSucker.cxx:251
 XrdMonSucker.cxx:252
 XrdMonSucker.cxx:253
 XrdMonSucker.cxx:254
 XrdMonSucker.cxx:255
 XrdMonSucker.cxx:256
 XrdMonSucker.cxx:257
 XrdMonSucker.cxx:258
 XrdMonSucker.cxx:259
 XrdMonSucker.cxx:260
 XrdMonSucker.cxx:261
 XrdMonSucker.cxx:262
 XrdMonSucker.cxx:263
 XrdMonSucker.cxx:264
 XrdMonSucker.cxx:265
 XrdMonSucker.cxx:266
 XrdMonSucker.cxx:267
 XrdMonSucker.cxx:268
 XrdMonSucker.cxx:269
 XrdMonSucker.cxx:270
 XrdMonSucker.cxx:271
 XrdMonSucker.cxx:272
 XrdMonSucker.cxx:273
 XrdMonSucker.cxx:274
 XrdMonSucker.cxx:275
 XrdMonSucker.cxx:276
 XrdMonSucker.cxx:277
 XrdMonSucker.cxx:278
 XrdMonSucker.cxx:279
 XrdMonSucker.cxx:280
 XrdMonSucker.cxx:281
 XrdMonSucker.cxx:282
 XrdMonSucker.cxx:283
 XrdMonSucker.cxx:284
 XrdMonSucker.cxx:285
 XrdMonSucker.cxx:286
 XrdMonSucker.cxx:287
 XrdMonSucker.cxx:288
 XrdMonSucker.cxx:289
 XrdMonSucker.cxx:290
 XrdMonSucker.cxx:291
 XrdMonSucker.cxx:292
 XrdMonSucker.cxx:293
 XrdMonSucker.cxx:294
 XrdMonSucker.cxx:295
 XrdMonSucker.cxx:296
 XrdMonSucker.cxx:297
 XrdMonSucker.cxx:298
 XrdMonSucker.cxx:299
 XrdMonSucker.cxx:300
 XrdMonSucker.cxx:301
 XrdMonSucker.cxx:302
 XrdMonSucker.cxx:303
 XrdMonSucker.cxx:304
 XrdMonSucker.cxx:305
 XrdMonSucker.cxx:306
 XrdMonSucker.cxx:307
 XrdMonSucker.cxx:308
 XrdMonSucker.cxx:309
 XrdMonSucker.cxx:310
 XrdMonSucker.cxx:311
 XrdMonSucker.cxx:312
 XrdMonSucker.cxx:313
 XrdMonSucker.cxx:314
 XrdMonSucker.cxx:315
 XrdMonSucker.cxx:316
 XrdMonSucker.cxx:317
 XrdMonSucker.cxx:318
 XrdMonSucker.cxx:319
 XrdMonSucker.cxx:320
 XrdMonSucker.cxx:321
 XrdMonSucker.cxx:322
 XrdMonSucker.cxx:323
 XrdMonSucker.cxx:324
 XrdMonSucker.cxx:325
 XrdMonSucker.cxx:326
 XrdMonSucker.cxx:327
 XrdMonSucker.cxx:328
 XrdMonSucker.cxx:329
 XrdMonSucker.cxx:330
 XrdMonSucker.cxx:331
 XrdMonSucker.cxx:332
 XrdMonSucker.cxx:333
 XrdMonSucker.cxx:334
 XrdMonSucker.cxx:335
 XrdMonSucker.cxx:336
 XrdMonSucker.cxx:337
 XrdMonSucker.cxx:338
 XrdMonSucker.cxx:339
 XrdMonSucker.cxx:340
 XrdMonSucker.cxx:341
 XrdMonSucker.cxx:342
 XrdMonSucker.cxx:343
 XrdMonSucker.cxx:344
 XrdMonSucker.cxx:345
 XrdMonSucker.cxx:346
 XrdMonSucker.cxx:347
 XrdMonSucker.cxx:348
 XrdMonSucker.cxx:349
 XrdMonSucker.cxx:350
 XrdMonSucker.cxx:351
 XrdMonSucker.cxx:352
 XrdMonSucker.cxx:353
 XrdMonSucker.cxx:354
 XrdMonSucker.cxx:355
 XrdMonSucker.cxx:356
 XrdMonSucker.cxx:357
 XrdMonSucker.cxx:358
 XrdMonSucker.cxx:359
 XrdMonSucker.cxx:360
 XrdMonSucker.cxx:361
 XrdMonSucker.cxx:362
 XrdMonSucker.cxx:363
 XrdMonSucker.cxx:364
 XrdMonSucker.cxx:365
 XrdMonSucker.cxx:366
 XrdMonSucker.cxx:367
 XrdMonSucker.cxx:368
 XrdMonSucker.cxx:369
 XrdMonSucker.cxx:370
 XrdMonSucker.cxx:371
 XrdMonSucker.cxx:372
 XrdMonSucker.cxx:373
 XrdMonSucker.cxx:374
 XrdMonSucker.cxx:375
 XrdMonSucker.cxx:376
 XrdMonSucker.cxx:377
 XrdMonSucker.cxx:378
 XrdMonSucker.cxx:379
 XrdMonSucker.cxx:380
 XrdMonSucker.cxx:381
 XrdMonSucker.cxx:382
 XrdMonSucker.cxx:383
 XrdMonSucker.cxx:384
 XrdMonSucker.cxx:385
 XrdMonSucker.cxx:386
 XrdMonSucker.cxx:387
 XrdMonSucker.cxx:388
 XrdMonSucker.cxx:389
 XrdMonSucker.cxx:390
 XrdMonSucker.cxx:391
 XrdMonSucker.cxx:392
 XrdMonSucker.cxx:393
 XrdMonSucker.cxx:394
 XrdMonSucker.cxx:395
 XrdMonSucker.cxx:396
 XrdMonSucker.cxx:397
 XrdMonSucker.cxx:398
 XrdMonSucker.cxx:399
 XrdMonSucker.cxx:400
 XrdMonSucker.cxx:401
 XrdMonSucker.cxx:402
 XrdMonSucker.cxx:403
 XrdMonSucker.cxx:404
 XrdMonSucker.cxx:405
 XrdMonSucker.cxx:406
 XrdMonSucker.cxx:407
 XrdMonSucker.cxx:408
 XrdMonSucker.cxx:409
 XrdMonSucker.cxx:410
 XrdMonSucker.cxx:411
 XrdMonSucker.cxx:412
 XrdMonSucker.cxx:413
 XrdMonSucker.cxx:414
 XrdMonSucker.cxx:415
 XrdMonSucker.cxx:416
 XrdMonSucker.cxx:417
 XrdMonSucker.cxx:418
 XrdMonSucker.cxx:419
 XrdMonSucker.cxx:420
 XrdMonSucker.cxx:421
 XrdMonSucker.cxx:422
 XrdMonSucker.cxx:423
 XrdMonSucker.cxx:424
 XrdMonSucker.cxx:425
 XrdMonSucker.cxx:426
 XrdMonSucker.cxx:427
 XrdMonSucker.cxx:428
 XrdMonSucker.cxx:429
 XrdMonSucker.cxx:430
 XrdMonSucker.cxx:431
 XrdMonSucker.cxx:432
 XrdMonSucker.cxx:433
 XrdMonSucker.cxx:434
 XrdMonSucker.cxx:435
 XrdMonSucker.cxx:436
 XrdMonSucker.cxx:437
 XrdMonSucker.cxx:438
 XrdMonSucker.cxx:439
 XrdMonSucker.cxx:440
 XrdMonSucker.cxx:441
 XrdMonSucker.cxx:442
 XrdMonSucker.cxx:443
 XrdMonSucker.cxx:444
 XrdMonSucker.cxx:445
 XrdMonSucker.cxx:446
 XrdMonSucker.cxx:447
 XrdMonSucker.cxx:448
 XrdMonSucker.cxx:449
 XrdMonSucker.cxx:450
 XrdMonSucker.cxx:451
 XrdMonSucker.cxx:452
 XrdMonSucker.cxx:453
 XrdMonSucker.cxx:454
 XrdMonSucker.cxx:455
 XrdMonSucker.cxx:456
 XrdMonSucker.cxx:457
 XrdMonSucker.cxx:458
 XrdMonSucker.cxx:459
 XrdMonSucker.cxx:460
 XrdMonSucker.cxx:461
 XrdMonSucker.cxx:462
 XrdMonSucker.cxx:463
 XrdMonSucker.cxx:464
 XrdMonSucker.cxx:465
 XrdMonSucker.cxx:466
 XrdMonSucker.cxx:467
 XrdMonSucker.cxx:468
 XrdMonSucker.cxx:469
 XrdMonSucker.cxx:470
 XrdMonSucker.cxx:471
 XrdMonSucker.cxx:472
 XrdMonSucker.cxx:473
 XrdMonSucker.cxx:474
 XrdMonSucker.cxx:475
 XrdMonSucker.cxx:476
 XrdMonSucker.cxx:477
 XrdMonSucker.cxx:478
 XrdMonSucker.cxx:479
 XrdMonSucker.cxx:480
 XrdMonSucker.cxx:481
 XrdMonSucker.cxx:482
 XrdMonSucker.cxx:483
 XrdMonSucker.cxx:484
 XrdMonSucker.cxx:485
 XrdMonSucker.cxx:486
 XrdMonSucker.cxx:487
 XrdMonSucker.cxx:488
 XrdMonSucker.cxx:489
 XrdMonSucker.cxx:490
 XrdMonSucker.cxx:491
 XrdMonSucker.cxx:492
 XrdMonSucker.cxx:493
 XrdMonSucker.cxx:494
 XrdMonSucker.cxx:495
 XrdMonSucker.cxx:496
 XrdMonSucker.cxx:497
 XrdMonSucker.cxx:498
 XrdMonSucker.cxx:499
 XrdMonSucker.cxx:500
 XrdMonSucker.cxx:501
 XrdMonSucker.cxx:502
 XrdMonSucker.cxx:503
 XrdMonSucker.cxx:504
 XrdMonSucker.cxx:505
 XrdMonSucker.cxx:506
 XrdMonSucker.cxx:507
 XrdMonSucker.cxx:508
 XrdMonSucker.cxx:509
 XrdMonSucker.cxx:510
 XrdMonSucker.cxx:511
 XrdMonSucker.cxx:512
 XrdMonSucker.cxx:513
 XrdMonSucker.cxx:514
 XrdMonSucker.cxx:515
 XrdMonSucker.cxx:516
 XrdMonSucker.cxx:517
 XrdMonSucker.cxx:518
 XrdMonSucker.cxx:519
 XrdMonSucker.cxx:520
 XrdMonSucker.cxx:521
 XrdMonSucker.cxx:522
 XrdMonSucker.cxx:523
 XrdMonSucker.cxx:524
 XrdMonSucker.cxx:525
 XrdMonSucker.cxx:526
 XrdMonSucker.cxx:527
 XrdMonSucker.cxx:528
 XrdMonSucker.cxx:529
 XrdMonSucker.cxx:530
 XrdMonSucker.cxx:531
 XrdMonSucker.cxx:532
 XrdMonSucker.cxx:533
 XrdMonSucker.cxx:534
 XrdMonSucker.cxx:535
 XrdMonSucker.cxx:536
 XrdMonSucker.cxx:537
 XrdMonSucker.cxx:538
 XrdMonSucker.cxx:539
 XrdMonSucker.cxx:540
 XrdMonSucker.cxx:541
 XrdMonSucker.cxx:542
 XrdMonSucker.cxx:543
 XrdMonSucker.cxx:544
 XrdMonSucker.cxx:545
 XrdMonSucker.cxx:546
 XrdMonSucker.cxx:547
 XrdMonSucker.cxx:548
 XrdMonSucker.cxx:549
 XrdMonSucker.cxx:550
 XrdMonSucker.cxx:551
 XrdMonSucker.cxx:552
 XrdMonSucker.cxx:553
 XrdMonSucker.cxx:554
 XrdMonSucker.cxx:555
 XrdMonSucker.cxx:556
 XrdMonSucker.cxx:557
 XrdMonSucker.cxx:558
 XrdMonSucker.cxx:559
 XrdMonSucker.cxx:560
 XrdMonSucker.cxx:561
 XrdMonSucker.cxx:562
 XrdMonSucker.cxx:563
 XrdMonSucker.cxx:564
 XrdMonSucker.cxx:565
 XrdMonSucker.cxx:566
 XrdMonSucker.cxx:567
 XrdMonSucker.cxx:568
 XrdMonSucker.cxx:569
 XrdMonSucker.cxx:570
 XrdMonSucker.cxx:571
 XrdMonSucker.cxx:572
 XrdMonSucker.cxx:573
 XrdMonSucker.cxx:574
 XrdMonSucker.cxx:575
 XrdMonSucker.cxx:576
 XrdMonSucker.cxx:577
 XrdMonSucker.cxx:578
 XrdMonSucker.cxx:579
 XrdMonSucker.cxx:580
 XrdMonSucker.cxx:581
 XrdMonSucker.cxx:582
 XrdMonSucker.cxx:583
 XrdMonSucker.cxx:584
 XrdMonSucker.cxx:585
 XrdMonSucker.cxx:586
 XrdMonSucker.cxx:587
 XrdMonSucker.cxx:588
 XrdMonSucker.cxx:589
 XrdMonSucker.cxx:590
 XrdMonSucker.cxx:591
 XrdMonSucker.cxx:592
 XrdMonSucker.cxx:593
 XrdMonSucker.cxx:594
 XrdMonSucker.cxx:595
 XrdMonSucker.cxx:596
 XrdMonSucker.cxx:597
 XrdMonSucker.cxx:598
 XrdMonSucker.cxx:599
 XrdMonSucker.cxx:600
 XrdMonSucker.cxx:601
 XrdMonSucker.cxx:602
 XrdMonSucker.cxx:603
 XrdMonSucker.cxx:604
 XrdMonSucker.cxx:605
 XrdMonSucker.cxx:606
 XrdMonSucker.cxx:607
 XrdMonSucker.cxx:608
 XrdMonSucker.cxx:609
 XrdMonSucker.cxx:610
 XrdMonSucker.cxx:611
 XrdMonSucker.cxx:612
 XrdMonSucker.cxx:613
 XrdMonSucker.cxx:614
 XrdMonSucker.cxx:615
 XrdMonSucker.cxx:616
 XrdMonSucker.cxx:617
 XrdMonSucker.cxx:618
 XrdMonSucker.cxx:619
 XrdMonSucker.cxx:620
 XrdMonSucker.cxx:621
 XrdMonSucker.cxx:622
 XrdMonSucker.cxx:623
 XrdMonSucker.cxx:624
 XrdMonSucker.cxx:625
 XrdMonSucker.cxx:626
 XrdMonSucker.cxx:627
 XrdMonSucker.cxx:628
 XrdMonSucker.cxx:629
 XrdMonSucker.cxx:630
 XrdMonSucker.cxx:631
 XrdMonSucker.cxx:632
 XrdMonSucker.cxx:633
 XrdMonSucker.cxx:634
 XrdMonSucker.cxx:635
 XrdMonSucker.cxx:636
 XrdMonSucker.cxx:637
 XrdMonSucker.cxx:638
 XrdMonSucker.cxx:639
 XrdMonSucker.cxx:640
 XrdMonSucker.cxx:641
 XrdMonSucker.cxx:642
 XrdMonSucker.cxx:643
 XrdMonSucker.cxx:644
 XrdMonSucker.cxx:645
 XrdMonSucker.cxx:646
 XrdMonSucker.cxx:647
 XrdMonSucker.cxx:648
 XrdMonSucker.cxx:649
 XrdMonSucker.cxx:650
 XrdMonSucker.cxx:651
 XrdMonSucker.cxx:652
 XrdMonSucker.cxx:653
 XrdMonSucker.cxx:654
 XrdMonSucker.cxx:655
 XrdMonSucker.cxx:656
 XrdMonSucker.cxx:657
 XrdMonSucker.cxx:658
 XrdMonSucker.cxx:659
 XrdMonSucker.cxx:660
 XrdMonSucker.cxx:661
 XrdMonSucker.cxx:662
 XrdMonSucker.cxx:663
 XrdMonSucker.cxx:664
 XrdMonSucker.cxx:665
 XrdMonSucker.cxx:666
 XrdMonSucker.cxx:667
 XrdMonSucker.cxx:668
 XrdMonSucker.cxx:669
 XrdMonSucker.cxx:670
 XrdMonSucker.cxx:671
 XrdMonSucker.cxx:672
 XrdMonSucker.cxx:673
 XrdMonSucker.cxx:674
 XrdMonSucker.cxx:675
 XrdMonSucker.cxx:676
 XrdMonSucker.cxx:677
 XrdMonSucker.cxx:678
 XrdMonSucker.cxx:679
 XrdMonSucker.cxx:680
 XrdMonSucker.cxx:681
 XrdMonSucker.cxx:682
 XrdMonSucker.cxx:683
 XrdMonSucker.cxx:684
 XrdMonSucker.cxx:685
 XrdMonSucker.cxx:686
 XrdMonSucker.cxx:687
 XrdMonSucker.cxx:688
 XrdMonSucker.cxx:689
 XrdMonSucker.cxx:690
 XrdMonSucker.cxx:691
 XrdMonSucker.cxx:692
 XrdMonSucker.cxx:693
 XrdMonSucker.cxx:694
 XrdMonSucker.cxx:695
 XrdMonSucker.cxx:696
 XrdMonSucker.cxx:697
 XrdMonSucker.cxx:698
 XrdMonSucker.cxx:699
 XrdMonSucker.cxx:700
 XrdMonSucker.cxx:701
 XrdMonSucker.cxx:702
 XrdMonSucker.cxx:703
 XrdMonSucker.cxx:704
 XrdMonSucker.cxx:705
 XrdMonSucker.cxx:706
 XrdMonSucker.cxx:707
 XrdMonSucker.cxx:708
 XrdMonSucker.cxx:709
 XrdMonSucker.cxx:710
 XrdMonSucker.cxx:711
 XrdMonSucker.cxx:712
 XrdMonSucker.cxx:713
 XrdMonSucker.cxx:714
 XrdMonSucker.cxx:715
 XrdMonSucker.cxx:716
 XrdMonSucker.cxx:717
 XrdMonSucker.cxx:718
 XrdMonSucker.cxx:719
 XrdMonSucker.cxx:720
 XrdMonSucker.cxx:721
 XrdMonSucker.cxx:722
 XrdMonSucker.cxx:723
 XrdMonSucker.cxx:724
 XrdMonSucker.cxx:725
 XrdMonSucker.cxx:726
 XrdMonSucker.cxx:727
 XrdMonSucker.cxx:728
 XrdMonSucker.cxx:729
 XrdMonSucker.cxx:730
 XrdMonSucker.cxx:731
 XrdMonSucker.cxx:732
 XrdMonSucker.cxx:733
 XrdMonSucker.cxx:734
 XrdMonSucker.cxx:735
 XrdMonSucker.cxx:736
 XrdMonSucker.cxx:737
 XrdMonSucker.cxx:738
 XrdMonSucker.cxx:739
 XrdMonSucker.cxx:740
 XrdMonSucker.cxx:741
 XrdMonSucker.cxx:742
 XrdMonSucker.cxx:743
 XrdMonSucker.cxx:744
 XrdMonSucker.cxx:745
 XrdMonSucker.cxx:746
 XrdMonSucker.cxx:747
 XrdMonSucker.cxx:748
 XrdMonSucker.cxx:749
 XrdMonSucker.cxx:750
 XrdMonSucker.cxx:751
 XrdMonSucker.cxx:752
 XrdMonSucker.cxx:753
 XrdMonSucker.cxx:754
 XrdMonSucker.cxx:755
 XrdMonSucker.cxx:756
 XrdMonSucker.cxx:757
 XrdMonSucker.cxx:758
 XrdMonSucker.cxx:759
 XrdMonSucker.cxx:760
 XrdMonSucker.cxx:761
 XrdMonSucker.cxx:762
 XrdMonSucker.cxx:763
 XrdMonSucker.cxx:764
 XrdMonSucker.cxx:765
 XrdMonSucker.cxx:766
 XrdMonSucker.cxx:767
 XrdMonSucker.cxx:768
 XrdMonSucker.cxx:769
 XrdMonSucker.cxx:770
 XrdMonSucker.cxx:771
 XrdMonSucker.cxx:772
 XrdMonSucker.cxx:773
 XrdMonSucker.cxx:774
 XrdMonSucker.cxx:775
 XrdMonSucker.cxx:776
 XrdMonSucker.cxx:777
 XrdMonSucker.cxx:778
 XrdMonSucker.cxx:779
 XrdMonSucker.cxx:780
 XrdMonSucker.cxx:781
 XrdMonSucker.cxx:782
 XrdMonSucker.cxx:783
 XrdMonSucker.cxx:784
 XrdMonSucker.cxx:785
 XrdMonSucker.cxx:786
 XrdMonSucker.cxx:787
 XrdMonSucker.cxx:788
 XrdMonSucker.cxx:789
 XrdMonSucker.cxx:790
 XrdMonSucker.cxx:791
 XrdMonSucker.cxx:792
 XrdMonSucker.cxx:793
 XrdMonSucker.cxx:794
 XrdMonSucker.cxx:795
 XrdMonSucker.cxx:796
 XrdMonSucker.cxx:797
 XrdMonSucker.cxx:798
 XrdMonSucker.cxx:799
 XrdMonSucker.cxx:800
 XrdMonSucker.cxx:801
 XrdMonSucker.cxx:802
 XrdMonSucker.cxx:803
 XrdMonSucker.cxx:804
 XrdMonSucker.cxx:805
 XrdMonSucker.cxx:806
 XrdMonSucker.cxx:807
 XrdMonSucker.cxx:808
 XrdMonSucker.cxx:809
 XrdMonSucker.cxx:810
 XrdMonSucker.cxx:811
 XrdMonSucker.cxx:812
 XrdMonSucker.cxx:813
 XrdMonSucker.cxx:814
 XrdMonSucker.cxx:815
 XrdMonSucker.cxx:816
 XrdMonSucker.cxx:817
 XrdMonSucker.cxx:818
 XrdMonSucker.cxx:819
 XrdMonSucker.cxx:820
 XrdMonSucker.cxx:821
 XrdMonSucker.cxx:822
 XrdMonSucker.cxx:823
 XrdMonSucker.cxx:824
 XrdMonSucker.cxx:825
 XrdMonSucker.cxx:826
 XrdMonSucker.cxx:827
 XrdMonSucker.cxx:828
 XrdMonSucker.cxx:829
 XrdMonSucker.cxx:830
 XrdMonSucker.cxx:831
 XrdMonSucker.cxx:832
 XrdMonSucker.cxx:833
 XrdMonSucker.cxx:834
 XrdMonSucker.cxx:835
 XrdMonSucker.cxx:836
 XrdMonSucker.cxx:837
 XrdMonSucker.cxx:838
 XrdMonSucker.cxx:839
 XrdMonSucker.cxx:840
 XrdMonSucker.cxx:841
 XrdMonSucker.cxx:842
 XrdMonSucker.cxx:843
 XrdMonSucker.cxx:844
 XrdMonSucker.cxx:845
 XrdMonSucker.cxx:846
 XrdMonSucker.cxx:847
 XrdMonSucker.cxx:848
 XrdMonSucker.cxx:849
 XrdMonSucker.cxx:850
 XrdMonSucker.cxx:851
 XrdMonSucker.cxx:852
 XrdMonSucker.cxx:853
 XrdMonSucker.cxx:854
 XrdMonSucker.cxx:855
 XrdMonSucker.cxx:856
 XrdMonSucker.cxx:857
 XrdMonSucker.cxx:858
 XrdMonSucker.cxx:859
 XrdMonSucker.cxx:860
 XrdMonSucker.cxx:861
 XrdMonSucker.cxx:862
 XrdMonSucker.cxx:863
 XrdMonSucker.cxx:864
 XrdMonSucker.cxx:865
 XrdMonSucker.cxx:866
 XrdMonSucker.cxx:867
 XrdMonSucker.cxx:868
 XrdMonSucker.cxx:869
 XrdMonSucker.cxx:870
 XrdMonSucker.cxx:871
 XrdMonSucker.cxx:872
 XrdMonSucker.cxx:873
 XrdMonSucker.cxx:874
 XrdMonSucker.cxx:875
 XrdMonSucker.cxx:876
 XrdMonSucker.cxx:877
 XrdMonSucker.cxx:878
 XrdMonSucker.cxx:879
 XrdMonSucker.cxx:880
 XrdMonSucker.cxx:881
 XrdMonSucker.cxx:882
 XrdMonSucker.cxx:883
 XrdMonSucker.cxx:884
 XrdMonSucker.cxx:885
 XrdMonSucker.cxx:886
 XrdMonSucker.cxx:887
 XrdMonSucker.cxx:888
 XrdMonSucker.cxx:889
 XrdMonSucker.cxx:890
 XrdMonSucker.cxx:891
 XrdMonSucker.cxx:892
 XrdMonSucker.cxx:893
 XrdMonSucker.cxx:894
 XrdMonSucker.cxx:895
 XrdMonSucker.cxx:896
 XrdMonSucker.cxx:897
 XrdMonSucker.cxx:898
 XrdMonSucker.cxx:899
 XrdMonSucker.cxx:900
 XrdMonSucker.cxx:901
 XrdMonSucker.cxx:902
 XrdMonSucker.cxx:903
 XrdMonSucker.cxx:904
 XrdMonSucker.cxx:905
 XrdMonSucker.cxx:906
 XrdMonSucker.cxx:907
 XrdMonSucker.cxx:908
 XrdMonSucker.cxx:909
 XrdMonSucker.cxx:910
 XrdMonSucker.cxx:911
 XrdMonSucker.cxx:912
 XrdMonSucker.cxx:913
 XrdMonSucker.cxx:914
 XrdMonSucker.cxx:915
 XrdMonSucker.cxx:916
 XrdMonSucker.cxx:917
 XrdMonSucker.cxx:918
 XrdMonSucker.cxx:919
 XrdMonSucker.cxx:920
 XrdMonSucker.cxx:921
 XrdMonSucker.cxx:922
 XrdMonSucker.cxx:923
 XrdMonSucker.cxx:924
 XrdMonSucker.cxx:925
 XrdMonSucker.cxx:926
 XrdMonSucker.cxx:927
 XrdMonSucker.cxx:928
 XrdMonSucker.cxx:929
 XrdMonSucker.cxx:930
 XrdMonSucker.cxx:931
 XrdMonSucker.cxx:932
 XrdMonSucker.cxx:933
 XrdMonSucker.cxx:934
 XrdMonSucker.cxx:935
 XrdMonSucker.cxx:936
 XrdMonSucker.cxx:937
 XrdMonSucker.cxx:938
 XrdMonSucker.cxx:939
 XrdMonSucker.cxx:940
 XrdMonSucker.cxx:941
 XrdMonSucker.cxx:942
 XrdMonSucker.cxx:943
 XrdMonSucker.cxx:944
 XrdMonSucker.cxx:945
 XrdMonSucker.cxx:946
 XrdMonSucker.cxx:947
 XrdMonSucker.cxx:948
 XrdMonSucker.cxx:949
 XrdMonSucker.cxx:950
 XrdMonSucker.cxx:951
 XrdMonSucker.cxx:952
 XrdMonSucker.cxx:953
 XrdMonSucker.cxx:954
 XrdMonSucker.cxx:955
 XrdMonSucker.cxx:956
 XrdMonSucker.cxx:957
 XrdMonSucker.cxx:958
 XrdMonSucker.cxx:959
 XrdMonSucker.cxx:960
 XrdMonSucker.cxx:961
 XrdMonSucker.cxx:962
 XrdMonSucker.cxx:963
 XrdMonSucker.cxx:964
 XrdMonSucker.cxx:965
 XrdMonSucker.cxx:966
 XrdMonSucker.cxx:967
 XrdMonSucker.cxx:968
 XrdMonSucker.cxx:969
 XrdMonSucker.cxx:970
 XrdMonSucker.cxx:971
 XrdMonSucker.cxx:972
 XrdMonSucker.cxx:973
 XrdMonSucker.cxx:974
 XrdMonSucker.cxx:975
 XrdMonSucker.cxx:976
 XrdMonSucker.cxx:977
 XrdMonSucker.cxx:978
 XrdMonSucker.cxx:979
 XrdMonSucker.cxx:980
 XrdMonSucker.cxx:981
 XrdMonSucker.cxx:982
 XrdMonSucker.cxx:983
 XrdMonSucker.cxx:984
 XrdMonSucker.cxx:985
 XrdMonSucker.cxx:986
 XrdMonSucker.cxx:987
 XrdMonSucker.cxx:988
 XrdMonSucker.cxx:989
 XrdMonSucker.cxx:990
 XrdMonSucker.cxx:991
 XrdMonSucker.cxx:992
 XrdMonSucker.cxx:993
 XrdMonSucker.cxx:994
 XrdMonSucker.cxx:995
 XrdMonSucker.cxx:996
 XrdMonSucker.cxx:997
 XrdMonSucker.cxx:998
 XrdMonSucker.cxx:999
 XrdMonSucker.cxx:1000
 XrdMonSucker.cxx:1001
 XrdMonSucker.cxx:1002
 XrdMonSucker.cxx:1003
 XrdMonSucker.cxx:1004
 XrdMonSucker.cxx:1005
 XrdMonSucker.cxx:1006
 XrdMonSucker.cxx:1007
 XrdMonSucker.cxx:1008
 XrdMonSucker.cxx:1009
 XrdMonSucker.cxx:1010
 XrdMonSucker.cxx:1011
 XrdMonSucker.cxx:1012
 XrdMonSucker.cxx:1013
 XrdMonSucker.cxx:1014
 XrdMonSucker.cxx:1015
 XrdMonSucker.cxx:1016
 XrdMonSucker.cxx:1017
 XrdMonSucker.cxx:1018
 XrdMonSucker.cxx:1019
 XrdMonSucker.cxx:1020
 XrdMonSucker.cxx:1021
 XrdMonSucker.cxx:1022
 XrdMonSucker.cxx:1023
 XrdMonSucker.cxx:1024
 XrdMonSucker.cxx:1025
 XrdMonSucker.cxx:1026
 XrdMonSucker.cxx:1027
 XrdMonSucker.cxx:1028
 XrdMonSucker.cxx:1029
 XrdMonSucker.cxx:1030
 XrdMonSucker.cxx:1031
 XrdMonSucker.cxx:1032
 XrdMonSucker.cxx:1033
 XrdMonSucker.cxx:1034
 XrdMonSucker.cxx:1035
 XrdMonSucker.cxx:1036
 XrdMonSucker.cxx:1037
 XrdMonSucker.cxx:1038
 XrdMonSucker.cxx:1039
 XrdMonSucker.cxx:1040
 XrdMonSucker.cxx:1041
 XrdMonSucker.cxx:1042
 XrdMonSucker.cxx:1043
 XrdMonSucker.cxx:1044
 XrdMonSucker.cxx:1045
 XrdMonSucker.cxx:1046
 XrdMonSucker.cxx:1047
 XrdMonSucker.cxx:1048
 XrdMonSucker.cxx:1049
 XrdMonSucker.cxx:1050
 XrdMonSucker.cxx:1051
 XrdMonSucker.cxx:1052
 XrdMonSucker.cxx:1053
 XrdMonSucker.cxx:1054
 XrdMonSucker.cxx:1055
 XrdMonSucker.cxx:1056
 XrdMonSucker.cxx:1057
 XrdMonSucker.cxx:1058
 XrdMonSucker.cxx:1059
 XrdMonSucker.cxx:1060
 XrdMonSucker.cxx:1061
 XrdMonSucker.cxx:1062
 XrdMonSucker.cxx:1063
 XrdMonSucker.cxx:1064
 XrdMonSucker.cxx:1065
 XrdMonSucker.cxx:1066
 XrdMonSucker.cxx:1067
 XrdMonSucker.cxx:1068
 XrdMonSucker.cxx:1069
 XrdMonSucker.cxx:1070
 XrdMonSucker.cxx:1071
 XrdMonSucker.cxx:1072
 XrdMonSucker.cxx:1073
 XrdMonSucker.cxx:1074
 XrdMonSucker.cxx:1075
 XrdMonSucker.cxx:1076
 XrdMonSucker.cxx:1077
 XrdMonSucker.cxx:1078
 XrdMonSucker.cxx:1079
 XrdMonSucker.cxx:1080
 XrdMonSucker.cxx:1081
 XrdMonSucker.cxx:1082
 XrdMonSucker.cxx:1083
 XrdMonSucker.cxx:1084
 XrdMonSucker.cxx:1085
 XrdMonSucker.cxx:1086
 XrdMonSucker.cxx:1087
 XrdMonSucker.cxx:1088
 XrdMonSucker.cxx:1089
 XrdMonSucker.cxx:1090
 XrdMonSucker.cxx:1091
 XrdMonSucker.cxx:1092
 XrdMonSucker.cxx:1093
 XrdMonSucker.cxx:1094
 XrdMonSucker.cxx:1095
 XrdMonSucker.cxx:1096
 XrdMonSucker.cxx:1097
 XrdMonSucker.cxx:1098
 XrdMonSucker.cxx:1099
 XrdMonSucker.cxx:1100
 XrdMonSucker.cxx:1101
 XrdMonSucker.cxx:1102
 XrdMonSucker.cxx:1103
 XrdMonSucker.cxx:1104
 XrdMonSucker.cxx:1105
 XrdMonSucker.cxx:1106
 XrdMonSucker.cxx:1107
 XrdMonSucker.cxx:1108
 XrdMonSucker.cxx:1109
 XrdMonSucker.cxx:1110
 XrdMonSucker.cxx:1111
 XrdMonSucker.cxx:1112
 XrdMonSucker.cxx:1113
 XrdMonSucker.cxx:1114
 XrdMonSucker.cxx:1115
 XrdMonSucker.cxx:1116
 XrdMonSucker.cxx:1117
 XrdMonSucker.cxx:1118
 XrdMonSucker.cxx:1119
 XrdMonSucker.cxx:1120
 XrdMonSucker.cxx:1121
 XrdMonSucker.cxx:1122
 XrdMonSucker.cxx:1123
 XrdMonSucker.cxx:1124
 XrdMonSucker.cxx:1125
 XrdMonSucker.cxx:1126
 XrdMonSucker.cxx:1127
 XrdMonSucker.cxx:1128
 XrdMonSucker.cxx:1129
 XrdMonSucker.cxx:1130
 XrdMonSucker.cxx:1131
 XrdMonSucker.cxx:1132
 XrdMonSucker.cxx:1133
 XrdMonSucker.cxx:1134
 XrdMonSucker.cxx:1135
 XrdMonSucker.cxx:1136
 XrdMonSucker.cxx:1137
 XrdMonSucker.cxx:1138
 XrdMonSucker.cxx:1139
 XrdMonSucker.cxx:1140
 XrdMonSucker.cxx:1141
 XrdMonSucker.cxx:1142
 XrdMonSucker.cxx:1143
 XrdMonSucker.cxx:1144
 XrdMonSucker.cxx:1145
 XrdMonSucker.cxx:1146
 XrdMonSucker.cxx:1147
 XrdMonSucker.cxx:1148
 XrdMonSucker.cxx:1149
 XrdMonSucker.cxx:1150
 XrdMonSucker.cxx:1151
 XrdMonSucker.cxx:1152
 XrdMonSucker.cxx:1153
 XrdMonSucker.cxx:1154
 XrdMonSucker.cxx:1155
 XrdMonSucker.cxx:1156
 XrdMonSucker.cxx:1157
 XrdMonSucker.cxx:1158
 XrdMonSucker.cxx:1159
 XrdMonSucker.cxx:1160
 XrdMonSucker.cxx:1161
 XrdMonSucker.cxx:1162
 XrdMonSucker.cxx:1163
 XrdMonSucker.cxx:1164
 XrdMonSucker.cxx:1165
 XrdMonSucker.cxx:1166
 XrdMonSucker.cxx:1167
 XrdMonSucker.cxx:1168
 XrdMonSucker.cxx:1169
 XrdMonSucker.cxx:1170
 XrdMonSucker.cxx:1171
 XrdMonSucker.cxx:1172
 XrdMonSucker.cxx:1173
 XrdMonSucker.cxx:1174
 XrdMonSucker.cxx:1175
 XrdMonSucker.cxx:1176
 XrdMonSucker.cxx:1177
 XrdMonSucker.cxx:1178
 XrdMonSucker.cxx:1179
 XrdMonSucker.cxx:1180
 XrdMonSucker.cxx:1181
 XrdMonSucker.cxx:1182
 XrdMonSucker.cxx:1183
 XrdMonSucker.cxx:1184
 XrdMonSucker.cxx:1185
 XrdMonSucker.cxx:1186
 XrdMonSucker.cxx:1187
 XrdMonSucker.cxx:1188
 XrdMonSucker.cxx:1189
 XrdMonSucker.cxx:1190
 XrdMonSucker.cxx:1191
 XrdMonSucker.cxx:1192
 XrdMonSucker.cxx:1193
 XrdMonSucker.cxx:1194
 XrdMonSucker.cxx:1195
 XrdMonSucker.cxx:1196
 XrdMonSucker.cxx:1197
 XrdMonSucker.cxx:1198
 XrdMonSucker.cxx:1199
 XrdMonSucker.cxx:1200
 XrdMonSucker.cxx:1201
 XrdMonSucker.cxx:1202
 XrdMonSucker.cxx:1203
 XrdMonSucker.cxx:1204
 XrdMonSucker.cxx:1205
 XrdMonSucker.cxx:1206
 XrdMonSucker.cxx:1207
 XrdMonSucker.cxx:1208
 XrdMonSucker.cxx:1209
 XrdMonSucker.cxx:1210
 XrdMonSucker.cxx:1211
 XrdMonSucker.cxx:1212
 XrdMonSucker.cxx:1213
 XrdMonSucker.cxx:1214
 XrdMonSucker.cxx:1215
 XrdMonSucker.cxx:1216
 XrdMonSucker.cxx:1217
 XrdMonSucker.cxx:1218
 XrdMonSucker.cxx:1219
 XrdMonSucker.cxx:1220
 XrdMonSucker.cxx:1221
 XrdMonSucker.cxx:1222
 XrdMonSucker.cxx:1223
 XrdMonSucker.cxx:1224
 XrdMonSucker.cxx:1225
 XrdMonSucker.cxx:1226
 XrdMonSucker.cxx:1227
 XrdMonSucker.cxx:1228
 XrdMonSucker.cxx:1229
 XrdMonSucker.cxx:1230
 XrdMonSucker.cxx:1231
 XrdMonSucker.cxx:1232
 XrdMonSucker.cxx:1233
 XrdMonSucker.cxx:1234
 XrdMonSucker.cxx:1235
 XrdMonSucker.cxx:1236
 XrdMonSucker.cxx:1237
 XrdMonSucker.cxx:1238
 XrdMonSucker.cxx:1239
 XrdMonSucker.cxx:1240
 XrdMonSucker.cxx:1241
 XrdMonSucker.cxx:1242
 XrdMonSucker.cxx:1243
 XrdMonSucker.cxx:1244
 XrdMonSucker.cxx:1245
 XrdMonSucker.cxx:1246
 XrdMonSucker.cxx:1247
 XrdMonSucker.cxx:1248
 XrdMonSucker.cxx:1249
 XrdMonSucker.cxx:1250
 XrdMonSucker.cxx:1251
 XrdMonSucker.cxx:1252
 XrdMonSucker.cxx:1253
 XrdMonSucker.cxx:1254
 XrdMonSucker.cxx:1255
 XrdMonSucker.cxx:1256
 XrdMonSucker.cxx:1257
 XrdMonSucker.cxx:1258
 XrdMonSucker.cxx:1259
 XrdMonSucker.cxx:1260
 XrdMonSucker.cxx:1261
 XrdMonSucker.cxx:1262
 XrdMonSucker.cxx:1263
 XrdMonSucker.cxx:1264
 XrdMonSucker.cxx:1265
 XrdMonSucker.cxx:1266
 XrdMonSucker.cxx:1267
 XrdMonSucker.cxx:1268
 XrdMonSucker.cxx:1269
 XrdMonSucker.cxx:1270
 XrdMonSucker.cxx:1271
 XrdMonSucker.cxx:1272
 XrdMonSucker.cxx:1273
 XrdMonSucker.cxx:1274
 XrdMonSucker.cxx:1275
 XrdMonSucker.cxx:1276
 XrdMonSucker.cxx:1277
 XrdMonSucker.cxx:1278
 XrdMonSucker.cxx:1279
 XrdMonSucker.cxx:1280
 XrdMonSucker.cxx:1281
 XrdMonSucker.cxx:1282
 XrdMonSucker.cxx:1283
 XrdMonSucker.cxx:1284
 XrdMonSucker.cxx:1285