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