00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
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,
00102 rand() % 90,
00103 tv.tv_sec,
00104 _firstAvailId++);
00105
00106 return e;
00107 }
00108
00109 XrdMonSndTraceEntry
00110 XrdMonSndDummyXrootd::newXrdMonSndTraceEntry()
00111 {
00112
00113 kXR_int64 offset = ((kXR_int64) rand())*(rand()%512);
00114 kXR_int32 length = 16384;
00115 kXR_int32 id = (kXR_unt32) rand() % _firstAvailId;
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;
00170
00171
00172 kXR_int16 newid = 1 + (kXR_unt16) rand() % 5000;
00173
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
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;
00199
00200 User& user = _users[_activeUser];
00201
00202
00203 kXR_int16 newid = 1 + (kXR_unt16) rand() % 10000;
00204 string newhost = generateHostName();
00205
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
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
00237 kXR_int16 newOffset = (kXR_unt16) rand() % _paths.size();
00238
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
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