ROOT logo
// $Id: XrdServer.cxx 2778 2012-06-14 19:15:02Z 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 "XrdServer.h"
#include "XrdUser.h"
#include "XrdFile.h"
#include "XrdServer.c7"

// XrdServer

//______________________________________________________________________________
//
// Represents a running xrootd server instance.
// Stores current sessions, represented by glass XrdUser, as list
// elements (lookup by name). Map dict_id -> XrdUser is also kept.
// Once a user disconnects, it is moved to owned list mPrevUsers.
//
// Map dict_id -> XrdFile is also stored here.

ClassImp(XrdServer);

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

void XrdServer::_init()
{
  mLastSrvIdTime.SetNever();
  mAvgSrvIdDelta = -1;
  mPacketCount = mSeqIdFailCount = 0;
  ResetSrvSeq();
}

XrdServer::XrdServer(const TString& n, const TString& t) :
  ZNameMap(n, t)
{
  _init();
}

XrdServer::XrdServer(const TString& n, const TString& t, const TString& h, const TString& d, const GTime& st) :
  ZNameMap(n, t),
  mHost(h), mDomain(d), mStartTime(st)
{
  _init();
}

XrdServer::~XrdServer()
{}

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

void XrdServer::AdEnlightenment()
{
  PARENT_GLASS::AdEnlightenment();
  if (mPrevUsers == 0)
  {
    assign_link<ZList>(mPrevUsers, FID(), "PrevUsers",
                       GForm("Previous users of %s", GetName()));
    mPrevUsers->SetElementFID(XrdUser::FID());
    mPrevUsers->SetMIRActive(false);
  }
}

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

TString XrdServer::GetFqhn() const
{
  return mHost + "." + mDomain;
}

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

void XrdServer::UpdateSrvIdTime(const GTime& t)
{
  if ( ! mLastSrvIdTime.IsNever())
  {
    Int_t dt = TMath::Max(10, TMath::Nint((t - mLastSrvIdTime).ToDouble()));
    if (mAvgSrvIdDelta <= 0)
    {
      mAvgSrvIdDelta = dt;
    }
    else if (dt < mAvgSrvIdDelta)
    {
      mAvgSrvIdDelta = TMath::Nint(0.9*mAvgSrvIdDelta + 0.1*dt);
    }
  }
  mLastSrvIdTime = t;
  Stamp(FID());
}

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

void XrdServer::IncPacketCount()
{
  if (++mPacketCount % 100 == 0)
    Stamp(FID());
}

void XrdServer::IncSeqIdFailCount()
{
  ++mSeqIdFailCount;
  Stamp(FID());
}

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

Bool_t XrdServer::ExistsUserDictId(Int_t dict_id)
{
  GMutexHolder _lck(mUserMapMutex);
  return mUserMap.find(dict_id) != mUserMap.end();
}

void XrdServer::AddUser(XrdUser* user, Int_t dict_id)
{
  static const Exc_t _eh("XrdServer::AddUser ");

  GMutexHolder _lck(mUserMapMutex);

  if (mUserMap.find(dict_id) != mUserMap.end())
    throw _eh + "dict_id exists already.";

  Add(user);

  mUserMap.insert(make_pair(dict_id, user));
  user->m_dict_id = dict_id;
}

void XrdServer::DisconnectUser(XrdUser* user)
{
  static const Exc_t _eh("XrdServer::DisconnectUser ");

  {
    GMutexHolder _lck(mUserMapMutex);
    mDict2User_i i = mUserMap.find(user->m_dict_id);
    if (i == mUserMap.end())
      throw _eh + "dict_id does not exist for user '" + user->GetName() + "'.";
    mUserMap.erase(i);
  }

  mPrevUsers->Add(user);
  RemoveAll(user);
}

void XrdServer::RemovePrevUser(XrdUser* user)
{
  mPrevUsers->RemoveAll(user);
}

XrdUser* XrdServer::FindUser(const TString& name)
{
  return dynamic_cast<XrdUser*>(GetElementByName(name));
}

XrdUser* XrdServer::FindUser(Int_t dict_id)
{
  GMutexHolder _lck(mUserMapMutex);
  mDict2User_i i = mUserMap.find(dict_id);
  return (i != mUserMap.end()) ? i->second : 0;
}

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

