1 j.alex 1.2 //%2006////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
9 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
11 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
13 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
20 //
21 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 j.alex 1.2 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include <iostream>
35 #include <Pegasus/Common/Config.h>
36 #include <Pegasus/Common/Constants.h>
37 #include <Pegasus/Common/System.h>
38 #include <Pegasus/Common/PegasusVersion.h>
39 #include <Pegasus/Common/SSLContext.h>
40 #include <Pegasus/getoopt/getoopt.h>
41 #include <Pegasus/Common/String.h>
42 #include <Pegasus/Client/CIMClient.h>
43 j.alex 1.2 #include <Pegasus/Common/FileSystem.h>
44 #include <Pegasus/Common/TimeValue.h>
45 #include <time.h>
46 #include <signal.h>
47 #include "StressTestController.h"
48 #include "StressTestControllerException.h"
49 //
50 //Windows
51 //
52 #ifdef PEGASUS_OS_TYPE_WINDOWS
53 // for DWORD etc.
|
54 kumpf 1.7 # include <windows.h>
|
55 kamal.locahana 1.5 // getpid() and others
56 typedef DWORD pid_t;
|
57 kumpf 1.7 # include <process.h>
|
58 ouyang.jian 1.6 #else
|
59 kumpf 1.7 # include <unistd.h>
|
60 j.alex 1.2 #endif
61
|
62 j.alex 1.3 //#define STRESSTEST_DEBUG
|
63 j.alex 1.2
64 #define SIXTYSECONDS 60
65 #define MILLISECONDS 1000
66 #define CHECKUP_INTERVAL 1
|
67 kamal.locahana 1.5 #define STOP_DELAY 1
68 #define SHUTDOWN_DELAY 5
69 #define RUN_DELAY 1
|
70 j.alex 1.2 #define DEFAULT_INSTANCE "5"
71
72 #define convertmin2millisecs(x) (x * SIXTYSECONDS * MILLISECONDS)
73 #define getToleranceInPercent(x,y) (100 - (((y-x)/y) * 100))
74
75
76
77 static void endAllTests(int signum);
78
79 static void cleanupProcess();
80
81 static String convertUint64toString(Uint64 x);
82
83
84 PEGASUS_NAMESPACE_BEGIN
85 PEGASUS_USING_PEGASUS;
86 PEGASUS_USING_STD;
87
88
89
90 /**
91 j.alex 1.2 Log file descripter
92 */
93
94 /**
|
95 kamal.locahana 1.5 variable for Signal handler
|
96 j.alex 1.2 */
97 static Boolean Quit = false;
98
99 /**
100 The command name.
101 */
|
102 kamal.locahana 1.5 const char StressTestControllerCommand::COMMAND_NAME [] =
|
103 j.alex 1.2 "TestStressTestController";
104
105
106 /**
|
107 kamal.locahana 1.5 StressTest Configuration file details
|
108 j.alex 1.2 */
109 char StressTestControllerCommand::FILENAME[] = "default_stresstest.conf";
110 char StressTestControllerCommand::TESTDIR[] = "/test/";
111 char StressTestControllerCommand::STRESSTESTDIR[] = "StressTestController/";
112 char StressTestControllerCommand::LOGDIR[] = "log/";
113 char StressTestControllerCommand::BINDIR[] = "/bin/";
|
114 kamal.locahana 1.5 char StressTestControllerCommand::DEFAULT_CFGDIR[] =
|
115 j.alex 1.2 STRESSTEST_DEFAULTCFGDIR;
116 char StressTestControllerCommand::DEFAULT_LOGDIR[] =
117 "/test/StressTestController/log/";
118 char StressTestControllerCommand::DEFAULT_TMPDIR[] =
119 "/test/StressTestController/tmp/";
120
121 String DEFAULT_BINDIR = String::EMPTY;
122
123 static Uint32 DEFAULT_CLIENTS = 2;
124 static Uint32 Total_Clients = DEFAULT_CLIENTS;
125 static Uint32 Total_vClients = DEFAULT_CLIENTS;
126 static Uint32 NEW_CLIENTS = 5;
127
128 static char MODELWALK_CLIENT[] = "TestModelWalkStressClient";
129 static char WRAPPER_CLIENT[] = "TestWrapperStressClient";
130
131 /**
132 StressTest Client Status types
133 */
134 enum CStatus{
135 VALID_RESPONSE,
136 j.alex 1.2 INVALID_RESPONSE,
137 NO_RESPONSE};
138
139
140 /**
141 Temporary arrays to store client information
142 */
143
144 /**
145 Client PID's
146 */
147 static pid_t *clientPIDs;
148
149 /**
150 Client Status
151 */
152 static int *clientStatus;
153
154
155 /**
156 Client Status
157 j.alex 1.2 */
158 static int *prev_clientStatus;
159
160 /**
161 Client Instance
162 */
163 static int *clientInstance;
164
165 /**
166 Indicates if client is Active
167 */
168 static Boolean *clientActive;
169
170 /**
|
171 kamal.locahana 1.5 Client status time stamp
|
172 j.alex 1.2 */
173 static Uint64 *clientTimeStamp;
174
175 /**
|
176 kamal.locahana 1.5 Previous client status time stamp
|
177 j.alex 1.2 */
178 static Uint64 *prev_clientTimeStamp;
179
180 /**
181 DEFAULT VALUES:
182 */
183
184 /**
185 Default duration for the stress tests
186 */
187 double StressTestControllerCommand::_duration = 180;
188
189 /**
190 Label for the usage string for this command.
191 */
192 const char StressTestControllerCommand::_USAGE [] = "Usage: ";
193
194 /**
195 The option character used to specify the hostname.
196 */
197 const char StressTestControllerCommand::_OPTION_HOSTNAME = 'h';
198 j.alex 1.2
199 /**
200 The option character used to specify the port number.
201 */
202 const char StressTestControllerCommand::_OPTION_PORTNUMBER = 'p';
203
204 /**
205 The option character used to specify SSL usage.
206 */
207 const char StressTestControllerCommand::_OPTION_SSL = 's';
208
209 /**
210 The option character used to specify the username.
211 */
212 const char StressTestControllerCommand::_OPTION_USERNAME = 'u';
213
214 /**
215 The option character used to specify the password.
216 */
217 const char StressTestControllerCommand::_OPTION_PASSWORD = 'w';
218
219 j.alex 1.2 /**
220 The minimum valid portnumber.
221 */
222 const Uint32 StressTestControllerCommand::_MIN_PORTNUMBER = 0;
223
224 /**
225 The maximum valid portnumber.
226 */
227 const Uint32 StressTestControllerCommand::_MAX_PORTNUMBER = 65535;
228
229 /**
230 The minimum Duration.
231 */
232 const Uint32 StressTestControllerCommand::_MIN_DURATION = 0;
233
234 /**
235 The minimum valid Tolerance Level.
236 */
237 const Uint32 StressTestControllerCommand::_MIN_TOLERANCE = 0;
238
239 /**
240 j.alex 1.2 The maximum valid Tolerance Level.
241 */
242 const Uint32 StressTestControllerCommand::_MAX_TOLERANCE = 100;
243
244 /**
245 The variable used to specify the hostname.
246 */
247 static const char HOSTNAME[] = "hostname";
248
249 /**
250 The variable used to specify the port number.
251 */
252 static const char PORTNUMBER[] = "port";
253
254 /**
255 The variable used to specify SSL usage.
256 */
257 static const char SSL [] = "ssl";
258
259 /**
260 The variable used to specify the username.
261 j.alex 1.2 */
262 static const char USERNAME[] = "username";
263
264 /**
265 The variable used to specify the password.
266 */
267 static const char PASSWORD[] = "password";
268
269 /**
270 The variable used to specify the duration of the tests.
271 */
272 static const char DURATION[] = "duration";
273
274 /**
275 The variable used to specify the duration of the Client tests.
276 */
277 static const char CLIENTDURATION[] = "ClientDuration";
278
279 /**
280 The variable used to specify the ToleranceLevel for the tests.
281 */
282 j.alex 1.2 static const char TOLERANCELEVEL[] = "TOLERANCELEVEL";
283
284 /**
285 The variable used to specify the NameSpace for the tests.
286 */
287 static const char NAMESPACE[] = "namespace";
288
289 /**
290 The variable used to specify the ClassName for the tests.
291 */
292 static const char CLASSNAME[] = "classname";
293
294 /**
295 The variable used to specify the Name for the tests.
296 */
297 static const char NAME[] = "NAME";
298
299 /**
300 The variable used to specify the Clientname for the tests.
301 */
302 static const char CLIENTNAME[] = "clientname";
303 j.alex 1.2
304 /**
305 The variable used to specify the Clientname for the tests.
306 */
307 static const char OPTIONS[] = "options";
308
309 /**
310 The variable used to specify the Clientname for the tests.
311 */
312 static const char INSTANCE[] = "INSTANCE";
313
314 /**
315 The variable used to specify the Clientname for the tests.
316 */
317 static const char CLIENTWAIT[] = "CLIENTWAIT";
318
319
320
321 /**
322 * Message resource name
323 */
324 j.alex 1.2 static const char PASSWORD_PROMPT [] =
325 "Please enter your password: ";
326 static const char PASSWORD_BLANK [] =
327 "Password cannot be blank. Please re-enter your password.";
328 static const char LONG_HELP[] = "help";
329 static const char LONG_VERSION[] = "version";
330 static const char LONG_VERBOSE[] = "verbose";
331
332 static Boolean IsAClient = false;
333
334 static Boolean IsClientOptions = false;
335
336 static Boolean IgnoreLine = false;
337
338 /**
339
340 Constructs a StressTestControllerCommand and initializes instance variables.
341
342 */
343 StressTestControllerCommand::StressTestControllerCommand ()
344 {
345 j.alex 1.2
346 _hostName = String ();
347 _hostNameSpecified = false;
348 _portNumber = WBEM_DEFAULT_HTTP_PORT;
349 _portNumberSpecified = false;
350
351 char buffer[32];
352 sprintf(buffer, "%lu", (unsigned long) _portNumber);
353
354 _portNumberStr = buffer;
355
356 _timeout = DEFAULT_TIMEOUT_MILLISECONDS;
357 _userName = String ();
358 _userNameSpecified = false;
359 _password = String ();
360 _passwordSpecified = false;
361 _useSSL = false;
362
363 //
364 // initialize
365 //
366 j.alex 1.2 _clientCount = 0;
367 _currClientCount = 0;
|
368 kamal.locahana 1.5
|
369 j.alex 1.2 //
370 // Set up tables for client properties.
371 //
|
372 kumpf 1.4 _clientTable.reset(new Table[Total_Clients]);
|
373 j.alex 1.2
374 //
375 // Get environment variables:
376 //
377 pegasusHome = getenv("PEGASUS_HOME");
378
379 DEFAULT_BINDIR = String(pegasusHome);
380 DEFAULT_BINDIR.append(BINDIR);
381
382 _stressTestLogFile = String::EMPTY;
383
384 _stressTestClientPIDFile = String::EMPTY;
385
386 _stressTestClientLogFile = String::EMPTY;
387
388 _tmpStressTestClientPIDFile = String::EMPTY;
389
390
391
392 _usage = String (_USAGE);
393
394 j.alex 1.2 _usage.append (COMMAND_NAME);
395 #ifndef DISABLE_SUPPORT_FOR_REMOTE_CONNECTIONS
396 _usage.append (" [ -");
397 _usage.append (_OPTION_SSL);
398 _usage.append (" ] [ -");
399 _usage.append (_OPTION_HOSTNAME);
400 _usage.append (" hostname ] [ -");
401 _usage.append (_OPTION_PORTNUMBER);
402 _usage.append (" portnumber ]\n [ -");
403 _usage.append (_OPTION_USERNAME);
404 _usage.append (" username ] [ -");
405 _usage.append (_OPTION_PASSWORD);
406 _usage.append (" password ]");
407 #endif
408 _usage.append (" [ --");
409 _usage.append (LONG_HELP);
410 _usage.append(" ]\n");
411 _usage.append(" ");
412 _usage.append("[ --").append(LONG_VERSION).append(" ]");
413 _usage.append(" [ --").append(LONG_VERBOSE).append(" ]").append(\
414 " [<config_filename>] \n");
415 j.alex 1.2
416 _usage.append("Options : \n");
417 _usage.append(" -h - Connect to CIM Server on specified ");
418 _usage.append("hostname. \n");
419 _usage.append(" --help - Display this help message.\n");
420 _usage.append(" -p - Connect to CIM Server on specified ");
421 _usage.append("portnumber.\n");
422 _usage.append(" -s - Use SSL protocol between Stress Test ");
423 _usage.append("Client\n");
424 _usage.append(" and the CIM Server\n");
425 _usage.append(" -u - Connect to CIM Server using the specified");
426 _usage.append(" username\n");
427 _usage.append(" --version - Display CIM Server version number\n");
428 _usage.append(" --verbose - Display verbose information\n");
429 _usage.append(" -w - Connect to CIM Server using the specified");
430 _usage.append(" password\n");
431 _usage.append("\nOperands : \n");
432 _usage.append(" <config_filename>\n");
433 _usage.append(" - Specifies the name of the configuration ");
434 _usage.append("file that is to be used \n");
435 _usage.append(" for the tests.\n");
436 j.alex 1.2
437 setUsage(_usage);
438
439 } /* StressTestControllerCommand */
440
441 /**
442
443 Parses the command line, validates the options, and sets instance
444 variables based on the option arguments.
445
446 @param argc the number of command line arguments
447 @param argv the string vector of command line arguments
448
449 @exception CommandFormatException if an error is encountered in parsing
450 the command line
451
452 */
453 void StressTestControllerCommand::setCommand (Uint32 argc, char* argv [])
454 {
455 Uint32 i = 0;
456 Uint32 c = 0;
457 j.alex 1.2 String GetOptString = String ();
458 getoopt getOpts;
459 _toleranceLevel = 0;
460 _configFilePath = String ();
461 _configFilePathSpecified = false;
462
463 _operationType = OPERATION_TYPE_UNINITIALIZED;
464
465
466 ofstream log_file;
467
468 //
469 // opens the log file
470 //
471 OpenAppend(log_file,_stressTestLogFile);
472
473 if (!log_file)
474 {
475 if(verboseEnabled)
476 {
477 cout<<StressTestControllerCommand::COMMAND_NAME<<
478 j.alex 1.2 "::Cannot get file "<<_stressTestLogFile<<endl;
479 }
|
480 kamal.locahana 1.5
|
481 j.alex 1.2 }
482 log_file<<StressTestControllerCommand::COMMAND_NAME<<
483 ":: Preparing to set up parameters: "<<endl;
484
485 //
486 // Construct GetOptString
487 //
488 GetOptString.append (_OPTION_HOSTNAME);
489 GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
490 GetOptString.append (_OPTION_PORTNUMBER);
491 GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
492 GetOptString.append (_OPTION_SSL);
493 GetOptString.append (_OPTION_USERNAME);
494 GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
495 GetOptString.append (_OPTION_PASSWORD);
496 GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
497
498 //
499 // Initialize and parse getOpts
500 //
501 getOpts = getoopt ();
502 j.alex 1.2 getOpts.addFlagspec (GetOptString);
503
504 //
505 // per PEP#167
506 //
507 getOpts.addLongFlagspec(LONG_HELP,getoopt::NOARG);
508 getOpts.addLongFlagspec(LONG_VERSION,getoopt::NOARG);
509 getOpts.addLongFlagspec(LONG_VERBOSE,getoopt::NOARG);
510
511 getOpts.parse (argc, argv);
512
513 if (getOpts.hasErrors ())
514 {
515 log_file.close();
516 CommandFormatException e(getOpts.getErrorStrings () [0]);
517 throw e;
518 }
519
520 //
521 // Get options and arguments from the command line
522 //
523 j.alex 1.2 for (i = getOpts.first(); i < getOpts.last (); i++)
524 {
525 if (getOpts[i].getType() == Optarg::LONGFLAG)
526 {
527 if (getOpts[i].getopt() == LONG_HELP)
528 {
529 _operationType = OPERATION_TYPE_HELP;
530 }
531 else if (getOpts[i].getopt() == LONG_VERSION)
532 {
533 _operationType = OPERATION_TYPE_VERSION;
534 }
535 if (getOpts[i].getopt() == LONG_VERBOSE)
536 {
537 verboseEnabled = true;
538 }
539 }
540 else if (getOpts [i].getType() == Optarg::REGULAR)
541 {
542 //
543 // _configFilePath is the only non-option argument
544 j.alex 1.2 //
545 if (_configFilePathSpecified)
546 {
547 //
548 // more than one _configFilePath argument was found
549 //
550 log_file<<StressTestControllerCommand::COMMAND_NAME<<
551 "::More than one arguement was found "<<endl;
552 log_file.close();
553 UnexpectedArgumentException e(getOpts[i].Value());
554 throw e;
555 }
556 _configFilePath = getOpts[i].Value();
557 _configFilePathSpecified = true;
558 }
559 else /* getOpts[i].getType() == FLAG */
560 {
561 c = getOpts[i].getopt()[0];
562 switch(c)
563 {
564 case _OPTION_HOSTNAME:
565 j.alex 1.2 {
566 if (getOpts.isSet(_OPTION_HOSTNAME) > 1)
567 {
568 //
569 // More than one hostname option was found
570 //
571 log_file.close();
572 DuplicateOptionException e(_OPTION_HOSTNAME);
573 throw e;
574 }
575 _hostName = getOpts [i].Value ();
576 _hostNameSpecified = true;
|
577 kumpf 1.4 if (!_propertyTable.insert("hostname", _hostName))
|
578 j.alex 1.2 {
579 // shouldn't get here
580 if(verboseEnabled)
581 {
582 cout<<StressTestControllerCommand::COMMAND_NAME;
583 cout<<"::Property Name name already saved: "<<
584 "hostname"<<endl;
585 }
586 }
587 break;
588 }
589 case _OPTION_PORTNUMBER:
590 {
591 if (getOpts.isSet(_OPTION_PORTNUMBER) > 1)
592 {
593 //
594 // More than one portNumber option was found
595 //
596 log_file.close();
597 DuplicateOptionException e(_OPTION_PORTNUMBER);
598 throw e;
599 j.alex 1.2 }
600 _portNumberStr = getOpts [i].Value ();
601 try
602 {
603 getOpts[i].Value(_portNumber);
604 }
605 catch (const TypeMismatchException&)
606 {
607 log_file.close();
608 InvalidOptionArgumentException e(
609 _portNumberStr,
610 _OPTION_PORTNUMBER);
611 throw e;
612 }
613 _portNumberSpecified = true;
|
614 kumpf 1.4 if (!_propertyTable.insert("port", _portNumberStr))
|
615 j.alex 1.2 {
616 if(verboseEnabled)
617 {
618 cout<<StressTestControllerCommand::COMMAND_NAME;
619 cout<<"::Property Name:duplicate name already saved:"
620 <<"port"<<endl;
621 }
622 }
623 break;
624 }
625 case _OPTION_SSL:
626 {
627 //
628 // Use port 5989 as the default port for SSL
629 //
630 _useSSL = true;
631 if (!_portNumberSpecified)
632 {
633 _portNumber = 5989;
634 _portNumberStr = "5989";
|
635 kumpf 1.4 if (!_propertyTable.insert("port", _portNumberStr))
|
636 j.alex 1.2 {
|
637 kamal.locahana 1.5 if(verboseEnabled)
|
638 j.alex 1.2 {
639 cout<<StressTestControllerCommand::COMMAND_NAME;
640 cout<<"::Property Name already saved: "<<"port"<<
641 endl;
642 }
643 }
644 }
|
645 kumpf 1.4 if (!_propertyTable.insert("ssl", ""))
|
646 j.alex 1.2 {
647 if(verboseEnabled)
648 {
649 cout<<StressTestControllerCommand::COMMAND_NAME;
650 cout<<"::Property Name already saved: "<<"ssl"<<
651 endl;
652 }
653 }
654 break;
655 }
656 case _OPTION_USERNAME:
657 {
658 if (getOpts.isSet(_OPTION_USERNAME) > 1)
659 {
660 //
661 // More than one username option was found
662 //
663 log_file.close();
664 DuplicateOptionException e(_OPTION_USERNAME);
665 throw e;
666 }
667 j.alex 1.2 _userName = getOpts[i].Value();
668 _userNameSpecified = true;
|
669 kumpf 1.4 if (!_propertyTable.insert("username", _userName))
|
670 j.alex 1.2 {
671 if(verboseEnabled)
672 {
673 cout<<StressTestControllerCommand::COMMAND_NAME;
674 cout<< "::Property Name already saved: "<<
675 "username"<<endl;
676 }
677 }
678 break;
679 }
680 case _OPTION_PASSWORD:
681 {
682 if (getOpts.isSet(_OPTION_PASSWORD) > 1)
683 {
684 //
685 // More than one password option was found
686 //
687 log_file.close();
688 DuplicateOptionException e(_OPTION_PASSWORD);
689 throw e;
690 }
691 j.alex 1.2 _password = getOpts[i].Value();
692 _passwordSpecified = true;
|
693 kumpf 1.4 if (!_propertyTable.insert("password", _password))
|
694 j.alex 1.2 {
695 if(verboseEnabled)
696 {
697 cout<<StressTestControllerCommand::COMMAND_NAME;
698 cout<<"::Property Name already saved: "<<
699 "password"<<endl;
700 }
701 }
702 break;
703 }
704
705 default:
706 {
707 //
708 // This path should not be hit
709 // PEP#167 unless an empty '-' is specified
710 //
711 log_file.close();
|
712 kamal.locahana 1.5 String ErrReport =
|
713 j.alex 1.2 String(StressTestControllerCommand::COMMAND_NAME);
714 ErrReport.append("::Invalid or unknown option specified");
715 throw StressTestControllerException(ErrReport);
716
717 break;
718 }
719 }
720 }
721 }
722 //
723 // More validation:
724 // No portNumber specified
725 // Default to WBEM_DEFAULT_PORT
726 // Already done in constructor
727 //
728 if (getOpts.isSet(_OPTION_PORTNUMBER) == 1)
729 {
730 if (_portNumber > _MAX_PORTNUMBER)
731 {
732 //
733 // Portnumber out of valid range
734 j.alex 1.2 //
735 log_file.close();
736 InvalidOptionArgumentException e(_portNumberStr,
737 _OPTION_PORTNUMBER);
738 throw e;
739 }
740 }
741 log_file.close();
742 } /* setCommand */
743
744 /**
745
|
746 kamal.locahana 1.5 Generates commands and its options for each of the clients.
|
747 j.alex 1.2 The client table is traversed to generate each of the client commands.
748 The Commands, Duration and Delays for each client are saved in
749 the following array's respectively:
|
750 kamal.locahana 1.5 _clientCommands
|
751 j.alex 1.2 _clientDurations
|
752 kamal.locahana 1.5 _clientDelays
753
754 @param log_file The log file.
|
755 j.alex 1.2
756 @return 0 if the command is successfully generated
757 1 if the command cannot be generated.
758 */
759 Boolean StressTestControllerCommand::generateClientCommands(ostream& log_file)
760 {
761
762 String client_command = String::EMPTY;
763 double duration = _duration;
764 double delay = 0;
765
|
766 kamal.locahana 1.5 //
|
767 j.alex 1.2 // Array's to store client specific information
768 //
|
769 kumpf 1.4 _clientCommands.reset(new String[_clientCount]);
770 _clientDurations.reset(new Uint64[_clientCount]);
771 _clientDelays.reset(new Uint64[_clientCount]);
|
772 j.alex 1.2
773 //
774 // Retrieve all the client options from the client table
|
775 kamal.locahana 1.5 // and build commands for respective clients.
776 // Add appropriate options to command string as required
|
777 j.alex 1.2 //
778 for (Uint32 j=0; j< _clientCount; j++)
779 {
780 delay = 0;
781 String clientName = String::EMPTY;
782 String clientInst = String::EMPTY;
|
783 kamal.locahana 1.5 //
784 // Stress Client Name must exist for each client/client table
|
785 j.alex 1.2 //
|
786 kumpf 1.4 if (!_clientTable.get()[j].lookup(NAME, clientName))
|
787 j.alex 1.2 {
788 log_file<<StressTestControllerCommand::COMMAND_NAME<<
789 "::Required property NAME not found."<<endl;
790 return false;
791 }
792 //
793 // Start the command string with the client name.
794 //
795 client_command = clientName;
796
|
797 kamal.locahana 1.5 //
|
798 j.alex 1.2 // Generate the commands for each client from each client table.
799 //
|
800 kumpf 1.4 for (Table::Iterator i = _clientTable.get()[j].start(); i; i++)
|
801 j.alex 1.2 {
802 if (String::equalNoCase(i.key(),HOSTNAME))
803 {
804 client_command.append(" -hostname ");
805 if (_hostNameSpecified)
806 {
807 client_command.append(_hostName);
808 }
809 else
|
810 kamal.locahana 1.5 {
|
811 j.alex 1.2 client_command.append(i.value());
812 }
|
813 kamal.locahana 1.5 }
|
814 j.alex 1.2 else if (String::equalNoCase(i.key(),NAME))
815 {
816 //
817 // should be ignored - already saved using clientName
818 //
|
819 kamal.locahana 1.5 }
|
820 j.alex 1.2 else if (String::equalNoCase(i.key(),PORTNUMBER))
821 {
822 client_command.append(" -");
823 client_command.append(PORTNUMBER);
824 client_command.append(" ");
825 if (_portNumberSpecified)
826 {
827 client_command.append(_portNumberStr);
|
828 kamal.locahana 1.5 }
|
829 j.alex 1.2 else
|
830 kamal.locahana 1.5 {
|
831 j.alex 1.2 client_command.append(i.value());
832 }
833 }
834 else if (String::equalNoCase(i.key(),SSL))
835 {
836 client_command.append(" -");
837 client_command.append(SSL);
|
838 kamal.locahana 1.5 }
|
839 j.alex 1.2 else if (String::equalNoCase(i.key(),USERNAME))
840 {
841 client_command.append(" -");
842 client_command.append(USERNAME);
843 client_command.append(" ");
844 client_command.append(i.value());
|
845 kamal.locahana 1.5 }
|
846 j.alex 1.2 else if (String::equalNoCase(i.key(),PASSWORD))
847 {
848 client_command.append(" -");
849 client_command.append(PASSWORD);
850 client_command.append(" ");
851 client_command.append(i.value());
852 }
853 else if (String::equalNoCase(i.key(),CLIENTNAME))
854 {
855 client_command.append(" -");
856 client_command.append(CLIENTNAME);
857 client_command.append(" ");
858 client_command.append(i.value());
859 }
860 else if (String::equalNoCase(i.key(),OPTIONS))
861 {
862 client_command.append(" -");
863 client_command.append(OPTIONS);
864 client_command.append(" ");
865 client_command.append(i.value());
866 }
867 j.alex 1.2 else if (String::equalNoCase(i.key(),NAMESPACE))
868 {
869 client_command.append(" -");
870 client_command.append(NAMESPACE);
871 client_command.append(" ");
872 client_command.append(i.value());
|
873 kamal.locahana 1.5 }
|
874 j.alex 1.2 else if (String::equalNoCase(i.key(),CLASSNAME))
875 {
876 client_command.append(" -");
877 client_command.append(CLASSNAME);
878 client_command.append(" ");
879 client_command.append(i.value());
|
880 kamal.locahana 1.5 }
|
881 j.alex 1.2 else if ((String::equalNoCase(i.key(),INSTANCE))
882 ||(String::equalNoCase(i.key(),CLIENTWAIT))
883 ||(String::equalNoCase(i.key(),CLIENTDURATION)))
884 {
885 //
|
886 kamal.locahana 1.5 // do nothing here
|
887 j.alex 1.2 // will be utilized to run the clients later.
888 //
|
889 kamal.locahana 1.5 }
890 else
891 {
|
892 j.alex 1.2 //
893 // Save all other options for the commands
894 //
895 client_command.append(" -");
896 client_command.append(i.key());
897 client_command.append(" ");
898 client_command.append(i.value());
899 }
900 }
901 //
902 // Include verbose if enabled to clients
903 //
904 if (verboseEnabled)
905 {
906 client_command.append(" -verbose ");
907 }
908
909 //
|
910 kamal.locahana 1.5 // Acquire all the common properties listed in the property table
911 // from config file and include it as part of the client command
|
912 j.alex 1.2 // as required.
913 //
|
914 kumpf 1.4 for (Table::Iterator k = _propertyTable.start(); k; k++)
|
915 j.alex 1.2 {
916 String propertyValue = String::EMPTY;
917 //
918 // Only include the common properties that are not already
919 // listed for the clients.
920 //
|
921 kumpf 1.4 if (!_clientTable.get()[j].lookup(k.key(), propertyValue))
|
922 j.alex 1.2 {
923 //
924 // Include options other than ToleranceLevel
925 // clientDuration,clientwait and Duration
|
926 kamal.locahana 1.5 // in the command string for the clients.
|
927 j.alex 1.2 //
928 if ((!String::equalNoCase(k.key(),TOLERANCELEVEL))
929 && (!String::equalNoCase(k.key(),CLIENTDURATION))
930 && (!String::equalNoCase(k.key(),CLIENTWAIT))
931 && (!String::equalNoCase(k.key(),DURATION)))
932 {
933 client_command.append(" -");
934 client_command.append(k.key());
|
935 kamal.locahana 1.5 //
|
936 j.alex 1.2 // No values required for SSL
|
937 kamal.locahana 1.5 //
|
938 j.alex 1.2 if (!String::equalNoCase(k.key(),SSL))
939 {
940 client_command.append(" ");
941 client_command.append(k.value());
942 }
943 }
944 }
945 //
946 // Use default duration if one was not specified in the Config file.
947 //
948 if (String::equalNoCase(k.key(),DURATION))
949 {
950 duration = atof(k.value().getCString());
|
951 kamal.locahana 1.5 }
952 else
|
953 j.alex 1.2 {
954 duration = _duration;
955 }
|
956 kumpf 1.4 } /* for (Table::Iterator k = _propertyTable.start(); k; k++) */
|
957 j.alex 1.2
958 //
959 // Looking up table while ignoring cases for Client Duration/Wait.
960 //
|
961 kumpf 1.4 for (Table::Iterator k = _clientTable.get()[j].start(); k; k++)
|
962 j.alex 1.2 {
963 //
964 // Overwrite duration if client duration set
965 //
966 if (String::equalNoCase(k.key(),CLIENTDURATION))
967 {
968 duration = atof(k.value().getCString());
969 }
970 if (String::equalNoCase(k.key(),CLIENTWAIT))
971 {
972 delay = atof(k.value().getCString());
973 }
974 }
975
976 //
|
977 kamal.locahana 1.5 // Save the generated command to corresponding element in the
|
978 j.alex 1.2 // clientCommand array.
979 //
|
980 kumpf 1.4 _clientCommands.get()[j] = client_command;
|
981 j.alex 1.2
982 //
983 // Converting minutes to milliseconds
984 //
|
985 kumpf 1.4 _clientDurations.get()[j] = (Uint64)convertmin2millisecs(duration);
986 _clientDelays.get()[j] = (Uint64)convertmin2millisecs(delay);
|
987 kamal.locahana 1.5
|
988 j.alex 1.2 //
989 // Saving logs
990 //
|
991 kumpf 1.4 log_file << StressTestControllerCommand::COMMAND_NAME <<
992 "::Client Command[" << j << "]" << endl;
993 log_file << " " << _clientCommands.get()[j] << endl;
994 log_file << " Client Duration: " <<
995 convertUint64toString(_clientDurations.get()[j]) << endl;
996 log_file << " Client Delay: " <<
997 convertUint64toString(_clientDelays.get()[j]) << endl;
|
998 j.alex 1.2
999 //
|
1000 kamal.locahana 1.5 // Verbose
|
1001 j.alex 1.2 //
1002 if (verboseEnabled)
1003 {
|
1004 kumpf 1.4 cout << StressTestControllerCommand::COMMAND_NAME <<
1005 "::Client Command[" << j << "]" << endl;
1006 cout << " " << _clientCommands.get()[j] << endl;
1007 cout << " Client Duration: " <<
1008 convertUint64toString(_clientDurations.get()[j]) << endl;
1009 cout << " Client Delay: " <<
1010 convertUint64toString(_clientDelays.get()[j]) << endl;
|
1011 j.alex 1.2 }
1012 } /* for(Uint32 j=0; j< _clientCount; j++) */
1013 return true;
1014 } /* generateClientCommands */
1015
1016 /*
1017 Executes the command and writes the results to the PrintWriters.
1018 This method is where the clients are intiated.
1019 The clients are kept running until its duration is met
1020 or the controller is interrupted by a SIGINT or SIGABRT signal
1021 or if the controller failed to acquire the clientPIDs when needed.
1022
|
1023 kamal.locahana 1.5 Clients with clientWait, will be stopped when its duration is met and
1024 then restarted after its wait period is completed. This will continue
1025 until the end of the overall duration.
|
1026 j.alex 1.2 When the overall duration has ended or the controller is interupted then
|
1027 kamal.locahana 1.5 the controller will read the PID file to update its clients PID and
|
1028 j.alex 1.2 request all the clients to end its processes.
1029
1030 @param outPrintWriter the ostream to which output should be
1031 written
1032 @param errPrintWriter the ostream to which error output should be
1033 written
1034
1035 @return 0 if the command is successful
1036 1 if an error occurs in executing the command
1037
1038 */
1039 Uint32 StressTestControllerCommand::execute (
1040 ostream& outPrintWriter,
1041 ostream& errPrintWriter)
1042 {
1043 int actual_client = 0;
1044 Uint64 startMilliseconds = 0;
1045 Uint64 nowMilliseconds = 0;
1046 Uint64 stopMilliseconds = 0;
1047 Uint64 timeoutMilliseconds = 0;
|
1048 kumpf 1.4 AutoArrayPtr<Uint64> clientStartMilliseconds;
1049 AutoArrayPtr<Uint64> clientStopMilliseconds;
1050 AutoArrayPtr<Uint64> clientDelayMilliseconds;
1051 AutoArrayPtr<Boolean> clientStopped;
1052 AutoArrayPtr<Boolean> clientDelayed;
1053 String act_command;
|
1054 j.alex 1.2 Boolean TestFailed = false;
1055 char str[15];
1056 char strTime[256];
1057 struct tm tmTime;
1058
1059 //
1060 // log file
|
1061 kamal.locahana 1.5 //
|
1062 j.alex 1.2 ofstream log_file;
1063
|
1064 kamal.locahana 1.5 //
|
1065 j.alex 1.2 // open the file
|
1066 kamal.locahana 1.5 //
|
1067 j.alex 1.2 OpenAppend(log_file,_stressTestLogFile);
1068
|
1069 kamal.locahana 1.5 //
|
1070 j.alex 1.2 // Failed to read log file.
1071 //
1072 if (!log_file)
1073 {
1074 log_file.close();
1075 if (verboseEnabled)
1076 {
1077 outPrintWriter<<StressTestControllerCommand::COMMAND_NAME;
1078 outPrintWriter<<"Cannot read file "<<_stressTestLogFile<<endl;
1079 }
1080 return RC_ERROR;
1081 }
1082
|
1083 kamal.locahana 1.5 //
|
1084 j.alex 1.2 // Display usage message if help was specified
1085 //
1086 if ( _operationType == OPERATION_TYPE_HELP )
1087 {
1088 outPrintWriter << _usage << endl;
1089 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1090 "::Listing usage information "<<endl;
1091 log_file.close();
1092 //
1093 // No need for the client pid and log file.
1094 //
1095 FileSystem::removeFile(_stressTestClientPIDFile);
1096 FileSystem::removeFile(_stressTestClientLogFile);
1097 return (RC_SUCCESS);
1098 }
|
1099 kamal.locahana 1.5 //
|
1100 j.alex 1.2 // Display PEGASUS version if version was specified
1101 //
1102 else if ( _operationType == OPERATION_TYPE_VERSION )
1103 {
1104 outPrintWriter << "Version " << PEGASUS_PRODUCT_VERSION << endl;
1105 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1106 "::Listing version information "<<endl;
1107 log_file<<"Version " << PEGASUS_PRODUCT_VERSION << endl;
1108 log_file.close();
1109 //
1110 // No need for the client pid and log file.
1111 //
1112 FileSystem::removeFile(_stressTestClientPIDFile);
1113 FileSystem::removeFile(_stressTestClientLogFile);
1114 return (RC_SUCCESS);
1115 }
1116
1117 //
1118 // gracefully shutdown when interrupted
1119 //
1120 signal(SIGABRT, endAllTests);
1121 j.alex 1.2 signal(SIGINT, endAllTests);
1122
|
1123 kamal.locahana 1.5 //
1124 // Allocate variables necessary to run clients.
|
1125 j.alex 1.2 //
1126 if(_clientCount > 0)
1127 {
|
1128 kamal.locahana 1.5 clientInstance = new int[_clientCount];
|
1129 kumpf 1.4 clientStartMilliseconds.reset(new Uint64[_clientCount]);
1130 clientStopMilliseconds.reset(new Uint64[_clientCount]);
1131 clientDelayMilliseconds.reset(new Uint64[_clientCount]);
1132 clientStopped.reset(new Boolean[_clientCount]);
1133 clientDelayed.reset(new Boolean[_clientCount]);
|
1134 kamal.locahana 1.5 }
1135 else
1136 {
|
1137 j.alex 1.2 errPrintWriter << "Stress Tests must have at least one Client." << endl;
1138 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1139 "::Stress Tests must have at least one Client."<<endl;
1140 log_file.close();
1141 return (RC_ERROR);
1142 }
|
1143 kamal.locahana 1.5
|
1144 j.alex 1.2 try
1145 {
1146 //
1147 // Initializing the Boolean array's to false.
1148 //
1149 for (Uint32 i=0;i<_clientCount;i++)
1150 {
|
1151 kumpf 1.4 clientStopped.get()[i] = false;
1152 clientDelayed.get()[i] = false;
|
1153 j.alex 1.2 }
1154 //
1155 // Set up duration of the tests
1156 //
1157 startMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1158 nowMilliseconds = startMilliseconds;
1159 timeoutMilliseconds = (Uint64)convertmin2millisecs(_duration);
1160 stopMilliseconds = nowMilliseconds + timeoutMilliseconds;
|
1161 kamal.locahana 1.5
|
1162 j.alex 1.2 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1163 ":: Test Duration information "<<endl;
1164 log_file<<" Start Time in milliseconds: "<<
1165 convertUint64toString(startMilliseconds)<<endl;
1166 log_file<<" Total duration in milliseconds: "<<
1167 convertUint64toString(timeoutMilliseconds)<<endl;
1168 log_file<<" Actual Stop Time in milliseconds: "<<
1169 convertUint64toString(stopMilliseconds)<<endl;
|
1170 kamal.locahana 1.5 //
1171 // Verbose details for Stress Test duration
|
1172 j.alex 1.2 //
1173 if (verboseEnabled)
1174 {
1175 outPrintWriter<<StressTestControllerCommand::COMMAND_NAME<<
1176 ":: Test Duration information "<<endl;
1177 outPrintWriter<<" Start Time in milliseconds: "<<
1178 convertUint64toString(startMilliseconds)<<endl;
1179 outPrintWriter<<" Total duration in milliseconds: "<<
1180 convertUint64toString(timeoutMilliseconds)<<endl;
1181 outPrintWriter<<
1182 " Actual Stop Time in milliseconds: "<<
1183 convertUint64toString(stopMilliseconds)<<endl;
1184 }
1185
1186 //
|
1187 kamal.locahana 1.5 // First Tolerance check up interval is set up to be twice
|
1188 j.alex 1.2 // the CHECKUP_INTERVAL. This should give the clients enough time
1189 // to update its PID, status etc.
|
1190 kamal.locahana 1.5 //
1191 Uint64 nextCheckupInMillisecs =
|
1192 j.alex 1.2 (Uint64)convertmin2millisecs(2 * CHECKUP_INTERVAL) + nowMilliseconds;
1193 //
|
1194 kamal.locahana 1.5 // Main "while" loop where the clients are initiated.
|
1195 j.alex 1.2 //
1196 while(stopMilliseconds > nowMilliseconds)
|
1197 kamal.locahana 1.5 {
|
1198 j.alex 1.2
|
1199 kamal.locahana 1.5 //
1200 // Small delay in the while loop seemed to reduce the CPU usage
|
1201 j.alex 1.2 // considerably in Windows. (From 80% to 1%)
1202 //
1203 #ifndef PEGASUS_OS_TYPE_WINDOWS
|
1204 kamal.locahana 1.5 sleep(RUN_DELAY);
|
1205 j.alex 1.2 #else
1206 Sleep(RUN_DELAY * 1000);
1207 #endif
1208
1209 //
1210 // Quit if SIGINT, SIGABRT is caught
1211 // So the clients can be gracefully shutdown.
1212 //
1213 if(Quit)
1214 {
1215 log_file<<
|
1216 kamal.locahana 1.5 "Test interrupted by either SIGINT or SIGABORT."<<endl;
|
1217 j.alex 1.2 TestFailed = true;
1218 break;
1219 }
1220 //
1221 // The following block will be where clients are executed initially.
1222 //
1223 if(!actual_client)
1224 {
1225 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1226 "::Running the following tests: "<<endl;
1227 outPrintWriter<<StressTestControllerCommand::COMMAND_NAME<<
1228 "::Running the following tests: "<<endl;
1229 for (Uint32 j=0; j< _clientCount; j++)
1230 {
1231 String clientInst = String::EMPTY;
1232 //
1233 // Acquire the client Instance for each clients
1234 //
|
1235 kumpf 1.4 if (!_clientTable.get()[j].lookup(INSTANCE, clientInst))
|
1236 j.alex 1.2 {
1237 String ErrReport = String("Invalid Property Value: ");
1238 ErrReport.append(INSTANCE);
1239 ErrReport.append("=");
1240 ErrReport.append(clientInst);
1241 throw StressTestControllerException(ErrReport);
1242 }
1243 clientInstance[j] = atoi(clientInst.getCString());
1244
1245 //
1246 // Acquire and set client specific duration
1247 //
|
1248 kamal.locahana 1.5 clientStartMilliseconds.get()[j] =
|
1249 j.alex 1.2 TimeValue::getCurrentTime().toMilliseconds();
|
1250 kamal.locahana 1.5 clientStopMilliseconds.get()[j] =
|
1251 kumpf 1.4 clientStartMilliseconds.get()[j] +
1252 _clientDurations.get()[j];
|
1253 j.alex 1.2
|
1254 kamal.locahana 1.5 //
|
1255 j.alex 1.2 // for verbose only
1256 //
1257 if (verboseEnabled)
1258 {
|
1259 kumpf 1.4 outPrintWriter << "Client:" << "[" << j<< "]" << endl;
1260 log_file << "Client:" << "[" << j << "]" << endl;
1261 outPrintWriter << "ClientStart:" <<
1262 convertUint64toString(
1263 clientStartMilliseconds.get()[j]) <<
1264 endl;
1265 outPrintWriter << "ClientStop:" <<
1266 convertUint64toString(
1267 clientStopMilliseconds.get()[j]) <<
|
1268 j.alex 1.2 endl;
|
1269 kumpf 1.4 outPrintWriter << "ClientDuration:" <<
1270 convertUint64toString(_clientDurations.get()[j]) <<
|
1271 j.alex 1.2 endl;
|
1272 kumpf 1.4 log_file << "ClientStart:" <<
1273 convertUint64toString(
1274 clientStartMilliseconds.get()[j]) <<
|
1275 j.alex 1.2 endl;
|
1276 kumpf 1.4 log_file << "ClientStop:" <<
1277 convertUint64toString(
1278 clientStopMilliseconds.get()[j]) <<
1279 endl;
1280 log_file << "ClientDuration:" <<
1281 convertUint64toString(_clientDurations.get()[j]) <<
|
1282 j.alex 1.2 endl;
1283 }
1284 log_file<<
1285 "Number of instances of this client: "<<
1286 clientInstance[j]<<endl;
1287 if(verboseEnabled)
1288 {
1289 outPrintWriter<<
1290 "Number of instances of this client:"<<
1291 clientInstance[j]<<endl;
1292 }
|
1293 kamal.locahana 1.5 //
|
1294 j.alex 1.2 // Execute each instance of the client.
|
1295 kamal.locahana 1.5 // - Additional required parameters are added to the
|
1296 j.alex 1.2 // commands.
1297 // like, -clientid, -pidfile, -clientlog
1298 //
1299 for (int instanceID =0;instanceID<clientInstance[j];
1300 instanceID++)
1301 {
1302 outPrintWriter<<
1303 "Running Client("<<actual_client<<")"<<endl;
1304 log_file<<
1305 "Running Client("<<actual_client<<")"<<endl;
1306 act_command=String::EMPTY;
1307 #ifdef PEGASUS_OS_TYPE_WINDOWS
1308 act_command.append("start ");
1309 #endif
1310 //
1311 // Adding all the required parameters for the command.
1312 //
|
1313 kumpf 1.4 act_command.append(_clientCommands.get()[j]);
|
1314 j.alex 1.2 act_command.append(" -clientid ");
|
1315 kamal.locahana 1.5 sprintf(str,"%d",actual_client);
|
1316 j.alex 1.2 act_command.append(str);
1317 act_command.append(" -pidfile ");
1318 act_command.append(" \"");
1319 act_command.append(_stressTestClientPIDFile);
1320 act_command.append("\"");
1321 act_command.append(" -clientlog");
1322 act_command.append(" \"");
1323 act_command.append(_stressTestClientLogFile);
1324 act_command.append("\"");
1325 act_command.append("&");
1326 if (verboseEnabled)
1327 {
1328 outPrintWriter<<" "<<act_command<<endl;
1329 tmTime = getCurrentActualTime();
1330 strftime(
1331 strTime,
1332 256,
1333 "%d/%m/%Y at %H:%M:%S\n",
1334 &tmTime);
1335 log_file<<
1336 StressTestControllerCommand::COMMAND_NAME<<
1337 j.alex 1.2 "::Running following command on "<<
1338 strTime<<endl;
1339 log_file<<" ("<<actual_client<<") \n"<<
1340 act_command<<endl;
1341 }
1342
1343 //
1344 // Executing the Client
1345 //
1346 int rc = system(act_command.getCString());
1347 //
1348 // Continue even if the client failed to Execute
1349 // This failure is validated with Tolerance level later
|
1350 kamal.locahana 1.5 //
|
1351 j.alex 1.2 if (rc)
1352 {
1353 log_file<<"Command failed to Execute."<<endl;
1354 if (verboseEnabled)
1355 {
1356 outPrintWriter<<
1357 "Command failed to Execute."<<endl;
1358 }
1359 }
1360 //
1361 // Increment the actual number of clients
1362 //
1363 ++actual_client;
1364 } /* for(int instanceID =0;instanceID<clientInstance[j]...*/
|
1365 kamal.locahana 1.5
|
1366 j.alex 1.2 }/* for(Uint32 j=0; j< _clientCount; j++) */
1367
1368 //
1369 //retrieve all PIDs and status;
1370 //
|
1371 kamal.locahana 1.5 clientPIDs = new pid_t[actual_client];
1372 clientStatus = new int[actual_client];
1373 prev_clientStatus = new int[actual_client];
1374 clientTimeStamp = new Uint64[actual_client];
1375 prev_clientTimeStamp = new Uint64[actual_client];
1376 clientActive = new Boolean[actual_client];
|
1377 j.alex 1.2 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1378 for (int i=0;i<actual_client;i++)
1379 {
1380 clientPIDs[i] = 9999999;
1381 clientStatus[i] = NO_RESPONSE;
1382 clientActive[i] = true;
1383 clientTimeStamp[i] = nowMilliseconds;
1384 prev_clientTimeStamp[i] = nowMilliseconds;
1385 }
1386 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1387 "::Getting client PID's and status. "<<endl;
1388 if (verboseEnabled)
1389 {
1390 outPrintWriter<<StressTestControllerCommand::COMMAND_NAME<<
1391 "::Getting client PID's and status. "<<endl;
1392 }
1393 int rc = _getClientPIDs(actual_client,log_file);
1394 if (!rc)
1395 {
1396 outPrintWriter<<
1397 "Failed to communicate with clients."<<endl;
1398 j.alex 1.2 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1399 "::Failed to communicate with clients. "<<endl;
1400 log_file<<
1401 " ::Failed to get client PID & status. "
1402 <<endl;
1403 TestFailed = true;
1404 break;
1405 }
|
1406 kamal.locahana 1.5 }/* if (!actual_client) */
1407 else
1408 {
|
1409 j.alex 1.2 /**
1410 Every CHECKUP_INTERVAL minutes check to see if tests are
1411 within tolerance. Tests will cease to run if they
1412 are not within tolerance. The controller will stop
1413 all the clients and then exit.
1414 */
|
1415 kamal.locahana 1.5
|
1416 j.alex 1.2 //
1417 // Retreive all the client PIDs
1418 //
1419 int rc = _getClientPIDs(actual_client,log_file);
|
1420 kamal.locahana 1.5
|
1421 j.alex 1.2 //
1422 // Get Current Time
1423 //
1424 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1425
1426 //
1427 // Check tolerance level if its time
1428 //
1429 if (nowMilliseconds >= nextCheckupInMillisecs)
1430 {
1431 //
1432 // Set up the next tolerance time
1433 //
|
1434 kamal.locahana 1.5 nextCheckupInMillisecs =
|
1435 j.alex 1.2 (Uint64)convertmin2millisecs(CHECKUP_INTERVAL) +
|
1436 kamal.locahana 1.5 nowMilliseconds;
1437 //
1438 // End tests when failed to acquire the Client PID or
|
1439 j.alex 1.2 // status.
1440 //
1441 if (!rc)
1442 {
1443 outPrintWriter<<
1444 "Failed to communicate with clients."<<endl;
1445 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1446 "::Failed to communicate with clients. "<<endl;
1447 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1448 "::Get Client PID FAILED. "<<endl;
1449 TestFailed = true;
1450 break;
1451 }
1452 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1453 "::Checking current tolerance level. "<<endl;
1454 //
1455 // Output Client info if verbose is enabled.
1456 //
1457 if (verboseEnabled)
1458 {
1459 outPrintWriter<<
1460 j.alex 1.2 StressTestControllerCommand::COMMAND_NAME<<
1461 "::Checking current tolerance level. "<<endl;
1462 for (int i=0;i< actual_client; i++)
1463 {
1464 outPrintWriter <<" Client: "<<i;
1465 outPrintWriter <<" PID: "<<clientPIDs[i]<<", ";
1466 outPrintWriter <<" Status: "<<clientStatus[i]<<endl;
1467 log_file <<" Client: "<<i;
1468 log_file <<" PID: "<<clientPIDs[i]<<", ";
1469 log_file <<" Status: "<<clientStatus[i]<<", ";
1470 log_file<<" TimeStamp: "<<
1471 convertUint64toString(clientTimeStamp[i])<<
1472 endl;
1473 }
1474 }
|
1475 kamal.locahana 1.5 //
|
1476 j.alex 1.2 // Check the actual tolerance level
1477 //
1478 Boolean withinTolerance = _checkToleranceLevel(
1479 actual_client,
1480 nowMilliseconds,
1481 log_file);
|
1482 kamal.locahana 1.5 //
|
1483 j.alex 1.2 // End tests if not within tolerance
1484 //
1485 if (!withinTolerance)
1486 {
1487 log_file<<"FAILED::Tests NOT within tolerance."<<endl;
1488 errPrintWriter<<"FAILED::Tests NOT within tolerance."
1489 <<endl;
1490 TestFailed = true;
1491 break;
1492 }
|
1493 kamal.locahana 1.5 //
1494 // Within Tolerance - Continue tests.
|
1495 j.alex 1.2 //
1496 log_file<<"********Tests are within tolerance.********* "<<
|
1497 kamal.locahana 1.5 endl;
|
1498 j.alex 1.2 if (verboseEnabled)
1499 {
1500 outPrintWriter<<
1501 " ********Tests are within tolerance.**********"<<
1502 endl;
1503 }
1504 } /* if (nowMilliseconds >= nextCheckupInMillisecs)*/
1505 //
|
1506 kamal.locahana 1.5 // Stop clients with delay
|
1507 j.alex 1.2 //
1508 for (Uint32 clientID=0; clientID < _clientCount; clientID++)
|
1509 kamal.locahana 1.5 {
|
1510 j.alex 1.2 //
1511 // Get Current time
1512 //
|
1513 kamal.locahana 1.5 nowMilliseconds =
|
1514 j.alex 1.2 TimeValue::getCurrentTime().toMilliseconds();
1515
|
1516 kamal.locahana 1.5 //
|
1517 j.alex 1.2 // Stop only running clients as required.
1518 //
|
1519 kumpf 1.4 if (!clientStopped.get()[clientID])
|
1520 j.alex 1.2 {
|
1521 kamal.locahana 1.5 //
|
1522 j.alex 1.2 // If Client's duration is up
1523 //
|
1524 kumpf 1.4 if (clientStopMilliseconds.get()[clientID] <=
1525 nowMilliseconds)
|
1526 j.alex 1.2 {
|
1527 kamal.locahana 1.5 //
|
1528 j.alex 1.2 // Stop all the instances of this client
1529 //
1530 for (int instanceID =0;
1531 instanceID<clientInstance[clientID];
1532 instanceID++)
1533 {
1534 log_file<<"Stopping client:("<<
1535 clientID+instanceID<<")"<<endl;
1536 log_file<<" with PID = "<<
1537 clientPIDs[clientID+instanceID]<<endl;
1538 outPrintWriter<<"Stopping client:("<<
1539 clientID+instanceID<<")"<<endl;
1540 outPrintWriter<<" with PID = "<<
1541 clientPIDs[clientID+instanceID]<<endl;
1542 if (verboseEnabled)
1543 {
1544 tmTime = getCurrentActualTime();
1545 strftime(
1546 strTime,
1547 256,
1548 "%d/%m/%Y at %H:%M:%S\n",
1549 j.alex 1.2 &tmTime);
1550 log_file<<" Stopped on "<<strTime<<endl;
1551 }
|
1552 kamal.locahana 1.5 String stopClientFile = String::EMPTY;
|
1553 j.alex 1.2 stopClientFile.append(pegasusHome);
1554 stopClientFile.append(DEFAULT_TMPDIR);
1555 stopClientFile.append("STOP_");
1556 sprintf(
1557 str,
1558 "%d",
|
1559 kamal.locahana 1.5 clientPIDs[clientID+instanceID]);
|
1560 j.alex 1.2 stopClientFile.append(str);
1561 //
1562 // Required for Windows
1563 //
1564 ofstream stop_file(
1565 stopClientFile.getCString(),
1566 ios::out);
1567 stop_file << "Stop Client PID : "<<
1568 clientPIDs[clientID + instanceID]<<
1569 endl;
1570 stop_file.close();
1571 #ifndef PEGASUS_OS_TYPE_WINDOWS
1572 // one more way to stop the clients.
|
1573 kamal.locahana 1.5 int rc =
|
1574 j.alex 1.2 kill(clientPIDs[clientID+instanceID], SIGINT);
1575 if (rc)
1576 {
1577 outPrintWriter<<"FAILED to stop client:("<<
1578 clientID+instanceID<<")"<<endl;
1579 log_file<<"FAILED to stop client:("<<
1580 clientID + instanceID<<")"<<endl;
1581 }
1582 #endif
1583 //
1584 // Set the client as inactive.
1585 //
1586 clientActive[clientID + instanceID] = false;
1587 }/* for (int instanceID =0;instanceID<clientInst..*/
1588 //
|
1589 kamal.locahana 1.5 // indicate that the client was stopped.
|
1590 j.alex 1.2 //
|
1591 kumpf 1.4 clientStopped.get()[clientID] = true;
|
1592 kamal.locahana 1.5 //
|
1593 j.alex 1.2 // If the Client has a Wait time
1594 //
|
1595 kumpf 1.4 if (_clientDelays.get()[clientID] !=0)
|
1596 j.alex 1.2 {
|
1597 kamal.locahana 1.5 clientDelayMilliseconds.get()[clientID] =
|
1598 kumpf 1.4 nowMilliseconds +
1599 _clientDelays.get()[clientID];
1600 clientDelayed.get()[clientID] = true;
|
1601 j.alex 1.2 }
1602 } /* if (clientStopMilliseconds[clientID]<= nowMilli..*/
|
1603 kumpf 1.4 } /* if (!clientStopped.get()[clientID]) */
|
1604 kamal.locahana 1.5 else
|
1605 j.alex 1.2 {
1606 //
1607 // Only restart clients that are waiting.
1608 //
|
1609 kumpf 1.4 if (clientDelayed.get()[clientID])
|
1610 j.alex 1.2 {
1611 //
1612 // When waiting period is consumed.
1613 //
|
1614 kumpf 1.4 if (clientDelayMilliseconds.get()[clientID] <=
|
1615 j.alex 1.2 nowMilliseconds)
1616 {
1617 //
1618 // Restart all the instances of the client.
1619 //
1620 for (int instanceID =0;
1621 instanceID<clientInstance[clientID];
1622 instanceID++)
1623 {
1624 act_command=String::EMPTY;
1625 #ifdef PEGASUS_OS_TYPE_WINDOWS
1626 act_command.append("start ");
1627 #endif
1628 act_command.append(
|
1629 kumpf 1.4 _clientCommands.get()[clientID]);
|
1630 j.alex 1.2 act_command.append(" -clientid ");
|
1631 kamal.locahana 1.5 sprintf(str,"%d",clientID+instanceID);
|
1632 j.alex 1.2 act_command.append(str);
1633 act_command.append(" -pidfile ");
1634 act_command.append(" \"");
|
1635 kumpf 1.4 act_command.append(
1636 _stressTestClientPIDFile);
|
1637 j.alex 1.2 act_command.append("\"");
1638 act_command.append(" -clientlog");
1639 act_command.append(" \"");
|
1640 kumpf 1.4 act_command.append(
1641 _stressTestClientLogFile);
|
1642 j.alex 1.2 act_command.append("\"");
1643 act_command.append("&");
1644 log_file<<"Restarting client:("<<
1645 clientID+instanceID<<")"<<endl;
1646 outPrintWriter<<"Restarting client:("<<
1647 clientID+instanceID<<")"<<endl;
1648 if (verboseEnabled)
1649 {
1650 outPrintWriter<<" "<<act_command<<endl;
1651 log_file<<" ("<<
1652 clientID+instanceID<<
1653 ") \n"<<act_command<<endl;
1654 tmTime = getCurrentActualTime();
1655 strftime(
1656 strTime,
1657 256,
1658 "%d/%m/%Y at %H:%M:%S\n",
1659 &tmTime);
1660 log_file<<" Restarted on "<<
1661 strTime<<endl;
1662 }
1663 j.alex 1.2 int rc = system(act_command.getCString());
1664 if (rc)
|
1665 kamal.locahana 1.5 {
|
1666 j.alex 1.2 log_file<<"Command failed to Execute."<<
1667 endl;
1668 if (verboseEnabled)
1669 {
|
1670 kamal.locahana 1.5 outPrintWriter<<act_command<<
|
1671 j.alex 1.2 "Command failed to Execute."<<
1672 endl;
1673 }
1674 }
1675 clientActive[clientID+instanceID] = true;
1676 } /* for (int instanceID =0;instanceID .. */
|
1677 kamal.locahana 1.5 clientStopMilliseconds.get()[clientID] =
1678 nowMilliseconds +
|
1679 kumpf 1.4 _clientDurations.get()[clientID];
1680 clientStopped.get()[clientID] = false;
1681 clientDelayed.get()[clientID] = false;
|
1682 j.alex 1.2 }/* if(clientDelayMilliseconds[clientID]<=nowMi.. */
|
1683 kumpf 1.4 } /* if(clientDelayed.get()[clientID]) */
|
1684 j.alex 1.2 } /* else ..*/
1685 } /* for(Uint32 clientID=0;clientID < _clientCount;clientID++)*/
1686 } /* else for if(!actual_client) */
1687 //
1688 // Get Current time
1689 //
1690 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1691
1692 } /* while(stopMilliseconds > nowMilliseconds) */
|
1693 kamal.locahana 1.5
|
1694 j.alex 1.2 }//try
|
1695 kamal.locahana 1.5
|
1696 j.alex 1.2 catch (const StressTestControllerException& e)
1697 {
|
1698 kamal.locahana 1.5 errPrintWriter << StressTestControllerCommand::COMMAND_NAME <<
|
1699 j.alex 1.2 ": " << e.getMessage () << endl;
1700 return (RC_ERROR);
1701 }
1702
|
1703 kamal.locahana 1.5 //
|
1704 j.alex 1.2 // Stress Tests should be stopped.
1705 //
1706 outPrintWriter<<"Ending tests::Preparing to stop all the clients."<<endl;
1707 log_file<<"Ending tests::Preparing to stop all the clients."<<endl;
1708
|
1709 kamal.locahana 1.5 // Waiting to allow any clients that might have been re-started
1710 // just before the tests were ended to add
|
1711 j.alex 1.2 // its pid to the pid file.
1712
1713 #ifndef PEGASUS_OS_TYPE_WINDOWS
|
1714 kamal.locahana 1.5 sleep(STOP_DELAY);
|
1715 j.alex 1.2 #else
1716 Sleep(STOP_DELAY * 1000);
1717 #endif
1718
1719 //
1720 // get all the clientPIDs before it is stopped.
1721 //
1722 int rc = _getClientPIDs(actual_client,log_file);
1723 if (!rc)
1724 {
1725 outPrintWriter<<"Failed to communicate with clients."<<endl;
1726 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1727 "::Failed to communicate with clients. "<<endl;
1728 log_file<<" ::Failed to get client PID & status. "<<
1729 endl;
1730 TestFailed = true;
1731 }
1732 tmTime = getCurrentActualTime();
1733 strftime(strTime,256,"%d/%m/%Y at %H:%M:%S\n",&tmTime);
1734 log_file<<"Ending tests:: Stopping all the clients on "<<strTime <<endl;
1735 for (int i=0;i<actual_client;i++)
1736 j.alex 1.2 {
1737 if(verboseEnabled)
1738 {
1739 outPrintWriter<<"Stopping Client("<<i<<") with PID:"<<
1740 clientPIDs[i]<<endl;
1741 }
1742 log_file<<"Stopping Client("<<i<<") with PID:"<<clientPIDs[i]<<endl;
1743 //
1744 // Required for Windows
1745 //
|
1746 kamal.locahana 1.5 String stopClientFile = String::EMPTY;
|
1747 j.alex 1.2 stopClientFile.append(pegasusHome);
1748 stopClientFile.append(DEFAULT_TMPDIR);
1749 stopClientFile.append("STOP_");
|
1750 kamal.locahana 1.5 sprintf(str,"%d",clientPIDs[i]);
|
1751 j.alex 1.2 stopClientFile.append(str);
1752 ofstream stop_file(stopClientFile.getCString(),ios::out);
1753 stop_file << "Stop Client PID : "<<clientPIDs[i]<<endl;
1754 stop_file.close();
1755 #ifndef PEGASUS_OS_TYPE_WINDOWS
1756 // Another way to stop the client
1757 int rc = 0;
1758 rc = kill(clientPIDs[i], SIGINT);
1759 if (rc)
1760 {
1761 if (verboseEnabled)
1762 {
1763 outPrintWriter<<"Failed to stop client:("<<i<<")"<<endl;
1764 }
1765 log_file<<"Failed to stop client:("<<i<<")"<<endl;
1766 }
1767 #endif
1768 }
1769 if (verboseEnabled)
1770 {
1771 outPrintWriter<<"Cleaning all resources"<<endl;
1772 j.alex 1.2 }
1773 log_file<<"Cleaning all resources."<<endl;
1774 cleanupProcess();
|
1775 kamal.locahana 1.5
|
1776 j.alex 1.2 //
|
1777 kamal.locahana 1.5 // Waiting to allow clients to shutdown
|
1778 j.alex 1.2 //
1779 #ifndef PEGASUS_OS_TYPE_WINDOWS
|
1780 kamal.locahana 1.5 sleep(SHUTDOWN_DELAY);
|
1781 j.alex 1.2 #else
1782 Sleep(SHUTDOWN_DELAY * 1000);
1783 #endif
|
1784 kamal.locahana 1.5 //
|
1785 j.alex 1.2 // If the test did not run to completition
1786 //
1787 if (TestFailed)
1788 return(RC_ERROR);
1789
1790 return (RC_SUCCESS);
1791 } /* execute */
1792
1793
1794 /*
|
1795 kamal.locahana 1.5 Retrieves the contents of the config file if specified or uses default
|
1796 j.alex 1.2 values from either the default config file
1797
1798 @param fileName The specified or default config file for the
|
1799 kamal.locahana 1.5 tests.
|
1800 j.alex 1.2 @param log_file The log file.
1801
1802 @return true if the file was read successfully
1803 false if file was not read successfully.
1804
1805 */
1806 Boolean StressTestControllerCommand::getFileContent(
1807 String fileName,
1808 ostream& log_file)
1809 {
1810 String configData = String::EMPTY;
1811 String line;
1812 int lineNumber = 0;
1813 Boolean isSuccess = true;
1814 String name = String::EMPTY;
1815 String value = String::EMPTY;
1816 String ErrReports = String::EMPTY;
1817
1818 ifstream ifs;
1819
1820 //
1821 j.alex 1.2 // Open the config file and read the stress test configuration data
1822 //
1823 Open(ifs,fileName);
1824 if (!ifs)
1825 {
1826 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1827 "::Cannot read config file: "<<fileName<<endl;
1828 throw NoSuchFile(fileName);
1829 }
1830
1831 log_file<<StressTestControllerCommand::COMMAND_NAME <<
1832 "::Storing client details. "<<endl;
1833 if (verboseEnabled)
1834 {
1835 cout<<StressTestControllerCommand::COMMAND_NAME<<
1836 "::Storing config details. "<<endl;
1837 }
1838 //
1839 // Get each line of the file.
1840 //
1841 while (GetLine(ifs, line))
1842 j.alex 1.2 {
1843 ++lineNumber;
1844 IsAClient = false;
1845 name = String::EMPTY;
1846 value = String::EMPTY;
|
1847 kamal.locahana 1.5 try
|
1848 j.alex 1.2 {
1849 //
1850 // Parse each line of Config file
1851 //
1852 _parseLine(line,lineNumber,name,value,log_file);
|
1853 kamal.locahana 1.5 }
|
1854 j.alex 1.2 //
1855 // catch all the exceptions if any thrown from parseLine
|
1856 kamal.locahana 1.5 // - Accumulate all the errors from the config file
1857 // - Report all errors if found when complete.
|
1858 j.alex 1.2 //
1859 catch (Exception& e)
1860 {
1861 char line_num[10];
1862 sprintf(line_num, "%d", lineNumber);
1863 String msg(e.getMessage());
1864 ErrReports.append("\n ");
1865 ErrReports.append("line#");
1866 ErrReports.append(line_num);
1867 ErrReports.append(":: ");
1868 ErrReports.append(msg.getCString());
1869 log_file<<StressTestControllerCommand::COMMAND_NAME<<"::"
1870 <<msg<<endl;
1871 isSuccess = false;
1872 }
1873 catch(...)
1874 {
1875 char line_num[10];
1876 sprintf(line_num, "%d", lineNumber);
1877 ErrReports.append("\n ");
1878 ErrReports.append("line#");
1879 j.alex 1.2 ErrReports.append(line_num);
1880 ErrReports.append(":: ");
1881 ErrReports.append("Unknown exception caught.");
1882 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1883 ":Unknown exception caught when parsing line."<<endl;
1884 cerr<<StressTestControllerCommand::COMMAND_NAME <<
1885 ":Unknown exception caught when parsing line."<<endl;
|
1886 kamal.locahana 1.5 return false;
|
1887 j.alex 1.2 }
1888
1889 if ((IsClientOptions)||(IgnoreLine))
1890 {
1891 IsClientOptions = false;
1892 IgnoreLine = false;
1893 continue;
1894 }
1895 //
1896 // If its a client Update the table
1897 //
1898 if (IsAClient)
1899 {
1900 _currClient=name;
1901 _currClientCount=_clientCount;
1902 //
1903 // save the client details in a table
1904 //
1905 if (!_storeClientDetails(name,value))
1906 {
1907 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1908 j.alex 1.2 "::Syntax error found in line#"<<lineNumber<<
1909 " of config file: "<<fileName<<endl;
1910 isSuccess = false;
1911 }
|
1912 kamal.locahana 1.5 }
1913 else
1914 {
|
1915 j.alex 1.2 //
1916 // Common properties are updated only if they are valid.
1917 //
1918 if (isSuccess)
|
1919 kamal.locahana 1.5 {
|
1920 j.alex 1.2 //
1921 // Store the property name and value in the table
1922 //
1923 if (verboseEnabled)
1924 {
1925 cout<<" "<<name<<"\t= "<<value<<endl;
1926 }
|
1927 kumpf 1.4 if (!_propertyTable.insert(name, value))
|
1928 j.alex 1.2 {
1929 //
1930 // Duplicate property, ignore the new property value.
1931 //
|
1932 j.alex 1.3 #ifdef STRESSTEST_DEBUG
|
1933 j.alex 1.2 cout<< "Property Name:duplicate name already saved: "<<
1934 name<<endl;
1935 #endif
1936 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1937 "::Duplicate property name "<<name<<" already saved."<<
1938 endl;
1939 }
1940 }
1941 }
1942
1943 }
1944 ifs.close();
1945 //
|
1946 kamal.locahana 1.5 // If a client is not read from the config file
|
1947 j.alex 1.2 //
1948 if ((lineNumber==0)||(!_clientCount))
1949 {
1950 ErrReports.append("\n ");
1951 ErrReports.append(StressTestControllerCommand::COMMAND_NAME);
1952 ErrReports.append("::No clients found.");
1953 log_file<<StressTestControllerCommand::COMMAND_NAME <<
1954 "::No clients found in"<<" config file: "<<fileName<<endl;
1955 isSuccess = false;
1956 }
1957 //
1958 // Error was found.
1959 //
1960 if (!isSuccess)
1961 {
|
1962 kamal.locahana 1.5 //
|
1963 j.alex 1.2 // cleanup allocated memory
1964 //
1965 cleanupProcess();
|
1966 kamal.locahana 1.5 throw StressTestControllerException(ErrReports);
|
1967 j.alex 1.2 }
1968
1969 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1970 "::Common Properties:"<<endl;
1971 if (verboseEnabled)
1972 {
1973 cout<<StressTestControllerCommand::COMMAND_NAME<<
1974 "::Common Properties:"<<endl;
1975 }
|
1976 kumpf 1.4 for (Table::Iterator i = _propertyTable.start(); i; i++)
|
1977 j.alex 1.2 {
1978 log_file<<" "<<i.key()<<"\t= "<<i.value()<<endl;
1979 if (verboseEnabled)
1980 {
1981 cout<<" "<<i.key()<<"\t= "<<i.value()<<endl;
1982 }
1983 }
1984 if (verboseEnabled)
1985 {
1986 cout<<"Total clients found:"<<_clientCount<<endl;
1987 cout<<"CLIENT TABLE CONTENTS:"<<endl;
1988 }
1989 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1990 "::Client Properties:"<<endl;
1991 for (Uint32 j = 0; j < _clientCount; j++)
1992 {
1993 log_file<<"Client information #"<<j+1<<" from config file:"<<endl;
1994 if (verboseEnabled)
1995 {
1996 cout<<"Client("<<j<<")"<<endl;
1997 }
|
1998 kumpf 1.4 for (Table::Iterator i = _clientTable.get()[j].start(); i; i++)
|
1999 j.alex 1.2 {
2000 log_file<<" "<<i.key()<<" = "<<i.value()<<endl;
2001 if (verboseEnabled)
2002 {
2003 cout<<" "<< i.key() << "=" << i.value() << endl;
2004 }
2005 }
2006 }
|
2007 kamal.locahana 1.5
2008
|
2009 j.alex 1.2 if (isSuccess)
2010 {
2011 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2012 "::Successfully retreived config values from" <<
2013 " config file: "<<fileName<<endl;
2014 }
2015 return isSuccess;
2016 }/* getFileContent */
2017
|
2018 kamal.locahana 1.5
|
2019 j.alex 1.2 /*
|
2020 kamal.locahana 1.5 Validates the configuration data found in the specified config file or
|
2021 j.alex 1.2 the default config file.
2022 Will validate known common/client specific properties in configuration.
|
2023 kamal.locahana 1.5 Will validate valid client names.
|
2024 j.alex 1.2 (Clients are excepted to exist in the $PEGASUS_HOME/bin directory)
2025
2026 @param vars The property name to be validated
2027 @param value The property value associated to the above name
2028
2029 @return true if the property was validated successfully
2030 false if the property failed validation.
2031
2032 */
2033
2034
2035 Boolean StressTestControllerCommand::_validateConfiguration(
2036 String & vars,
2037 const String & value,
2038 ostream& log_file)
2039 {
2040 Boolean IsValid = false;
2041
|
2042 kamal.locahana 1.5
|
2043 j.alex 1.2 if (String::equalNoCase(vars,HOSTNAME))
2044 {
2045 vars=String::EMPTY;
2046 vars.append(HOSTNAME);
2047 if(!IsAClient)
2048 {
2049 if (!_hostNameSpecified)
2050 {
2051 _hostName = value;
2052 }
|
2053 kamal.locahana 1.5 }
|
2054 j.alex 1.2 else
2055 {
|
2056 kamal.locahana 1.5
|
2057 j.alex 1.2 if(_hostName != String::EMPTY)
2058 {
2059 if (!String::equalNoCase(value,_hostName))
2060 {
2061 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2062 "::Multiple hostnames were found. "<<endl;
2063 if (verboseEnabled)
2064 {
2065 cout<<StressTestControllerCommand::COMMAND_NAME <<
2066 "::Multiple hostnames were found. "<<endl;
2067 }
2068 return false;
2069 }
2070 }
2071 else
|
2072 kamal.locahana 1.5 {
|
2073 j.alex 1.2 _hostName = value;
2074 }
2075 }
2076 }
2077 else if (String::equalNoCase(vars,PORTNUMBER))
2078 {
2079 vars=String::EMPTY;
2080 vars.append(PORTNUMBER);
2081 Uint32 vPortNumber = atoi(value.getCString());
|
2082 kamal.locahana 1.5
|
2083 j.alex 1.2 log_file<<StressTestControllerCommand::COMMAND_NAME <<
2084 "::Portnumber specified in config = "<<vPortNumber<<endl;
2085 if (verboseEnabled)
2086 {
2087 cout<<StressTestControllerCommand::COMMAND_NAME <<
2088 "::Portnumber specified in config = "<<vPortNumber<<endl;
2089 }
2090 if (vPortNumber > _MAX_PORTNUMBER)
2091 {
2092 //
2093 // Portnumber out of valid range
2094 //
2095 if (verboseEnabled)
2096 {
2097 cout<<StressTestControllerCommand::COMMAND_NAME <<
2098 "::Invalid portnumber was found. "<<endl;
2099 }
2100 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2101 "::Invalid portnumber was found. "<<endl;
2102 return false;
2103 }
2104 j.alex 1.2 if (!_portNumberSpecified)
2105 {
2106 _portNumber = atoi(value.getCString());
2107 }
2108
2109 }/* else if (String::equalNoCase ... */
2110 else if (String::equalNoCase(vars,SSL))
2111 {
2112 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2113 "::SSL enabled in config. "<<endl;
2114 if (!_useSSL)
2115 {
2116 _useSSL = true;
2117 }
2118 }
2119 else if (String::equalNoCase(vars,USERNAME))
2120 {
2121 vars=String::EMPTY;
2122 vars.append(USERNAME);
2123 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2124 "::UserName specified in config = "<<value<<endl;
2125 j.alex 1.2 if (!_userNameSpecified)
2126 {
2127 _userName = value;
2128 }
2129 }
2130 else if (String::equalNoCase(vars,PASSWORD))
2131 {
2132 vars=String::EMPTY;
2133 vars.append(PASSWORD);
2134 if(!_passwordSpecified)
2135 {
2136 _password = value;
2137 }
2138 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2139 "::Password specified in config = "<<value<<endl;
2140 }
2141 else if (String::equalNoCase(vars,DURATION))
2142 {
2143 vars=String::EMPTY;
2144 vars.append(DURATION);
2145 //
2146 j.alex 1.2 // converting to a double
2147 //
2148 if (!IsAClient)
2149 {
2150 _duration = atof(value.getCString());
2151 if (_duration > _MIN_DURATION)
2152 {
2153 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2154 "::Duration specified in config = "<<value<<endl;
|
2155 kamal.locahana 1.5 }
|
2156 j.alex 1.2 else
2157 {
2158 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2159 "::Invalid Duration was specified. "<<endl;
2160 return false;
2161 }
2162 }
2163 }
2164 else if (String::equalNoCase(vars,TOLERANCELEVEL))
2165 {
2166 _toleranceLevel = atoi(value.getCString());
2167 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2168 "::ToleranceLevel specified in config = "<<value<<endl;
|
2169 kamal.locahana 1.5 if (_toleranceLevel > _MAX_TOLERANCE)
|
2170 j.alex 1.2 {
2171 if(verboseEnabled)
2172 {
2173 cout<<StressTestControllerCommand::COMMAND_NAME <<
2174 "::Invalid Tolerance level was specified. "<<endl;
2175 }
2176 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2177 "::Invalid Tolerance level was specified. "<<endl;
2178
2179 return false;
2180 }
2181 }
2182 else if (String::equalNoCase(vars,NAMESPACE))
2183 {
2184 _nameSpace = value;
2185 log_file<<StressTestControllerCommand::COMMAND_NAME <<
2186 "::NameSpace specified in config = "<<value<<endl;
2187 }
2188 else if (String::equalNoCase(vars,CLASSNAME))
2189 {
2190 _className = value;
2191 j.alex 1.2 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2192 "::Class name specified in config = "<<value<<endl;
2193 }
2194 else
|
2195 kamal.locahana 1.5 {
|
2196 j.alex 1.2 if (!IsAClient)
2197 {
2198 IsAClient=true;
2199 int instance = atoi(value.getCString());
2200 //
2201 // Check if the instances are set correctly
|
2202 kamal.locahana 1.5 // Must be greater than 0
|
2203 j.alex 1.2 //
2204 if (instance <=0)
2205 {
2206 //
|
2207 kamal.locahana 1.5 // Invalid Instance value
|
2208 j.alex 1.2 //
2209 return false;
2210 }
2211 //
2212 // Check if client exists or is valid.
2213 // Clients are expected to be in the $PEGASUS_HOME/bin directory
2214 //
2215 String clientName = String(DEFAULT_BINDIR);
2216 clientName.append(vars.getCString());
2217 #ifdef PEGASUS_OS_TYPE_WINDOWS
2218 clientName.append(".exe");
2219 #endif
2220 if (!FileSystem::exists(clientName))
2221 {
2222 String testString = String::EMPTY;
2223 testString.append("Test");
2224 Uint32 Index = vars.find(testString);
2225 if (Index != 0)
2226 {
2227 clientName = String(DEFAULT_BINDIR);
2228 testString.append(vars.getCString());
2229 j.alex 1.2 clientName.append(testString.getCString());
2230 #ifdef PEGASUS_OS_TYPE_WINDOWS
2231 clientName.append(".exe");
2232 #endif
2233 if (!FileSystem::exists(clientName))
2234 {
2235 //
2236 // Invalid client name
2237 //
|
2238 kamal.locahana 1.5 IsValid = false;
|
2239 j.alex 1.2 }
|
2240 kamal.locahana 1.5 else
|
2241 j.alex 1.2 {
|
2242 kamal.locahana 1.5 IsValid = true;
|
2243 j.alex 1.2 vars=String::EMPTY;
2244 vars.append(testString.getCString());
2245 }
2246 }
2247 else
2248 {
|
2249 kamal.locahana 1.5
|
2250 j.alex 1.2 //
2251 // Invalid client name
2252 //
2253 IsValid = false;
|
2254 kamal.locahana 1.5 }
2255 }
2256 else
|
2257 j.alex 1.2 {
2258 IsValid = true;
2259 }
2260 if (!IsValid)
2261 {
2262 if (verboseEnabled)
2263 {
2264 cout<<StressTestControllerCommand::COMMAND_NAME <<
2265 "::Invalid Client Name = "<<vars<<endl;
2266 }
2267 String ErrReport = String("Invalid Client Name:");
2268 ErrReport.append(vars.getCString());
|
2269 kamal.locahana 1.5 throw StressTestControllerException(ErrReport);
|
2270 j.alex 1.2 }
2271 return IsValid;
2272 }
2273 log_file<<StressTestControllerCommand::COMMAND_NAME<<"::"<<vars<<
2274 " = "<<value<<endl;
2275 //
2276 // otherwise accept the properties listed with the clients.
2277 //
2278 }
2279 return true;
2280
2281 } /* _validateConfiguration */
2282
2283 /*
2284 Retrieves the client specific options from the config file.
2285 Will check for syntax errors with the client options.
2286 - Will retrieve all the client options in the line until ']'
|
2287 kamal.locahana 1.5 - Client options/properties in Config file are
|
2288 j.alex 1.2 represented as follows:
|
2289 kamal.locahana 1.5 - "[" indicates start of client options.
2290 - "]" indicates end of client options.
|
2291 j.alex 1.2 - Client properties and values are seperated by commas.
2292 Example:
|
2293 kamal.locahana 1.5 [clientName=cimcli,Options=niall]
|
2294 j.alex 1.2 - This method will throw appropriate exceptions.
2295
2296 @param p The pointer to the char in the concerned line
2297
2298
2299 */
2300 void StressTestControllerCommand::_getClientOptions(
2301 const Char16* p,
2302 ostream& log_file)
2303 {
2304 //
2305 // Get the property name
2306 //
2307 String name = String::EMPTY;
2308 String value = String::EMPTY;
2309
2310 while (*p != ']')
|
2311 kamal.locahana 1.5 {
|
2312 j.alex 1.2 //
2313 // Skip whitespace after property name
2314 //
2315 while (*p && isspace(*p))
2316 {
2317 p++;
2318 }
2319 if (!(isalpha(*p) || *p == '_'))
2320 {
|
2321 kumpf 1.4 throw StressTestControllerException(
|
2322 kamal.locahana 1.5 StressTestControllerException::INVALID_OPTION);
|
2323 j.alex 1.2 }
2324
2325 name.append(*p++);
2326
2327
2328 while (isalnum(*p) || *p == '_')
2329 {
2330 name.append(*p++);
2331 }
2332
2333 //
2334 // Skip whitespace after property name
2335 //
2336 while (*p && isspace(*p))
2337 {
2338 p++;
2339 }
|
2340 kamal.locahana 1.5
|
2341 j.alex 1.2 //
2342 // Expect an equal sign
2343 //
2344 if (*p != '=')
2345 {
|
2346 kumpf 1.4 throw StressTestControllerException(
|
2347 kamal.locahana 1.5 StressTestControllerException::INVALID_OPERATOR);
|
2348 j.alex 1.2 }
2349
2350 p++;
2351
2352 //
2353 // Skip whitespace after equal sign
2354 //
2355 while (*p && isspace(*p))
2356 {
2357 p++;
2358 }
2359
2360 //
2361 // Get the value
2362 //
2363
2364 while (*p && *p != ']' && *p != ',')
2365 {
2366 value.append(*p++);
2367 }
2368 //
|
2369 kamal.locahana 1.5 // Skip whitespace after value
|
2370 j.alex 1.2 //
2371 while (*p && isspace(*p))
2372 {
2373 cout << "got space after value\n";
2374 p++;
2375 }
2376
2377 if(*p !=']' && *p != ',')
2378 {
|
2379 kumpf 1.4 throw StressTestControllerException(
|
2380 kamal.locahana 1.5 StressTestControllerException::MISSING_BRACE);
|
2381 j.alex 1.2 }
2382 if(value == String::EMPTY)
2383 {
|
2384 kumpf 1.4 throw StressTestControllerException(
|
2385 kamal.locahana 1.5 StressTestControllerException::MISSING_VALUE);
|
2386 j.alex 1.2 }
|
2387 kamal.locahana 1.5
|
2388 j.alex 1.3 #ifdef STRESSTEST_DEBUG
|
2389 j.alex 1.2 cout<<"name="<<name<<endl;
2390 cout<<"Before validate config: value="<<value<<endl;
2391 #endif
2392 //
2393 // validate client property
|
2394 kamal.locahana 1.5 //
|
2395 j.alex 1.2 Boolean IsValid=_validateConfiguration(name,value,log_file);
2396 if(!IsValid)
2397 {
2398 String ErrReport = String("Invalid Client property value: ");
2399 ErrReport.append(name);
2400 ErrReport.append("=");
2401 ErrReport.append(value);
|
2402 kamal.locahana 1.5 throw StressTestControllerException(ErrReport);
|
2403 j.alex 1.2 }
2404 //
2405 // Save client property in client table if valid.
2406 //
|
2407 kumpf 1.4 if (!_clientTable.get()[_currClientCount].insert(name,value))
|
2408 j.alex 1.2 {
2409 //
2410 // Duplicate property, ignore the new property value.
2411 // Log this message in a log file.
2412 //
2413 log_file<< "duplicate name already saved: "<<name<<endl;
2414 if (verboseEnabled)
2415 {
2416 cout<< "duplicate name already saved: "<<name<<endl;
2417 }
2418 }
2419 if (*p ==',')
2420 {
2421 name = String::EMPTY;
2422 value = String::EMPTY;
2423 p++;
2424 continue;
2425 }
2426 }
|
2427 kamal.locahana 1.5
|
2428 j.alex 1.2 if ((name == String::EMPTY)||(value == String::EMPTY))
|
2429 kamal.locahana 1.5 {
|
2430 j.alex 1.2 String ErrReport = String("Missing Name & Value for client option:");
|
2431 kamal.locahana 1.5 throw StressTestControllerException(ErrReport);
|
2432 j.alex 1.2 }
2433 } /* _getClientOptions */
2434
2435
2436 /*
|
2437 kamal.locahana 1.5 Retrieves the Client PIDs and the corresponding status of the
2438 clients started by the Controller from the PID file.
|
2439 j.alex 1.2 Each line in the PID file if not a comment is expected to
2440 have the following format:
2441 <clientid>::<client_pid>::<client_status>::<timeStampInMillisec>
2442 Example:
2443 1::7582::0::4119329327
2444
2445 Client PID, status and Time Stamp from the PID file will be saved
|
2446 kamal.locahana 1.5 in the following global array's for each client.
|
2447 j.alex 1.2 clientPIDs
2448 clientStatus
2449 clientTimeStamp
|
2450 kamal.locahana 1.5
2451
2452 @param actual_clients The actual number of clients executed by the
|
2453 j.alex 1.2 Controller.
2454 @param log_file The log file.
2455
2456 @return true if the status and PIDs were read successfully
2457 false Failed to read the status & PIDs of clients.
2458
2459 */
2460 Boolean StressTestControllerCommand::_getClientPIDs(
2461 int actual_clients,
2462 ostream& log_file)
2463 {
2464
2465 ifstream ifs;
2466
2467 //
2468 // Make a temp copy of the file
2469 //
2470 Boolean cTempFile = FileSystem::copyFile(
2471 _stressTestClientPIDFile,
2472 _tmpStressTestClientPIDFile);
2473
2474 j.alex 1.2 if(!cTempFile)
2475 {
2476 cout<<"Cannot copy file "<<_stressTestClientPIDFile<<endl;
2477 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2478 "::Cannot copy PID file: "<<_stressTestClientPIDFile<<endl;
2479 return (false);
2480 }
2481 //
2482 // Open the temp PID file and retreive all the client PIDs and status
2483 //
2484 Open(ifs,_tmpStressTestClientPIDFile);
2485
2486 String line;
2487
2488 const Char16* p;
2489 int lineNumber= 0;
2490 Boolean isSuccess=false;
2491 //
2492 // get each line until end of file.
2493 //
2494 while (GetLine(ifs, line))
2495 j.alex 1.2 {
2496 ++lineNumber;
|
2497 j.alex 1.3 #ifdef STRESSTEST_DEBUG
|
2498 j.alex 1.2 log_file<<" Line number:"<<lineNumber<<endl;
2499 log_file<<" "<<line<<endl;
2500 #endif
2501 p = line.getChar16Data();
2502
2503 while (*p && isspace(*p))
2504 {
2505 p++;
2506 }
2507
2508 //
2509 // Skip comment lines
2510 //
2511 if ((!*p)||(*p == '#'))
2512 {
2513 continue;
2514 }
2515
2516 //
2517 // Get the client ID
2518 //
2519 j.alex 1.2 String client = String::EMPTY;
2520 while (isalnum(*p) || *p == '_')
2521 {
2522 client.append(*p++);
2523 }
2524
2525 //
2526 // Skip whitespace after property name
2527 //
2528 while (*p && isspace(*p))
2529 {
2530 p++;
2531 }
2532
2533 //
|
2534 kamal.locahana 1.5 // Expecting a colon
|
2535 j.alex 1.2 //
2536 if (*p != ':')
2537 {
2538 ifs.close();
2539 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2540 "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2541 FileSystem::removeFile(_tmpStressTestClientPIDFile);
2542 return(isSuccess = false);
2543 }
2544
2545 //
2546 // point to next character in line.
2547 //
2548 p++;
2549
2550 //
|
2551 kamal.locahana 1.5 // Expecting a colon
|
2552 j.alex 1.2 //
2553 if (*p != ':')
2554 {
2555 ifs.close();
2556 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2557 "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2558 FileSystem::removeFile(_tmpStressTestClientPIDFile);
2559 return(isSuccess = false);
2560 }
|
2561 kamal.locahana 1.5
|
2562 j.alex 1.2 //
2563 // point to next character in line.
2564 //
2565 p++;
2566
2567 //
|
2568 kamal.locahana 1.5 // Skip whitespace after colon
|
2569 j.alex 1.2 //
2570 while (*p && isspace(*p))
2571 {
2572 p++;
2573 }
2574
2575 //
|
2576 kamal.locahana 1.5 // Get the client PID
|
2577 j.alex 1.2 //
2578 String clntPID = String::EMPTY;
2579 while (isalnum(*p) || *p == '_')
2580 {
2581 clntPID.append(*p++);
2582 }
|
2583 kamal.locahana 1.5
|
2584 j.alex 1.2 //
2585 // Skip whitespace after property name
2586 //
2587 while (*p && isspace(*p))
2588 {
2589 p++;
2590 }
2591
2592 //
|
2593 kamal.locahana 1.5 // Expecting a colon
|
2594 j.alex 1.2 //
2595 if (*p != ':')
2596 {
2597 ifs.close();
2598 log_file<<StressTestControllerCommand::COMMAND_NAME <<
2599 "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2600 FileSystem::removeFile(_tmpStressTestClientPIDFile);
2601 return(isSuccess = false);
2602 }
2603
2604 //
2605 // point to next character in line.
2606 //
2607 p++;
2608
2609 //
|
2610 kamal.locahana 1.5 // Expecting a colon
|
2611 j.alex 1.2 //
2612 if (*p != ':')
2613 {
2614 ifs.close();
2615 log_file<<StressTestControllerCommand::COMMAND_NAME <<
2616 "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2617 FileSystem::removeFile(_tmpStressTestClientPIDFile);
2618 return(isSuccess = false);
2619 }
2620 p++;
2621
2622 //
|
2623 kamal.locahana 1.5 // Skip whitespace after the colon if any
|
2624 j.alex 1.2 //
2625 while (*p && isspace(*p))
|
2626 kamal.locahana 1.5 {
|
2627 j.alex 1.2 p++;
2628 }
2629
2630 String clntStatus = String::EMPTY;
2631 while (isalnum(*p) || *p == '_')
2632 {
2633 clntStatus.append(*p++);
2634 }
2635
2636 //
2637 // Skip whitespace after property name
2638 //
2639 while (*p && isspace(*p))
2640 {
2641 p++;
2642 }
2643
2644 //
|
2645 kamal.locahana 1.5 // Expecting a colon
|
2646 j.alex 1.2 //
2647 if (*p != ':')
2648 {
2649 ifs.close();
2650 log_file<<StressTestControllerCommand::COMMAND_NAME <<
2651 "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2652 FileSystem::removeFile(_tmpStressTestClientPIDFile);
2653 return(isSuccess = false);
2654 }
2655
2656 //
2657 // next character in line.
2658 //
2659 p++;
2660
2661 if (*p != ':')
2662 {
2663 ifs.close();
2664 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2665 "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2666 FileSystem::removeFile(_tmpStressTestClientPIDFile);
2667 j.alex 1.2 return(isSuccess = false);
2668 }
2669 //
2670 // next character in line.
2671 //
2672 p++;
2673 //
|
2674 kamal.locahana 1.5 // Skip whitespace after the colon if any
|
2675 j.alex 1.2 //
2676 while (*p && isspace(*p))
2677 {
2678 p++;
2679 }
2680
2681 //
|
2682 kamal.locahana 1.5 // Get the client timestamp
|
2683 j.alex 1.2 //
2684 String clntTmStmp = String::EMPTY;
2685 while (isalnum(*p))
2686 {
2687 clntTmStmp.append(*p++);
2688 }
2689
2690 //
|
2691 kamal.locahana 1.5 // Store the PID, Status and TimeStamp for each client
|
2692 j.alex 1.2 //
2693 if(atoi(client.getCString()) <= actual_clients)
2694 {
|
2695 kamal.locahana 1.5 clientPIDs[atoi(client.getCString())] =
|
2696 j.alex 1.2 (pid_t)atoi(clntPID.getCString());
|
2697 kamal.locahana 1.5 clientStatus[atoi(client.getCString())] =
|
2698 j.alex 1.2 (pid_t)atoi(clntStatus.getCString());
2699 sscanf(
2700 (const char*)clntTmStmp.getCString(),
2701 "%" PEGASUS_64BIT_CONVERSION_WIDTH "u",
2702 &clientTimeStamp[atoi(client.getCString())]);
2703 }
2704 else
2705 {
2706 if (verboseEnabled)
2707 {
2708 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2709 "::Unknown client PID for client#"<<
2710 atoi(client.getCString())<<
2711 " read at line number:"<<lineNumber<<endl;
2712 cout<<"Unknown Client PID recieved"<<endl;
2713 }
|
2714 kamal.locahana 1.5 }
|
2715 j.alex 1.2 }
2716 //
2717 // remove the temporary file.
2718 //
2719 FileSystem::removeFile(_tmpStressTestClientPIDFile);
2720 return(isSuccess = true);
2721 }/* _getClientPIDs */
2722
2723 /*
|
2724 kamal.locahana 1.5 Parses specified line to retrieve valid config data for the stress tests.
|
2725 j.alex 1.2 - Identifies client specific properties from common properties in config file
2726 - Saves all the client specific data from the config file into appropriate
2727 client tables.
2728 - Saves all the common properties in the property table
2729 - This method will throw appropriate exceptions.
2730 Config File Format:
2731 - All comments begin with "#"
2732 - Properties in Config file are represented as follows:
2733 <property> = <property value>
|
2734 kamal.locahana 1.5 - Client options/properties in Config file are
|
2735 j.alex 1.2 represented as follows:
|
2736 kamal.locahana 1.5 - "[" indicates start of client options.
|
2737 j.alex 1.2 - Client properties and values are seperated by commas.
2738 Example:
|
2739 kamal.locahana 1.5 [clientName=cimcli,Options=niall]
|
2740 j.alex 1.2
2741 @param line The line that will be parsed.
2742 @parm lineNumber The line number of the line.
2743 @parm name The property name that will be retrieved.
2744 @parm value The property value of the name.
|
2745 kamal.locahana 1.5 @parm log_file The log file.
|
2746 j.alex 1.2
2747 @return true Succesfully parsed the line.
|
2748 kamal.locahana 1.5 false Failed to parse the lines successfully.
|
2749 j.alex 1.2 */
2750 Boolean StressTestControllerCommand::_parseLine(
2751 const String & line,
2752 int lineNumber,
2753 String &name,
2754 String &value,
2755 ostream& log_file)
2756 {
2757
2758 const Char16* p;
2759 p = line.getChar16Data();
2760
2761 //
2762 // Skip whitespace
2763 //
2764 while (*p && isspace(*p))
2765 {
2766 p++;
2767 }
2768
|
2769 kamal.locahana 1.5 //
|
2770 j.alex 1.2 // Ignore empty lines
2771 //
2772 if (!*p)
2773 {
2774 IgnoreLine = true;
2775 return IgnoreLine;
2776 }
2777
2778 //
2779 // Skip comment lines
2780 //
2781 if (*p == '#')
2782 {
2783 IgnoreLine = true;
2784 return IgnoreLine;
2785 }
2786
2787 //
|
2788 kamal.locahana 1.5 // Retreive all the Client Options
|
2789 j.alex 1.2 // "[" indicates start of client options.
2790 //
2791 if (*p == '[')
2792 {
2793 IsAClient = true;
2794 IsClientOptions = true;
2795 p++;
|
2796 kamal.locahana 1.5 //
|
2797 j.alex 1.2 // Ignore spaces before client property
2798 //
2799 while (*p && isspace(*p))
2800 {
2801 p++;
2802 }
2803 //
2804 // Invalid Client property name
2805 //
2806 if (!(isalpha(*p) || *p == '_'))
2807 {
2808 String ErrReport = String("Syntax Error with client options:");
2809 ErrReport.append(line.getCString());
|
2810 kamal.locahana 1.5 throw StressTestControllerException(ErrReport);
|
2811 j.alex 1.2 }
|
2812 kamal.locahana 1.5 //
|
2813 j.alex 1.2 // Retrieve client options
2814 //
2815 try
2816 {
2817 //
|
2818 kamal.locahana 1.5 // get and validate client options
|
2819 j.alex 1.2 //
2820 _getClientOptions(p,log_file);
2821 }
2822 catch (Exception& e)
2823 {
2824 String msg(e.getMessage());
2825 if ((name == String::EMPTY)
2826 ||(value == String::EMPTY))
2827 {
2828 msg.append(" in ");
2829 msg.append(line.getCString());
2830 }
|
2831 kamal.locahana 1.5 throw StressTestControllerException(msg);
|
2832 j.alex 1.2 }
2833 catch (...)
2834 {
2835 String msg = String(
2836 "Unknown exception caught when geting client options.");
2837 log_file<<StressTestControllerCommand::COMMAND_NAME <<
2838 ":Unknown exception caught when geting client options."<<endl;
2839 cerr<<StressTestControllerCommand::COMMAND_NAME <<
2840 ":Unknown exception caught when geting client options."<<endl;
|
2841 kamal.locahana 1.5 throw StressTestControllerException(msg);
|
2842 j.alex 1.2 }
2843
2844 //
2845 // Successfully retrieved all the client options.
2846 //
2847 return true;
2848 }
2849
2850 //
|
2851 kamal.locahana 1.5 // Get Common Properties
|
2852 j.alex 1.2 //
2853 name = String::EMPTY;
2854
2855 //
2856 // Invalid Common Property name
2857 //
2858 if (!(isalpha(*p) || *p == '_'))
2859 {
2860 String ErrReport = String("Invalid Property Value: ");
2861 ErrReport.append(name);
2862 ErrReport.append("=");
2863 ErrReport.append(value);
2864 throw StressTestControllerException(ErrReport);
2865 }
2866
2867 //
2868 // Save the property Name
2869 //
2870 name.append(*p++);
2871 while (isalnum(*p) || *p == '_')
2872 {
2873 j.alex 1.2 name.append(*p++);
2874 }
2875
2876 //
2877 // Skip whitespace after property name
2878 //
2879 while (*p && isspace(*p))
2880 {
2881 p++;
2882 }
2883
2884 //
2885 // Expect an equal sign
2886 //
2887 if (*p != '=')
2888 {
2889 String ErrReport = String("Invalid Property Value: ");
2890 ErrReport.append(name);
2891 ErrReport.append("=");
2892 ErrReport.append(value);
2893 throw StressTestControllerException(ErrReport);
2894 j.alex 1.2 }
2895
2896 //
2897 // go to next
|
2898 kamal.locahana 1.5 //
|
2899 j.alex 1.2 p++;
2900
2901 //
|
2902 kamal.locahana 1.5 // Retrive the property value
|
2903 j.alex 1.2 // Skip whitespace after equal sign
2904 //
2905 while (*p && isspace(*p))
2906 {
2907 p++;
2908 }
2909
2910 //
2911 // Get the value
2912 //
2913 value = String::EMPTY;
2914 while (*p)
2915 {
2916 value.append(*p++);
2917 }
|
2918 j.alex 1.3 #ifdef STRESSTEST_DEBUG
|
2919 j.alex 1.2 cout<<"name="<<name<<endl;
2920 cout<<"value="<<value<<endl;
2921 #endif
2922 IsAClient = false;
2923 Boolean IsValid = false;
|
2924 kamal.locahana 1.5 //
|
2925 j.alex 1.2 // Validate property and its value
2926 //
2927 try
2928 {
2929 IsValid=_validateConfiguration(name,value,log_file);
2930 }
2931 catch (Exception& e)
2932 {
2933 String msg(e.getMessage());
|
2934 kamal.locahana 1.5 throw StressTestControllerException(msg);
|
2935 j.alex 1.2 }
2936 if (!IsValid)
2937 {
2938 String ErrReport = String("Invalid Property Value: ");
2939 ErrReport.append(name);
2940 ErrReport.append("=");
2941 ErrReport.append(value);
2942 throw StressTestControllerException(ErrReport);
2943 }
2944 return true;
2945 } /* _parseLine */
2946
2947 /*
2948 Storing client details in a table.
|
2949 kamal.locahana 1.5 - Stores the Client name and instance for specific clients in their
|
2950 j.alex 1.2 respective client table for later use.
2951
2952 @parm name The client name that will be stored.
2953 @parm value The number of instances of the client.
2954
2955 @return true Succesfully stored the name or instance.
2956 false Failed to store the name or instance.
2957 */
2958 Boolean StressTestControllerCommand::_storeClientDetails(
2959 String name,
2960 String value)
2961 {
|
2962 kamal.locahana 1.5
2963 //
|
2964 j.alex 1.2 // Expand the client table as required.
2965 //
2966 if (_clientCount >= Total_Clients)
2967 {
2968 Total_Clients += NEW_CLIENTS;
|
2969 kamal.locahana 1.5 Table* tempClientTable = new Table[Total_Clients];
|
2970 kumpf 1.4 for (Uint32 i = 0; i < _clientCount; i++)
|
2971 j.alex 1.2 {
|
2972 kumpf 1.4 tempClientTable[i] = _clientTable.get()[i];
|
2973 j.alex 1.2 }
|
2974 kumpf 1.4 _clientTable.reset(tempClientTable);
2975 }
|
2976 j.alex 1.2
|
2977 kamal.locahana 1.5 //
|
2978 j.alex 1.2 // Store the client Name in the table
|
2979 kamal.locahana 1.5 //
|
2980 kumpf 1.4 if (!_clientTable.get()[_clientCount].insert(NAME, name))
|
2981 j.alex 1.2 {
2982 //
2983 // Duplicate property, ignore the new property value.
2984 //
2985 if (verboseEnabled)
2986 {
2987 cout<< "Duplicate Client already saved: "<<endl;
2988 }
2989 return false;
2990 }
2991
|
2992 kamal.locahana 1.5 //
|
2993 j.alex 1.2 // Store the number of instances for the client in the table
|
2994 kamal.locahana 1.5 //
|
2995 kumpf 1.4 if (!_clientTable.get()[_clientCount].insert(INSTANCE, value))
|
2996 j.alex 1.2 {
2997
2998 //
2999 // Duplicate property, ignore the new property value.
3000 //
3001 if(verboseEnabled)
3002 {
3003 cout<< "Duplicate Instance already saved: "<<endl;
3004 }
3005 return false;
3006 }
3007 ++_clientCount;
3008 return true;
3009 } /* _storeClientDetails */
3010
3011 /*
3012 Will check the current tolerance level of the running clients with
3013 respect to the expected tolerance level.
|
3014 kamal.locahana 1.5 @parm actual_client The total number of executed clients.
|
3015 j.alex 1.2 @parm nowMilliseconds The current time in milliseconds.
3016 @parm log_file The log_file.
3017
3018 @return true Clients with tolerance.
3019 false Clients failed tolerance.
3020 */
3021 Boolean StressTestControllerCommand::_checkToleranceLevel(
3022 int actual_client,
3023 Uint64 nowMilliseconds,
|
3024 kamal.locahana 1.5 ostream& log_file)
|
3025 j.alex 1.2 {
3026 int count = 0;
3027 int failed_count = 0;
|
3028 kamal.locahana 1.5 Uint64 lastUpdateinMilliSec =0;
|
3029 j.alex 1.2 Boolean withinTolerance = false;
3030
3031 for (int i=0;i<actual_client;i++)
3032 {
|
3033 kamal.locahana 1.5 //
|
3034 j.alex 1.2 //Observe only the status of running clients
3035 //
3036 if (clientActive[i])
3037 {
3038 ++count;
3039 //
3040 // Validate the timestamps:
|
3041 kamal.locahana 1.5 // The timestamps on the status is compared to the previous
3042 // timestamp to ensure that the status has been updated within
|
3043 j.alex 1.2 // the previous 2 updates.
3044 //
3045 if(clientStatus[i]== VALID_RESPONSE)
3046 {
3047 //
3048 //check with the last timestamp
3049 //
3050 lastUpdateinMilliSec = nowMilliseconds - clientTimeStamp[i];
3051 //
3052 // Assume failure if status update is
|
3053 kamal.locahana 1.5 // longer than 2 * checkup interval
|
3054 j.alex 1.2 //
3055 if ((clientTimeStamp[i] == prev_clientTimeStamp[i])
3056 && (lastUpdateinMilliSec >=
3057 (2 * (Uint64)convertmin2millisecs(CHECKUP_INTERVAL))))
|
3058 kamal.locahana 1.5 {
|
3059 j.alex 1.2 if (verboseEnabled)
3060 {
3061 log_file <<" Status not updated for client (" <<i<<
3062 ")pid :"<<clientPIDs[i]<<endl;
|
3063 kamal.locahana 1.5 log_file << " for the past " <<
|
3064 j.alex 1.2 2*(CHECKUP_INTERVAL) << " minutes." << endl;
3065 cout<<" Status not updated for client ("<<i<<")pid :"<<
3066 clientPIDs[i]<<endl;
3067 cout<<" for the past " << 2*(CHECKUP_INTERVAL)<<
3068 " minutes." << endl;
3069 }
|
3070 kamal.locahana 1.5 ++failed_count;
|
3071 j.alex 1.2 }
3072 }
3073 //
3074 // If unknown status - server or client may be hung.
3075 // Two consective failures on the same client will be counted
|
3076 kamal.locahana 1.5 // as a failed client.
|
3077 j.alex 1.2 //
3078 if (((clientStatus[i]== NO_RESPONSE)
3079 ||(clientStatus[i]== INVALID_RESPONSE))
3080 &&((prev_clientStatus[i]== NO_RESPONSE)
3081 ||(prev_clientStatus[i]== INVALID_RESPONSE)))
3082 {
3083 if (verboseEnabled)
3084 {
3085 if (clientStatus[i]== INVALID_RESPONSE)
3086 {
3087 log_file<<
3088 "Recieved an Invalid response Status from client("<<
3089 i <<") pid :"<<clientPIDs[i]<<endl;
3090 }
3091 else
|
3092 kamal.locahana 1.5 {
|
3093 j.alex 1.2 log_file<<"Recieved a no response Status from client("<<
3094 i <<") pid :"<<clientPIDs[i]<<endl;
3095 }
3096 }
|
3097 kamal.locahana 1.5 ++failed_count;
|
3098 j.alex 1.2 } /* if (((clientStatus[i]== NO_RESPONSE) ... */
3099 //
3100 // Save previous time stamp of client
3101 //
3102 prev_clientTimeStamp[i] = clientTimeStamp[i];
3103 prev_clientStatus[i] = clientStatus[i];
3104 } /* if (clientActive[i]) */
3105 }
3106 //
3107 // check actual tolerance
3108 //
3109 if(count > 0)
3110 {
3111 double curr_tolerancePercent = getToleranceInPercent(
3112 failed_count,
3113 (double)count);
3114 if (verboseEnabled)
3115 {
3116 cout<<" total running clients ="<<count<<endl;
3117 cout<<" failed clients ="<<failed_count<<endl;
3118 cout<<"Actual Tolerance % ="<<curr_tolerancePercent<<endl;
3119 j.alex 1.2 cout<<"Expected Tolerance % ="<<_toleranceLevel<<endl;
3120 log_file<<"Total Running clients:"<<count<<endl;
3121 log_file<<"Actual Failed clients:"<<failed_count<<endl;
3122 log_file<<"::Expected Tolerance:"<<_toleranceLevel<<endl;
3123 log_file<<"::Actual Tolerance:"<<curr_tolerancePercent<<endl;
3124 }
3125 if ((double)_toleranceLevel >= curr_tolerancePercent)
3126 {
3127 withinTolerance = true;
3128 }
3129 return(withinTolerance);
3130 }
3131 //
3132 // All process are stopped.
3133 //
3134 return(withinTolerance = true);
3135 } /* _checkToleranceLevel */
3136
3137
3138 /*
3139 This will populate the client table with the hard coded
3140 j.alex 1.2 values for the stress tests.
|
3141 kamal.locahana 1.5 This method is only used if the default configuration
|
3142 j.alex 1.2 file does not exist.
|
3143 kamal.locahana 1.5 Default clients are 5 instances of
|
3144 j.alex 1.2 "TestWrapperStressClient" and "TestModelWalkStressClient".
3145
|
3146 kamal.locahana 1.5 @parm log_file The log_file.
3147
|
3148 j.alex 1.2 */
3149 void StressTestControllerCommand::getDefaultClients(ostream& log_file)
3150 {
3151 //
3152 // Setting the client count to default client value
3153 //
|
3154 kamal.locahana 1.5 _clientCount = DEFAULT_CLIENTS;
|
3155 j.alex 1.2
|
3156 kamal.locahana 1.5 log_file << "Populating default configuration for stress Tests." << endl;
|
3157 j.alex 1.2 if (verboseEnabled)
3158 {
|
3159 kamal.locahana 1.5 cout << "Populating default configuration for stress Tests." << endl;
|
3160 j.alex 1.2 }
3161 //
3162 // Populating default client attributes
3163 //
3164 for (Uint32 i=0;i<_clientCount; i++)
3165 {
3166 //
3167 // Adding the default instance value to each client table
3168 //
|
3169 kumpf 1.4 if (!_clientTable.get()[i].insert(INSTANCE, DEFAULT_INSTANCE))
|
3170 j.alex 1.2 {
3171 log_file << "Duplicate name already saved: "<<INSTANCE<<endl;
3172 if (verboseEnabled)
3173 {
3174 cout<< "duplicate name already saved: "<<INSTANCE<<endl;
3175 }
3176 }
3177 switch(i)
|
3178 kamal.locahana 1.5 {
|
3179 j.alex 1.2 case 0:
3180 {
|
3181 kumpf 1.4 if (!_clientTable.get()[i].insert(NAME, MODELWALK_CLIENT))
|
3182 j.alex 1.2 {
3183 log_file << "Duplicate name already saved: "<<NAME<<endl;
3184 if (verboseEnabled)
3185 {
3186 cout<< "Duplicate name already saved: "<<NAME<<endl;
3187 }
3188 }
|
3189 kumpf 1.4 log_file << "Stress Test Client Name:" << MODELWALK_CLIENT <<
3190 endl;
|
3191 j.alex 1.2 if (verboseEnabled)
3192 {
|
3193 kamal.locahana 1.5 cout<< "Stress Test Client Name:"<<MODELWALK_CLIENT<< endl;
|
3194 j.alex 1.2 }
3195
3196 break;
3197 }
3198 case 1:
3199 {
|
3200 kumpf 1.4 if (!_clientTable.get()[i].insert(NAME, WRAPPER_CLIENT))
|
3201 j.alex 1.2 {
3202 log_file << "Duplicate name already saved: "<<NAME<<endl;
3203 if (verboseEnabled)
3204 {
3205 cout<< "Duplicate name already saved: "<<NAME<<endl;
3206 }
3207 }
|
3208 kamal.locahana 1.5 log_file << "Stress Test Client Name:" <<WRAPPER_CLIENT<< endl;
|
3209 j.alex 1.2 if (verboseEnabled)
3210 {
|
3211 kamal.locahana 1.5 cout << "Stress Test Client Name:" <<WRAPPER_CLIENT<< endl;
|
3212 j.alex 1.2 }
|
3213 kamal.locahana 1.5 if (!_clientTable.get()[i].insert(CLIENTNAME, "cimcli"))
|
3214 j.alex 1.2 {
3215 log_file<< "Duplicate name already saved: "<<
3216 CLIENTNAME<<endl;
|
3217 kamal.locahana 1.5 if (verboseEnabled)
3218 {
|
3219 j.alex 1.2 cout<< "Duplicate name already saved: "<<
3220 CLIENTNAME<<endl;
3221 }
3222 }
|
3223 kumpf 1.4 if (!_clientTable.get()[i].insert(OPTIONS, "niall"))
|
3224 j.alex 1.2 {
3225 log_file<< "Duplicate name already saved: "<<OPTIONS<<endl;
3226 if (verboseEnabled)
3227 {
3228 cout<< "Duplicate name already saved: "<<OPTIONS<<endl;
|
3229 kamal.locahana 1.5 }
|
3230 j.alex 1.2 }
|
3231 kumpf 1.7 log_file <<
3232 " Client Command & options: cimcli niall" <<
|
3233 kamal.locahana 1.5 endl;
|
3234 j.alex 1.2 if (verboseEnabled)
3235 {
|
3236 kumpf 1.7 cout <<
3237 " Client Command & options: cimcli niall" <<
3238 endl;
|
3239 j.alex 1.2 }
3240 break;
3241 } /* case 1: */
3242 } /* switch(i) */
3243 } /* for(Uint32 i=0;i<_clientCount; i++) */
3244
3245 } /* getDefaultClients */
3246
3247
3248
3249
3250 /**
3251 Will generate or create all the required files for the tests.
|
3252 kamal.locahana 1.5 - Required log files, pid files, client log file are created here.
|
3253 j.alex 1.2
|
3254 kamal.locahana 1.5 @parm strTime The time stamp for the tests.
|
3255 j.alex 1.2 This is used in the naming of the log file.
3256
3257 @return true The files were successfully created.
3258 false Failed to create one or more of the required
3259 files.
3260
3261 */
3262 Boolean StressTestControllerCommand::generateRequiredFileNames(char *strTime)
3263 {
3264 char pid_str[15];
3265 ofstream log_file;
3266 ofstream pid_file;
3267 ofstream clntlog_file;
3268
3269 sprintf(pid_str, "%d", getpid());
|
3270 kamal.locahana 1.5
|
3271 j.alex 1.2 //
3272 // Stress Controller Log file
3273 //
3274 _stressTestLogFile.append(pegasusHome);
3275 _stressTestLogFile.append(TESTDIR);
3276 FileSystem::makeDirectory(_stressTestLogFile);
3277 _stressTestLogFile.append(STRESSTESTDIR);
3278 FileSystem::makeDirectory(_stressTestLogFile);
3279 _stressTestLogFile.append(LOGDIR);
3280 FileSystem::makeDirectory(_stressTestLogFile);
3281 _stressTestLogFile.append(pid_str);
3282 _stressTestLogFile.append("_stressTest_");
3283 _stressTestLogFile.append(strTime);
3284 _stressTestLogFile.append("log");
3285
3286 //
3287 // StressClient PID file
3288 //
3289 _stressTestClientPIDFile.append(pegasusHome);
3290 _stressTestClientPIDFile.append(DEFAULT_TMPDIR);
3291 FileSystem::makeDirectory(_stressTestClientPIDFile);
3292 j.alex 1.2 _stressTestClientPIDFile.append(pid_str);
3293 _stressTestClientPIDFile.append("_StressTestClients");
3294 _stressTestClientPIDFile.append(strTime);
3295 _stressTestClientPIDFile.append("pid");
3296
3297 //
3298 // StressClient Log file
3299 //
3300 _stressTestClientLogFile.append(pegasusHome);
3301 _stressTestClientLogFile.append(DEFAULT_LOGDIR);
3302 _stressTestClientLogFile.append(pid_str);
3303 _stressTestClientLogFile.append("_StressTestClients");
3304 _stressTestClientLogFile.append(".log");
|
3305 kamal.locahana 1.5
|
3306 j.alex 1.2 //
3307 // Temporary StressClient PID/status file
3308 //
3309 _tmpStressTestClientPIDFile.append(pegasusHome);
3310 _tmpStressTestClientPIDFile.append(DEFAULT_TMPDIR);
3311 _tmpStressTestClientPIDFile.append(pid_str);
3312 _tmpStressTestClientPIDFile.append("TEMP");
3313 _tmpStressTestClientPIDFile.append("_Clients");
3314 _tmpStressTestClientPIDFile.append(".pid");
3315
3316 //
3317 // Translate slashed for appropriate OS
3318 //
3319 FileSystem::translateSlashes(_stressTestClientPIDFile);
3320 FileSystem::translateSlashes(_stressTestClientLogFile);
3321 FileSystem::translateSlashes(_stressTestLogFile);
3322 FileSystem::translateSlashes(_tmpStressTestClientPIDFile);
3323
3324 //
3325 // open the file
3326 //
3327 j.alex 1.2 OpenAppend(log_file,_stressTestLogFile);
3328 Open(pid_file,_stressTestClientPIDFile);
3329 Open(clntlog_file,_stressTestClientLogFile);
3330
3331 //
3332 // Failed to open the log file
3333 //
3334 if (!log_file)
3335 {
3336 log_file.close();
3337 pid_file.close();
3338 clntlog_file.close();
3339 cout<<"Cannot get file "<<_stressTestLogFile<<endl;
3340 return false;
3341
3342 }
3343 //
3344 // Failed to open the pid file
3345 //
3346 if (!pid_file)
3347 {
3348 j.alex 1.2 cout<<"Cannot get file "<<_stressTestClientPIDFile<<endl;
3349 log_file<<StressTestControllerCommand::COMMAND_NAME<<
3350 "Cannot read file "<<_stressTestClientPIDFile<<endl;
3351 log_file.close();
3352 clntlog_file.close();
3353 return false;
3354 }
3355 //
3356 // Failed to open the clntlog file
3357 //
3358 if (!clntlog_file)
3359 {
3360 log_file<<StressTestControllerCommand::COMMAND_NAME<<
3361 "Cannot read file "<<_stressTestClientLogFile<<endl;
3362 log_file.close();
3363 pid_file.close();
3364 return false;
3365 }
3366
3367 //
3368 // Successfully opened all the files.
3369 j.alex 1.2 //
3370 pid_file<<"#"<<StressTestControllerCommand::COMMAND_NAME<<
3371 " has the following clients:: \n";
3372 clntlog_file<<"#"<<StressTestControllerCommand::COMMAND_NAME<<
3373 "::Process ID:"<<getpid()<<endl;
3374 clntlog_file.close();
3375 pid_file.close();
3376 return true;
3377
3378 } /* generateRequiredFileNames */
3379
3380 /**
3381 Will remove all the unused files for the tests.
|
3382 kamal.locahana 1.5 - Unused log files & pid files are removed here.
|
3383 j.alex 1.2
3384 */
3385 void StressTestControllerCommand::removeUnusedFiles()
3386 {
3387 FileSystem::removeFile(_stressTestClientPIDFile);
3388 FileSystem::removeFile(_stressTestClientLogFile);
3389 }
3390
3391 PEGASUS_NAMESPACE_END
3392
3393 /**
3394 Cleanup function for stressTestController to free allocated
3395 memory used to execute clients.
3396 */
3397 void cleanupProcess()
3398 {
3399
3400 delete [] clientPIDs;
3401 delete [] clientStatus;
3402 delete [] clientInstance;
3403 delete [] clientActive;
3404 j.alex 1.2 delete [] clientTimeStamp;
3405 delete [] prev_clientTimeStamp;
3406 delete [] prev_clientStatus;
3407 }
3408
3409 /*
3410 This will generate the current time.
3411 */
3412 struct tm getCurrentActualTime()
3413 {
3414 struct tm tmTime;
3415 time_t inTime=time(NULL);
3416 #ifdef PEGASUS_OS_TYPE_WINDOWS
3417 tmTime=*localtime(&inTime);
3418 #else
3419 localtime_r(&inTime,&tmTime);
3420 #endif
3421 return tmTime;
3422 }
3423
3424 /**
3425 j.alex 1.2 Signal handler for SIGINT, SIGABRT.
3426
3427 @param signum the signal identifier
3428 */
3429 void endAllTests(int signum)
3430 {
3431 if (verboseEnabled)
3432 {
3433 switch(signum)
3434 {
3435 case SIGINT:
3436 {
3437 cout<<StressTestControllerCommand::COMMAND_NAME<<
3438 "::Recieved interupt signal SIGINT!"<<endl;
3439 break;
3440 }
3441 case SIGABRT:
3442 {
3443 cout<<StressTestControllerCommand::COMMAND_NAME<<
3444 "::Recieved signal SIGABRT!"<<endl;
3445 break;
3446 j.alex 1.2 }
3447 default:
3448 {
3449 cout<<StressTestControllerCommand::COMMAND_NAME<<
3450 "::Recieved Signal ( "<<signum<<"!" <<endl;
3451 break;
3452 }
3453 }
3454 }
3455 //
3456 // Sets the variable that will interupt stress tests
3457 //
3458 Quit = true;
3459 } /* endAllTests */
3460
3461 /**
3462 This function will convert a Uint64
3463 to a string.
3464
3465 @param x The Uint64 integer
3466
3467 j.alex 1.2 @return String Returns the converted string.
3468 */
3469 String convertUint64toString(Uint64 x)
3470 {
3471 char buffer[32];
3472 sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "u", x);
3473 return(String(buffer));
3474 }/* convertUint64toString(..) */
|