ROOT logo
// $Id: XrdFileCloseReporterGratia.cxx 2785 2012-06-21 23:33:49Z 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 "XrdFileCloseReporterGratia.h"
#include "XrdFileCloseReporterGratia.c7"

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

#include "Glasses/ZLog.h"

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

#include <cerrno>

// XrdFileCloseReporterGratia

//______________________________________________________________________________
//
//

ClassImp(XrdFileCloseReporterGratia);

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

void XrdFileCloseReporterGratia::_init()
{
  mUdpHost = "localhost";
  mUdpPort = 4242;
}

XrdFileCloseReporterGratia::XrdFileCloseReporterGratia(const Text_t* n, const Text_t* t) :
  XrdFileCloseReporter(n, t),
  mReporterSocket(0)
{
  _init();
}

XrdFileCloseReporterGratia::~XrdFileCloseReporterGratia()
{}

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

void XrdFileCloseReporterGratia::ReportLoopInit()
{
  static const Exc_t _eh("XrdFileCloseReporterGratia::ReportLoopInit ");

  mLastUidBase = mLastUidInner = 0;

  mSAddr = new struct sockaddr;
  {
    struct addrinfo *result;
    struct addrinfo  hints;
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family   = AF_INET; // AF_UNSPEC; this pulls out IP6 for localhost
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_protocol = IPPROTO_UDP;
    hints.ai_flags    = AI_NUMERICSERV;

    int error = getaddrinfo(mUdpHost, TString::Format("%hu", mUdpPort), &hints, &result);
    if (error != 0)
      throw _eh + "getaddrinfo failed: " + gai_strerror(error);

    memcpy(mSAddr, result->ai_addr, sizeof(struct sockaddr));

    freeaddrinfo(result);
  }

  if ((mReporterSocket = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    throw _eh + "socket failed: " + strerror(errno);
}

namespace
{
  Long64_t dtoll (Double_t x) { return static_cast<Long64_t>(x);   }
  Double_t dmtod (Double_t x) { return 1024.0 * 1024.0 * x;        }
  Long64_t dmtoll(Double_t x) { return dtoll(dmtod(x));            }
}

void XrdFileCloseReporterGratia::ReportFileClosed(FileUserServer& fus)
{
  static const Exc_t _eh("XrdFileCloseReporterGratia::ReportFileClosed ");

  XrdFile   *file   = fus.fFile;
  XrdUser   *user   = fus.fUser;
  XrdServer *server = fus.fServer;

  TString msg("#begin\n");

  {
    GLensReadHolder _flck(file);

    Long64_t unique_id = 1000ll * file->RefCloseTime().ToMiliSec();
    if (unique_id == mLastUidBase)
    {
      unique_id = mLastUidBase + ++mLastUidInner;
      if (mLastUidInner >= 1000ll)
      {
	ZLog::Helper log(*mLog, ZLog::L_Warning, _eh);
	log.Form("Inner counter for unique-id overflowed for file='%s'.", file->GetName());
	return;
      }
    }
    else
    {
      mLastUidBase  = unique_id;
      mLastUidInner = 0;
    }

    const SRange &RS   = file->RefReadStats();
    const SRange &RSS  = file->RefSingleReadStats();
    const SRange &RSV  = file->RefVecReadStats();
    const SRange &RSVC = file->RefVecReadCntStats();
    const SRange &WS   = file->RefWriteStats();
    msg += TString::Format
      ("unique_id=xrd-%lld\n"
       "file_lfn=%s\nfile_size=%lld\nstart_time=%llu\nend_time=%llu\n"
       "read_bytes=%lld\nread_operations=%llu\nread_min=%lld\nread_max=%lld\nread_average=%f\nread_sigma=%f\n"
       "read_single_bytes=%lld\nread_single_operations=%llu\nread_single_min=%lld\nread_single_max=%lld\nread_single_average=%f\nread_single_sigma=%f\n"
       "read_vector_bytes=%lld\nread_vector_operations=%llu\nread_vector_min=%lld\nread_vector_max=%lld\nread_vector_average=%f\nread_vector_sigma=%f\n"
       "read_vector_count_min=%lld\nread_vector_count_max=%lld\nread_vector_count_average=%f\nread_vector_count_sigma=%f\n"
       "write_bytes=%lld\nwrite_operations=%llu\nwrite_min=%lld\nwrite_max=%lld\nwrite_average=%f\nwrite_sigma=%f\n"
       "read_bytes_at_close=%lld\n"
       "write_bytes_at_close=%lld\n",
       unique_id,
       file->GetName(), dmtoll(file->GetSizeMB()), file->RefOpenTime().GetSec(), file->RefCloseTime().GetSec(),
       dmtoll(RS .GetSumX()), RS .GetN(), dmtoll(RS .GetMin()), dmtoll(RS .GetMax()), dmtod(RS .GetAverage()), dmtod(RS .GetSigma()),
       dmtoll(RSS.GetSumX()), RSS.GetN(), dmtoll(RSS.GetMin()), dmtoll(RSS.GetMax()), dmtod(RSS.GetAverage()), dmtod(RSS.GetSigma()),
       dmtoll(RSV.GetSumX()), RSV.GetN(), dmtoll(RSV.GetMin()), dmtoll(RSV.GetMax()), dmtod(RSV.GetAverage()), dmtod(RSV.GetSigma()),
                                          dtoll(RSVC.GetMin()), dtoll(RSVC.GetMax()), RSVC.GetAverage(),       RSVC.GetSigma(),
       dmtoll(WS .GetSumX()), WS .GetN(), dmtoll(WS .GetMin()), dmtoll(WS .GetMax()), dmtod(WS .GetAverage()), dmtod(WS .GetSigma()),
       dmtoll(file->GetRTotalMB()),
       dmtoll(file->GetWTotalMB()));
  }
  {
    GLensReadHolder _ulck(user);
    msg += TString::Format
      ("user_dn=%s\nuser_vo=%s\nuser_role=%s\nuser_fqan=%s\nclient_domain=%s\nclient_host=%s\n"
       "server_username=%s\napp_info=%s\n",
       user->GetDN(), user->GetVO(), user->GetRole(), user->GetGroup(),
       user->GetFromDomain(), user->GetFromHost(), user->GetServerUsername(), user->GetAppInfo());
  }
  {
    GLensReadHolder _slck(server);
    msg += TString::Format
      ("server_domain=%s\nserver_host=%s\n",
       server->GetDomain(), server->GetHost());
  }

  msg += "#end\n";

  if (sendto(mReporterSocket, msg.Data(), msg.Length() + 1, 0, mSAddr, sizeof(struct sockaddr)) == -1)
  {
    ZLog::Helper log(*mLog, ZLog::L_Error, _eh);
    log.Form("Error sending report for file='%s'.\n\t%s.",
	     file->GetName(), strerror(errno));
  }
}

void XrdFileCloseReporterGratia::ReportLoopFinalize()
{
  close(mReporterSocket);
  mReporterSocket = 0;
}
 XrdFileCloseReporterGratia.cxx:1
 XrdFileCloseReporterGratia.cxx:2
 XrdFileCloseReporterGratia.cxx:3
 XrdFileCloseReporterGratia.cxx:4
 XrdFileCloseReporterGratia.cxx:5
 XrdFileCloseReporterGratia.cxx:6
 XrdFileCloseReporterGratia.cxx:7
 XrdFileCloseReporterGratia.cxx:8
 XrdFileCloseReporterGratia.cxx:9
 XrdFileCloseReporterGratia.cxx:10
 XrdFileCloseReporterGratia.cxx:11
 XrdFileCloseReporterGratia.cxx:12
 XrdFileCloseReporterGratia.cxx:13
 XrdFileCloseReporterGratia.cxx:14
 XrdFileCloseReporterGratia.cxx:15
 XrdFileCloseReporterGratia.cxx:16
 XrdFileCloseReporterGratia.cxx:17
 XrdFileCloseReporterGratia.cxx:18
 XrdFileCloseReporterGratia.cxx:19
 XrdFileCloseReporterGratia.cxx:20
 XrdFileCloseReporterGratia.cxx:21
 XrdFileCloseReporterGratia.cxx:22
 XrdFileCloseReporterGratia.cxx:23
 XrdFileCloseReporterGratia.cxx:24
 XrdFileCloseReporterGratia.cxx:25
 XrdFileCloseReporterGratia.cxx:26
 XrdFileCloseReporterGratia.cxx:27
 XrdFileCloseReporterGratia.cxx:28
 XrdFileCloseReporterGratia.cxx:29
 XrdFileCloseReporterGratia.cxx:30
 XrdFileCloseReporterGratia.cxx:31
 XrdFileCloseReporterGratia.cxx:32
 XrdFileCloseReporterGratia.cxx:33
 XrdFileCloseReporterGratia.cxx:34
 XrdFileCloseReporterGratia.cxx:35
 XrdFileCloseReporterGratia.cxx:36
 XrdFileCloseReporterGratia.cxx:37
 XrdFileCloseReporterGratia.cxx:38
 XrdFileCloseReporterGratia.cxx:39
 XrdFileCloseReporterGratia.cxx:40
 XrdFileCloseReporterGratia.cxx:41
 XrdFileCloseReporterGratia.cxx:42
 XrdFileCloseReporterGratia.cxx:43
 XrdFileCloseReporterGratia.cxx:44
 XrdFileCloseReporterGratia.cxx:45
 XrdFileCloseReporterGratia.cxx:46
 XrdFileCloseReporterGratia.cxx:47
 XrdFileCloseReporterGratia.cxx:48
 XrdFileCloseReporterGratia.cxx:49
 XrdFileCloseReporterGratia.cxx:50
 XrdFileCloseReporterGratia.cxx:51
 XrdFileCloseReporterGratia.cxx:52
 XrdFileCloseReporterGratia.cxx:53
 XrdFileCloseReporterGratia.cxx:54
 XrdFileCloseReporterGratia.cxx:55
 XrdFileCloseReporterGratia.cxx:56
 XrdFileCloseReporterGratia.cxx:57
 XrdFileCloseReporterGratia.cxx:58
 XrdFileCloseReporterGratia.cxx:59
 XrdFileCloseReporterGratia.cxx:60
 XrdFileCloseReporterGratia.cxx:61
 XrdFileCloseReporterGratia.cxx:62
 XrdFileCloseReporterGratia.cxx:63
 XrdFileCloseReporterGratia.cxx:64
 XrdFileCloseReporterGratia.cxx:65
 XrdFileCloseReporterGratia.cxx:66
 XrdFileCloseReporterGratia.cxx:67
 XrdFileCloseReporterGratia.cxx:68
 XrdFileCloseReporterGratia.cxx:69
 XrdFileCloseReporterGratia.cxx:70
 XrdFileCloseReporterGratia.cxx:71
 XrdFileCloseReporterGratia.cxx:72
 XrdFileCloseReporterGratia.cxx:73
 XrdFileCloseReporterGratia.cxx:74
 XrdFileCloseReporterGratia.cxx:75
 XrdFileCloseReporterGratia.cxx:76
 XrdFileCloseReporterGratia.cxx:77
 XrdFileCloseReporterGratia.cxx:78
 XrdFileCloseReporterGratia.cxx:79
 XrdFileCloseReporterGratia.cxx:80
 XrdFileCloseReporterGratia.cxx:81
 XrdFileCloseReporterGratia.cxx:82
 XrdFileCloseReporterGratia.cxx:83
 XrdFileCloseReporterGratia.cxx:84
 XrdFileCloseReporterGratia.cxx:85
 XrdFileCloseReporterGratia.cxx:86
 XrdFileCloseReporterGratia.cxx:87
 XrdFileCloseReporterGratia.cxx:88
 XrdFileCloseReporterGratia.cxx:89
 XrdFileCloseReporterGratia.cxx:90
 XrdFileCloseReporterGratia.cxx:91
 XrdFileCloseReporterGratia.cxx:92
 XrdFileCloseReporterGratia.cxx:93
 XrdFileCloseReporterGratia.cxx:94
 XrdFileCloseReporterGratia.cxx:95
 XrdFileCloseReporterGratia.cxx:96
 XrdFileCloseReporterGratia.cxx:97
 XrdFileCloseReporterGratia.cxx:98
 XrdFileCloseReporterGratia.cxx:99
 XrdFileCloseReporterGratia.cxx:100
 XrdFileCloseReporterGratia.cxx:101
 XrdFileCloseReporterGratia.cxx:102
 XrdFileCloseReporterGratia.cxx:103
 XrdFileCloseReporterGratia.cxx:104
 XrdFileCloseReporterGratia.cxx:105
 XrdFileCloseReporterGratia.cxx:106
 XrdFileCloseReporterGratia.cxx:107
 XrdFileCloseReporterGratia.cxx:108
 XrdFileCloseReporterGratia.cxx:109
 XrdFileCloseReporterGratia.cxx:110
 XrdFileCloseReporterGratia.cxx:111
 XrdFileCloseReporterGratia.cxx:112
 XrdFileCloseReporterGratia.cxx:113
 XrdFileCloseReporterGratia.cxx:114
 XrdFileCloseReporterGratia.cxx:115
 XrdFileCloseReporterGratia.cxx:116
 XrdFileCloseReporterGratia.cxx:117
 XrdFileCloseReporterGratia.cxx:118
 XrdFileCloseReporterGratia.cxx:119
 XrdFileCloseReporterGratia.cxx:120
 XrdFileCloseReporterGratia.cxx:121
 XrdFileCloseReporterGratia.cxx:122
 XrdFileCloseReporterGratia.cxx:123
 XrdFileCloseReporterGratia.cxx:124
 XrdFileCloseReporterGratia.cxx:125
 XrdFileCloseReporterGratia.cxx:126
 XrdFileCloseReporterGratia.cxx:127
 XrdFileCloseReporterGratia.cxx:128
 XrdFileCloseReporterGratia.cxx:129
 XrdFileCloseReporterGratia.cxx:130
 XrdFileCloseReporterGratia.cxx:131
 XrdFileCloseReporterGratia.cxx:132
 XrdFileCloseReporterGratia.cxx:133
 XrdFileCloseReporterGratia.cxx:134
 XrdFileCloseReporterGratia.cxx:135
 XrdFileCloseReporterGratia.cxx:136
 XrdFileCloseReporterGratia.cxx:137
 XrdFileCloseReporterGratia.cxx:138
 XrdFileCloseReporterGratia.cxx:139
 XrdFileCloseReporterGratia.cxx:140
 XrdFileCloseReporterGratia.cxx:141
 XrdFileCloseReporterGratia.cxx:142
 XrdFileCloseReporterGratia.cxx:143
 XrdFileCloseReporterGratia.cxx:144
 XrdFileCloseReporterGratia.cxx:145
 XrdFileCloseReporterGratia.cxx:146
 XrdFileCloseReporterGratia.cxx:147
 XrdFileCloseReporterGratia.cxx:148
 XrdFileCloseReporterGratia.cxx:149
 XrdFileCloseReporterGratia.cxx:150
 XrdFileCloseReporterGratia.cxx:151
 XrdFileCloseReporterGratia.cxx:152
 XrdFileCloseReporterGratia.cxx:153
 XrdFileCloseReporterGratia.cxx:154
 XrdFileCloseReporterGratia.cxx:155
 XrdFileCloseReporterGratia.cxx:156
 XrdFileCloseReporterGratia.cxx:157
 XrdFileCloseReporterGratia.cxx:158
 XrdFileCloseReporterGratia.cxx:159
 XrdFileCloseReporterGratia.cxx:160
 XrdFileCloseReporterGratia.cxx:161
 XrdFileCloseReporterGratia.cxx:162
 XrdFileCloseReporterGratia.cxx:163
 XrdFileCloseReporterGratia.cxx:164
 XrdFileCloseReporterGratia.cxx:165
 XrdFileCloseReporterGratia.cxx:166
 XrdFileCloseReporterGratia.cxx:167
 XrdFileCloseReporterGratia.cxx:168
 XrdFileCloseReporterGratia.cxx:169
 XrdFileCloseReporterGratia.cxx:170
 XrdFileCloseReporterGratia.cxx:171