Bool_t XrdServer::ExistsFileDictId(Int_t dict_id)
{
  GMutexHolder _lck(mFileMapMutex);
  return mFileMap.find(dict_id) != mFileMap.end();
}

void XrdServer::AddFile(XrdFile* file, Int_t dict_id)
{
  static const Exc_t _eh("XrdServer::AddFile ");

  GMutexHolder _lck(mFileMapMutex);

  if (mFileMap.find(dict_id) != mFileMap.end())
    throw _eh + "dict_id exists already.";

  mFileMap.insert(make_pair(dict_id, file));
  file->m_dict_id = dict_id;
}

void XrdServer::RemoveFile(XrdFile* file)
{
  static const Exc_t _eh("XrdServer::RemoveFile ");

  GMutexHolder _lck(mFileMapMutex);

  mDict2File_i i = mFileMap.find(file->m_dict_id);
  if (i == mFileMap.end())
    throw _eh + "dict_id not registered for file '" + file->GetName() + "'.";
  if (i->second != file)
    throw _eh + "stored file '" + file->GetName() +
                "' and file passed as argument '" + i->second->GetName() +
                "' do not match.";

  mFileMap.erase(i);
}

XrdFile* XrdServer::FindFile(Int_t dict_id)
{
  GMutexHolder _lck(mFileMapMutex);

  mDict2File_i i = mFileMap.find(dict_id);
  return (i != mFileMap.end()) ? i->second : 0;
}
 XrdServer.cxx:1
 XrdServer.cxx:2
 XrdServer.cxx:3
 XrdServer.cxx:4
 XrdServer.cxx:5
 XrdServer.cxx:6
 XrdServer.cxx:7
 XrdServer.cxx:8
 XrdServer.cxx:9
 XrdServer.cxx:10
 XrdServer.cxx:11
 XrdServer.cxx:12
 XrdServer.cxx:13
 XrdServer.cxx:14
 XrdServer.cxx:15
 XrdServer.cxx:16
 XrdServer.cxx:17
 XrdServer.cxx:18
 XrdServer.cxx:19
 XrdServer.cxx:20
 XrdServer.cxx:21
 XrdServer.cxx:22
 XrdServer.cxx:23
 XrdServer.cxx:24
 XrdServer.cxx:25
 XrdServer.cxx:26
 XrdServer.cxx:27
 XrdServer.cxx:28
 XrdServer.cxx:29
 XrdServer.cxx:30
 XrdServer.cxx:31
 XrdServer.cxx:32
 XrdServer.cxx:33
 XrdServer.cxx:34
 XrdServer.cxx:35
 XrdServer.cxx:36
 XrdServer.cxx:37
 XrdServer.cxx:38
 XrdServer.cxx:39
 XrdServer.cxx:40
 XrdServer.cxx:41
 XrdServer.cxx:42
 XrdServer.cxx:43
 XrdServer.cxx:44
 XrdServer.cxx:45
 XrdServer.cxx:46
 XrdServer.cxx:47
 XrdServer.cxx:48
 XrdServer.cxx:49
 XrdServer.cxx:50
 XrdServer.cxx:51
 XrdServer.cxx:52
 XrdServer.cxx:53
 XrdServer.cxx:54
 XrdServer.cxx:55
 XrdServer.cxx:56
 XrdServer.cxx:57
 XrdServer.cxx:58
 XrdServer.cxx:59
 XrdServer.cxx:60
 XrdServer.cxx:61
 XrdServer.cxx:62
 XrdServer.cxx:63
 XrdServer.cxx:64
 XrdServer.cxx:65
 XrdServer.cxx:66
 XrdServer.cxx:67
 XrdServer.cxx:68
 XrdServer.cxx:69
 XrdServer.cxx:70
 XrdServer.cxx:71
 XrdServer.cxx:72
 XrdServer.cxx:73
 XrdServer.cxx:74
 XrdServer.cxx:75
 XrdServer.cxx:76
 XrdServer.cxx:77
 XrdServer.cxx:78
 XrdServer.cxx:79
 XrdServer.cxx:80
 XrdServer.cxx:81
 XrdServer.cxx:82
 XrdServer.cxx:83
 XrdServer.cxx:84
 XrdServer.cxx:85
 XrdServer.cxx:86
 XrdServer.cxx:87
 XrdServer.cxx:88
 XrdServer.cxx:89
 XrdServer.cxx:90
 XrdServer.cxx:91
 XrdServer.cxx:92
 XrdServer.cxx:93
 XrdServer.cxx:94
 XrdServer.cxx:95
 XrdServer.cxx:96
 XrdServer.cxx:97
 XrdServer.cxx:98
 XrdServer.cxx:99
 XrdServer.cxx:100
 XrdServer.cxx:101
 XrdServer.cxx:102
 XrdServer.cxx:103
 XrdServer.cxx:104
 XrdServer.cxx:105
 XrdServer.cxx:106
 XrdServer.cxx:107
 XrdServer.cxx:108
 XrdServer.cxx:109
 XrdServer.cxx:110
 XrdServer.cxx:111
 XrdServer.cxx:112
 XrdServer.cxx:113
 XrdServer.cxx:114
 XrdServer.cxx:115
 XrdServer.cxx:116
 XrdServer.cxx:117
 XrdServer.cxx:118
 XrdServer.cxx:119
 XrdServer.cxx:120
 XrdServer.cxx:121
 XrdServer.cxx:122
 XrdServer.cxx:123
 XrdServer.cxx:124
 XrdServer.cxx:125
 XrdServer.cxx:126
 XrdServer.cxx:127
 XrdServer.cxx:128
 XrdServer.cxx:129
 XrdServer.cxx:130
 XrdServer.cxx:131
 XrdServer.cxx:132
 XrdServer.cxx:133
 XrdServer.cxx:134
 XrdServer.cxx:135
 XrdServer.cxx:136
 XrdServer.cxx:137
 XrdServer.cxx:138
 XrdServer.cxx:139
 XrdServer.cxx:140
 XrdServer.cxx:141
 XrdServer.cxx:142
 XrdServer.cxx:143
 XrdServer.cxx:144
 XrdServer.cxx:145
 XrdServer.cxx:146
 XrdServer.cxx:147
 XrdServer.cxx:148
 XrdServer.cxx:149
 XrdServer.cxx:150
 XrdServer.cxx:151
 XrdServer.cxx:152
 XrdServer.cxx:153
 XrdServer.cxx:154
 XrdServer.cxx:155
 XrdServer.cxx:156
 XrdServer.cxx:157
 XrdServer.cxx:158
 XrdServer.cxx:159
 XrdServer.cxx:160
 XrdServer.cxx:161
 XrdServer.cxx:162
 XrdServer.cxx:163
 XrdServer.cxx:164
 XrdServer.cxx:165
 XrdServer.cxx:166
 XrdServer.cxx:167
 XrdServer.cxx:168
 XrdServer.cxx:169
 XrdServer.cxx:170
 XrdServer.cxx:171
 XrdServer.cxx:172
 XrdServer.cxx:173
 XrdServer.cxx:174
 XrdServer.cxx:175
 XrdServer.cxx:176
 XrdServer.cxx:177
 XrdServer.cxx:178
 XrdServer.cxx:179
 XrdServer.cxx:180
 XrdServer.cxx:181
 XrdServer.cxx:182
 XrdServer.cxx:183
 XrdServer.cxx:184
 XrdServer.cxx:185
 XrdServer.cxx:186
 XrdServer.cxx:187
 XrdServer.cxx:188
 XrdServer.cxx:189
 XrdServer.cxx:190
 XrdServer.cxx:191
 XrdServer.cxx:192
 XrdServer.cxx:193
 XrdServer.cxx:194
 XrdServer.cxx:195
 XrdServer.cxx:196
 XrdServer.cxx:197
 XrdServer.cxx:198
 XrdServer.cxx:199
 XrdServer.cxx:200
 XrdServer.cxx:201
 XrdServer.cxx:202
 XrdServer.cxx:203
 XrdServer.cxx:204
 XrdServer.cxx:205
 XrdServer.cxx:206