XrdMonSndDummyXrootd.cc

Go to the documentation of this file.
00001 /*****************************************************************************/
00002 /*                                                                           */
00003 /*                         XrdMonSndDummyXrootd.cc                           */
00004 /*                                                                           */
00005 /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */
00006 /*                            All Rights Reserved                            */
00007 /*       Produced by Jacek Becla for Stanford University under contract      */
00008 /*              DE-AC02-76SF00515 with the Department of Energy              */
00009 /*****************************************************************************/
00010 
00011 // $Id: XrdMonSndDummyXrootd.cc 24468 2008-06-22 16:47:03Z ganis $
00012 
00013 #include "XrdMon/XrdMonSndDummyXrootd.hh"
00014 #include "XrdMon/XrdMonSndDebug.hh"
00015 #include "XrdSys/XrdSysHeaders.hh"
00016 
00017 #include "sys/time.h"
00018 #include <fstream>
00019 #include <iomanip>
00020 #include <sstream>
00021 using std::cerr;
00022 using std::cout;
00023 using std::endl;
00024 using std::ifstream;
00025 using std::setfill;
00026 using std::setw;
00027 using std::stringstream;
00028 
00029 // create new user/process/file every ... calls
00030 kXR_int16 XrdMonSndDummyXrootd::NEWUSERFREQUENCY = 1;
00031 kXR_int16 XrdMonSndDummyXrootd::NEWPROCFREQUENCY = 1;
00032 kXR_int16 XrdMonSndDummyXrootd::NEWFILEFREQUENCY = 1;
00033 
00034 kXR_int16 XrdMonSndDummyXrootd::MAXHOSTS         = 20;
00035 
00036 XrdMonSndDummyXrootd::XrdMonSndDummyXrootd()
00037     : _noCalls2NewUser(1), 
00038       _noCalls2NewProc(0),
00039       _noCalls2NewFile(0),
00040       _firstAvailId(0)
00041 {}
00042 
00043 XrdMonSndDummyXrootd::~XrdMonSndDummyXrootd()
00044 {
00045     cout << "this is the mapping:\n";
00046     int i, size = _noTracesPerDict.size();
00047     for (i=0 ; i<size ; i++) {
00048         cout << setw(9) << setfill('0') << i << "  --> " 
00049              << setw(4) << setfill('0') << _noTracesPerDict[i] << " entries" << endl;
00050     }
00051 }
00052 
00053 int
00054 XrdMonSndDummyXrootd::initialize(const char* pathFile) 
00055 {
00056     return readPaths(pathFile);
00057 }
00058 
00059 XrdMonSndDictEntry
00060 XrdMonSndDummyXrootd::newXrdMonSndDictEntry()
00061 {
00062     --_noCalls2NewUser;
00063     --_noCalls2NewProc;
00064     
00065     if ( _noCalls2NewUser == 0 ) { createUser();    }
00066     if ( _noCalls2NewProc == 0 ) { createProcess(); }
00067     createFile();
00068 
00069     User& user     = _users[_activeUser];
00070     User::HostAndPid& hp = user.myProcesses[_activeProcess];
00071     PathData& pd   = _paths[ hp.myFiles[_activeFile] ];
00072 
00073 
00074     XrdMonSndDictEntry e(generateUserName(user.uid), 
00075                 hp.pid, 
00076                 pd.fd, 
00077                 hp.name, 
00078                 pd.path, 
00079                 _firstAvailId++);
00080     _noTracesPerDict.push_back(0);
00081     _openFiles.push_back(true);
00082     
00083     return e;
00084 }
00085 
00086 XrdMonSndStageEntry
00087 XrdMonSndDummyXrootd::newXrdMonSndStageEntry()
00088 {
00089     User& user     = _users[_activeUser];
00090     User::HostAndPid& hp = user.myProcesses[_activeProcess];
00091     PathData& pd   = _paths[ hp.myFiles[_activeFile] ];
00092 
00093     struct timeval tv;
00094     gettimeofday(&tv, 0);
00095 
00096     XrdMonSndStageEntry e(generateUserName(user.uid), 
00097                           hp.pid, 
00098                           pd.fd, 
00099                           hp.name, 
00100                           pd.path, 
00101                           rand() % 20000, // bytes
00102                           rand() % 90,    // seconds
00103                           tv.tv_sec,      // tod
00104                          _firstAvailId++);
00105     
00106     return e;
00107 }
00108 
00109 XrdMonSndTraceEntry
00110 XrdMonSndDummyXrootd::newXrdMonSndTraceEntry()
00111 {
00112     // make sure it is sometimes>2GB
00113     kXR_int64 offset = ((kXR_int64) rand())*(rand()%512);
00114     kXR_int32 length = 16384;
00115     kXR_int32 id = (kXR_unt32) rand() % _firstAvailId; // do this until finds still open file
00116 
00117     XrdMonSndTraceEntry d(offset, length, id);
00118     ++(_noTracesPerDict[id]);
00119     return d;
00120 }
00121 
00122 kXR_int32
00123 XrdMonSndDummyXrootd::closeOneFile()
00124 {
00125     while ( 1 ) {
00126         kXR_int32 id = (kXR_unt32) rand() % _firstAvailId;
00127         if ( _openFiles[id] ) {
00128             _openFiles[id] = false;
00129             return id;
00130         }
00131     }
00132     return 0;
00133 }
00134 
00135 void 
00136 XrdMonSndDummyXrootd::closeFiles(vector<kXR_int32>& closedFiles)
00137 {
00138     for (kXR_int32 i=0 ; i<_firstAvailId ; i++) {
00139         if ( _openFiles[i] ) {
00140             closedFiles.push_back(i);
00141         }
00142     }
00143 }
00144 
00145 int
00146 XrdMonSndDummyXrootd::readPaths(const char* pathFile)
00147 {
00148     ifstream f(pathFile);
00149     if ( ! f ) {
00150         cerr << "Error opening file " << pathFile << endl;
00151         return 1;
00152     }
00153     
00154     kXR_int16 fd = 100;
00155     while ( f ) {
00156         char buffer[256];
00157         f >> buffer;
00158         _paths.push_back( PathData(buffer, fd++) );
00159     }
00160     f.close();
00161 
00162     return 0;
00163 }
00164 
00165 void
00166 XrdMonSndDummyXrootd::createUser()
00167 {
00168     _noCalls2NewUser = NEWUSERFREQUENCY;
00169     _noCalls2NewProc = 0; // force creation of new process
00170 
00171     // generate new user
00172     kXR_int16 newid = 1 + (kXR_unt16) rand() % 5000; // user id range: 0-5000
00173     // check if it already exists
00174     int i, s = _users.size();
00175     for ( i=0 ; i<s ; i++ ) {
00176         if ( _users[i].uid == newid ) {
00177             if ( XrdMonSndDebug::verbose(XrdMonSndDebug::Generator) ) {
00178                 cout << "Generated uid that already exists" << endl;
00179             }
00180             _activeUser = i;
00181             return;
00182         }
00183     }
00184     // no it does not, so register it and use it
00185     _users.push_back( User(newid) );
00186     _activeUser = _users.size() - 1;
00187     if ( XrdMonSndDebug::verbose(XrdMonSndDebug::Generator) ) {
00188         cout << "Created new user, offset " << _activeUser
00189              << ", uid " << newid << endl;
00190     }
00191 }
00192 
00193 
00194 void
00195 XrdMonSndDummyXrootd::createProcess()
00196 {
00197     _noCalls2NewProc = NEWPROCFREQUENCY;
00198     _noCalls2NewFile = 0; // force creation of new file
00199 
00200     User& user = _users[_activeUser];
00201     
00202     // generate new process
00203     kXR_int16 newid = 1 + (kXR_unt16) rand() % 10000; // pid range: 0-10000
00204     string newhost = generateHostName();
00205     // check if it already exists
00206     int i, s = user.myProcesses.size();
00207     for ( i=0 ; i<s ; i++ ) {
00208         if ( user.myProcesses[i].pid  == newid && 
00209              user.myProcesses[i].name == newhost ) {
00210             if ( XrdMonSndDebug::verbose(XrdMonSndDebug::Generator) ) {
00211                 cout << "Generated host:pid that already exists" << endl;
00212             }
00213             _activeProcess = i;
00214             return;
00215         }
00216     }
00217     // no it does not, so register it and use it
00218     user.myProcesses.push_back(User::HostAndPid(newhost, newid));
00219     _activeProcess = user.myProcesses.size() - 1;
00220     if ( XrdMonSndDebug::verbose(XrdMonSndDebug::Generator) ) {
00221         cout << "Created new process, offset " << _activeProcess
00222              << ", " << newhost << ":" << newid << endl;
00223     }
00224 }
00225 
00226 void
00227 XrdMonSndDummyXrootd::createFile()
00228 {
00229     _noCalls2NewFile = NEWFILEFREQUENCY;
00230 
00231     User& user = _users[_activeUser];
00232     vector<User::HostAndPid>& myProcesses = user.myProcesses;
00233     User::HostAndPid& hp = myProcesses[_activeProcess];
00234     vector<kXR_int16>& myFiles = hp.myFiles;
00235 
00236     // open new file
00237     kXR_int16 newOffset = (kXR_unt16) rand() % _paths.size();
00238     // check if it is already open
00239     int i, s = myFiles.size();
00240     for ( i=0 ; i<s ; i++ ) {
00241         if ( myFiles[i] == newOffset ) {
00242             if ( XrdMonSndDebug::verbose(XrdMonSndDebug::Generator) ) {
00243                 cout << "Generated file descr that already exists" << endl;
00244             }
00245             _activeFile = i;
00246             return;
00247         }
00248     }
00249     // no it does not, so register it and use it
00250     myFiles.push_back(newOffset);
00251     _activeFile = myFiles.size() - 1;
00252     _newFile = true;
00253     if ( XrdMonSndDebug::verbose(XrdMonSndDebug::Generator) ) {
00254         PathData &pd = _paths[myFiles[_activeFile]];
00255         cout << "Created new file " << pd.path
00256              << " -> " << pd.fd << endl;
00257     }
00258 }
00259 
00260 string
00261 XrdMonSndDummyXrootd::generateHostName()
00262 {
00263     vector<string> type;
00264     type.push_back("barb");
00265     type.push_back("noma");
00266     type.push_back("tori");
00267     type.push_back("bronco");
00268 
00269     kXR_unt16 t = (kXR_unt16) rand() % 3;
00270     kXR_unt16 x = (kXR_unt16) rand() % MAXHOSTS;
00271     stringstream ss(stringstream::out);
00272     ss << type[t] << setw(4) << setfill('0') << x << ".slac.stanford.edu";
00273 
00274     return ss.str();
00275 }
00276 
00277 string
00278 XrdMonSndDummyXrootd::generateUserName(kXR_int16 uid)
00279 {
00280     stringstream ss;
00281     ss << "a_" << uid << "_User";
00282     return ss.str();
00283 }
00284 

Generated on Tue Jul 5 14:46:43 2011 for ROOT_528-00b_version by  doxygen 1.5.1