You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by mg...@apache.org on 2010/02/24 06:07:13 UTC
svn commit: r915673 - in /qpid/trunk/qpid/cpp/src/tests: failover_soak.cpp
run_failover_soak
Author: mgoulish
Date: Wed Feb 24 05:07:13 2010
New Revision: 915673
URL: http://svn.apache.org/viewvc?rev=915673&view=rev
Log:
Failover_soak was not detecting child exits properly, and so
was not terminating when the sending and receiving clients
had both exited.
Also, the killing of a broker on every loop was excessive and
caused test-generated problems that are not meaningful.
I have changed the way the failover_soak process detects child
exits, and made it only kill brokers about once every twenty
times trhough its main loop. ( Using a random number to decide
when to do it. ) This still results in a good number of broker-kills
during a 500,000 message test.
Modified:
qpid/trunk/qpid/cpp/src/tests/failover_soak.cpp
qpid/trunk/qpid/cpp/src/tests/run_failover_soak
Modified: qpid/trunk/qpid/cpp/src/tests/failover_soak.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/failover_soak.cpp?rev=915673&r1=915672&r2=915673&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/failover_soak.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/failover_soak.cpp Wed Feb 24 05:07:13 2010
@@ -54,6 +54,8 @@
namespace qpid {
namespace tests {
+vector<pid_t> pids;
+
typedef vector<ForkedBroker *> brokerVector;
typedef enum
@@ -184,17 +186,29 @@
int
checkChildren ( )
{
- vector<child *>::iterator i;
- for ( i = begin(); i != end(); ++ i )
- if ( (COMPLETED == (*i)->status) && (0 != (*i)->retval) )
- {
- cerr << "checkChildren: error on child of type "
- << (*i)->type
- << endl;
- return (*i)->retval;
- }
+ for ( unsigned int i = 0; i < pids.size(); ++ i )
+ {
+ int pid = pids[i];
+ int returned_pid;
+ int status;
- return 0;
+ child * kid = get ( pid );
+
+ if ( kid->status != COMPLETED )
+ {
+ returned_pid = waitpid ( pid, &status, WNOHANG );
+
+ if ( returned_pid == pid )
+ {
+ int exit_status = WEXITSTATUS(status);
+ exited ( pid, exit_status );
+ if ( exit_status ) // this is a child error.
+ return exit_status;
+ }
+ }
+ }
+
+ return 0;
}
@@ -323,6 +337,7 @@
int verbosity,
int durable )
{
+ // ("--log-enable=notice+")
static int brokerId = 0;
stringstream path, prefix;
prefix << "soak-" << brokerId;
@@ -516,6 +531,7 @@
argv.push_back ( 0 );
pid_t pid = fork();
+ pids.push_back ( pid );
if ( ! pid ) {
execv ( receiverPath, const_cast<char * const *>(&argv[0]) );
@@ -571,6 +587,7 @@
argv.push_back ( 0 );
pid_t pid = fork();
+ pids.push_back ( pid );
if ( ! pid ) {
execv ( senderPath, const_cast<char * const *>(&argv[0]) );
@@ -602,6 +619,7 @@
int
main ( int argc, char const ** argv )
{
+ int brokerKills = 0;
if ( argc != 11 ) {
cerr << "Usage: "
<< argv[0]
@@ -625,7 +643,6 @@
int n_brokers = atoi(argv[i++]);
char const * host = "127.0.0.1";
- int maxBrokers = 50;
allMyChildren.verbosity = verbosity;
@@ -722,104 +739,86 @@
int minSleep = 2,
- maxSleep = 4;
+ maxSleep = 6;
+
+ int totalBrokers = n_brokers;
+ int loop = 0;
- for ( int totalBrokers = n_brokers;
- totalBrokers < maxBrokers;
- ++ totalBrokers
- )
+ while ( 1 )
{
+ ++ loop;
+
+ /*
+ if ( verbosity > 1 )
+ std::cerr << "------- loop " << loop << " --------\n";
+
if ( verbosity > 0 )
cout << totalBrokers << " brokers have been added to the cluster.\n\n\n";
+ */
// Sleep for a while. -------------------------
int sleepyTime = mrand ( minSleep, maxSleep );
- if ( verbosity > 0 )
- cout << "Sleeping for " << sleepyTime << " seconds.\n";
sleep ( sleepyTime );
- // Kill the oldest broker. --------------------------
- if ( ! killFrontBroker ( brokers, verbosity ) )
+ int bullet = mrand ( 100 );
+ if ( bullet >= 95 )
+ {
+ fprintf ( stderr, "Killing oldest broker...\n" );
+
+ // Kill the oldest broker. --------------------------
+ if ( ! killFrontBroker ( brokers, verbosity ) )
+ {
+ allMyChildren.killEverybody();
+ killAllBrokers ( brokers, 5 );
+ std::cerr << "END_OF_TEST ERROR_BROKER\n";
+ return ERROR_KILLING_BROKER;
+ }
+ ++ brokerKills;
+
+ // Start a new broker. --------------------------
+ if ( verbosity > 0 )
+ cout << "Starting new broker.\n\n";
+
+ startNewBroker ( brokers,
+ moduleOrDir,
+ clusterName,
+ verbosity,
+ durable );
+ ++ totalBrokers;
+ printBrokers ( brokers );
+ cerr << brokerKills << " brokers have been killed.\n\n\n";
+ }
+
+ int retval = allMyChildren.checkChildren();
+ if ( retval )
{
- allMyChildren.killEverybody();
- killAllBrokers ( brokers, 5 );
- std::cerr << "END_OF_TEST ERROR_BROKER\n";
- return ERROR_KILLING_BROKER;
+ std::cerr << "END_OF_TEST ERROR_CLIENT\n";
+ allMyChildren.killEverybody();
+ killAllBrokers ( brokers, 5 );
+ return ERROR_ON_CHILD;
}
- // Sleep for a while. -------------------------
- sleepyTime = mrand ( minSleep, maxSleep );
- if ( verbosity > 1 )
- cerr << "Sleeping for " << sleepyTime << " seconds.\n";
- sleep ( sleepyTime );
-
- // Start a new broker. --------------------------
- if ( verbosity > 0 )
- cout << "Starting new broker.\n\n";
-
- startNewBroker ( brokers,
- moduleOrDir,
- clusterName,
- verbosity,
- durable );
-
- if ( verbosity > 1 )
- printBrokers ( brokers );
-
// If all children have exited, quit.
int unfinished = allMyChildren.unfinished();
- if ( ! unfinished ) {
+ if ( unfinished == 0 ) {
killAllBrokers ( brokers, 5 );
if ( verbosity > 1 )
cout << "failoverSoak: all children have exited.\n";
- int retval = allMyChildren.checkChildren();
- if ( verbosity > 1 )
- std::cerr << "failoverSoak: checkChildren: " << retval << endl;
-
- if ( retval )
- {
- std::cerr << "END_OF_TEST ERROR_CLIENT\n";
- return ERROR_ON_CHILD;
- }
- else
- {
- std::cerr << "END_OF_TEST SUCCESSFUL\n";
- return HUNKY_DORY;
- }
- }
- // Even if some are still running, if there's an error, quit.
- if ( allMyChildren.checkChildren() )
- {
- if ( verbosity > 0 )
- cout << "failoverSoak: error on child.\n";
- allMyChildren.killEverybody();
- killAllBrokers ( brokers, 5 );
- std::cerr << "END_OF_TEST ERROR_CLIENT\n";
- return ERROR_ON_CHILD;
+ std::cerr << "END_OF_TEST SUCCESSFUL\n";
+ return HUNKY_DORY;
}
- if ( verbosity > 1 ) {
- std::cerr << "------- next kill-broker loop --------\n";
- allMyChildren.print();
- }
}
- retval = allMyChildren.checkChildren();
- if ( verbosity > 1 )
- std::cerr << "failoverSoak: checkChildren: " << retval << endl;
-
- if ( verbosity > 1 )
- cout << "failoverSoak: maxBrokers reached.\n";
-
allMyChildren.killEverybody();
killAllBrokers ( brokers, 5 );
std::cerr << "END_OF_TEST SUCCESSFUL\n";
- return retval ? ERROR_ON_CHILD : HUNKY_DORY;
+ return HUNKY_DORY;
}
Modified: qpid/trunk/qpid/cpp/src/tests/run_failover_soak
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/run_failover_soak?rev=915673&r1=915672&r2=915673&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/run_failover_soak (original)
+++ qpid/trunk/qpid/cpp/src/tests/run_failover_soak Wed Feb 24 05:07:13 2010
@@ -26,12 +26,12 @@
unset QPID_NO_MODULE_DIR # failover_soak uses --module-dir, dont want clash
MODULES=${MODULES:-$moduledir}
-MESSAGES=${MESSAGES:-1000000}
+MESSAGES=${MESSAGES:-500000}
REPORT_FREQUENCY=${REPORT_FREQUENCY:-20000}
VERBOSITY=${VERBOSITY:-10}
DURABILITY=${DURABILITY:-0}
N_QUEUES=${N_QUEUES:-1}
-N_BROKERS=${N_BROKERS:-3}
+N_BROKERS=${N_BROKERS:-4}
rm -f soak-*.log
exec ./failover_soak $MODULES ./declare_queues ./replaying_sender ./resuming_receiver $MESSAGES $REPORT_FREQUENCY $VERBOSITY $DURABILITY $N_QUEUES $N_BROKERS
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org