From 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 Mon Sep 17 00:00:00 2001 From: Constantin Jucovschi Date: Fri, 24 Apr 2009 07:20:22 -0400 Subject: Initial commit --- .../scripts/test_error-par/test_error-par.cc | 467 +++++++++++++++++++++ 1 file changed, 467 insertions(+) create mode 100644 systemtest/scripts/test_error-par/test_error-par.cc (limited to 'systemtest/scripts/test_error-par/test_error-par.cc') diff --git a/systemtest/scripts/test_error-par/test_error-par.cc b/systemtest/scripts/test_error-par/test_error-par.cc new file mode 100644 index 0000000..05eb7f0 --- /dev/null +++ b/systemtest/scripts/test_error-par/test_error-par.cc @@ -0,0 +1,467 @@ +/* +* This file is part of rasdaman community. +* +* Rasdaman community is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* Rasdaman community is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with rasdaman community. If not, see . +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see +* or contact Peter Baumann via . +*/ + +/************************************************************* + * + * + * PURPOSE: + * Open a db connection to block a server. To additionally keep + * it busy, a request is sent periodically with a configurable + * wait time inbetween. + * Upon a SIGTERM signal, the program gracefully exits, closing + * transaction and database. + * Request is a dummy get type request, it doesn't matter what + * the response is. + * This program is used to test behavior on erroneous API calls + * on multiple servers (ie, parallel behavior - sequential behavior + * is tested in the twin program test_rasgeo-seq.cc). + * + * PARAMETERS: + * -w n wait n millisecs until next request + * -i n identifier for logging + * -r n run n requests, then terminate + * ...plus server, port, db, user, passwd + * + * + * PRECONDITIONS: + * - have a rasdaman server running + * - have at least one 1 rasserver up + * + * COMMENTS: + * - server type controlled via RMANPROTOCOL + * + * BUGS: + * + ************************************************************/ + +using namespace std; + +static const char test_error_par_rcsid[] = "@(#)test_test_error-par,test_error-par.cc: $Id: test_error-par.cc,v 1.2 2005/09/11 08:42:33 rasdev Exp $"; + +// error indicator - should eventually go into a central systemtest include +static const char MSG_OK[] = "ok"; +static const char MSG_FAILED[] = "error"; + +/* +COMPDATE=`date +"%d.%m.%Y %H:%M:%S"` +and -DCOMPDATE="\"$(COMPDATE)\"" when compiling +*/ +#ifndef RMANVERSION +#error "Please specify RMANVERSION variable!" +#endif + +#ifndef COMPDATE +#error "Please specify the COMPDATE variable!" +#endif + + +#ifdef EARLY_TEMPLATE +#define __EXECUTABLE__ +#include "raslib/template_inst.hh" +#endif + +#ifdef __VISUALC__ +#include +#else +#include +#endif + +#include +#include +#include +#include + +#include // for signal() + +#ifdef __VISUALC__ + #define __EXECUTABLE__ +#endif + +#include "rasodmg/transaction.hh" +#include "rasodmg/database.hh" + +#include "rasodmg/ref.hh" +#include "raslib/marraytype.hh" +#include "rasodmg/set.hh" +#include "rasodmg/marray.hh" +#include "rasodmg/iterator.hh" +#include "rasodmg/oqlquery.hh" + +#include "raslib/type.hh" + +#include "raslib/minterval.hh" + +#include "raslib/primitive.hh" +#include "raslib/complex.hh" +#include "raslib/structure.hh" + +#include "raslib/structuretype.hh" +#include "raslib/primitivetype.hh" + +#include "cmlparser.hh" + +#ifdef __VISUALC__ + #undef __EXECUTABLE__ +#endif + +// debug facility; relies on -DDEBUG at compile time +// tell debug that here is the place for the variables (to be done in the main() src file) +#define DEBUG_MAIN +#include "debug-clt.hh" + +const int MAX_STR_LEN = 255; +const int MAX_QUERY_LEN = 10240; + +/// log strings (keep consistent with shell script!) +/// - log string indicating that the server cannot be reached +const char *ERROR_INDICATOR = "ERROR"; +/// - log string indicating that the server cannot be reached +const char *TOUCH_SUCCESS = "SUCCESS"; + +/// program exit codes +#define EXIT_SUCCESS 0 +#define EXIT_USAGE 2 +#define EXIT_FAILURE -1 + +// parameter names, defaults, and help texts + +#define PARAM_HELP_FLAG 'h' +#define PARAM_HELP "help" +#define HELP_HELP "show command line switches" + +#define PARAM_WAIT_FLAG 'w' +#define PARAM_WAIT "wait" +#define HELP_WAIT " wait time between requests [msecs]" +#define DEFAULT_WAIT 1000 +#define DEFAULT_WAIT_STR "1000" + +#define PARAM_ID_FLAG 'i' +#define PARAM_ID "id" +#define HELP_ID " id [integer]" +#define DEFAULT_ID 1 +#define DEFAULT_ID_STR "1" + +#define PARAM_REQU_FLAG 'r' +#define PARAM_REQU "requests" +#define HELP_REQU " number of requests [integer]" +#define DEFAULT_REQU 1 +#define DEFAULT_REQU_STR "1" + +#define PARAM_SERV_FLAG 's' +#define PARAM_SERV "server" +#define HELP_SERV " rasdaman server" +#define DEFAULT_SERV "localhost" + +#define PARAM_PORT_FLAG 'p' +#define PARAM_PORT "port" +#define HELP_PORT "

rasmgr port number" +#define DEFAULT_PORT 7001 +#define DEFAULT_PORT_STR "7001" + +#define PARAM_DB_FLAG 'd' +#define PARAM_DB "database" +#define HELP_DB " name of database" +#define DEFAULT_DB "RASBASE" + +#define PARAM_USER "user" +#define HELP_USER " name of user" +#define DEFAULT_USER "rasguest" + +#define PARAM_PASSWD "passwd" +#define HELP_PASSWD " password of user" +#define DEFAULT_PASSWD "rasguest" + +#define PARAM_DEBUG "debug" +#define HELP_DEBUG "generate diagnostic output" + +// name to be tested in touch() +const char* MDD_TYPE_NAME = "RGBImage"; + +// global variables and default settings +// ------------------------------------- + +bool keepOn = true; // while true: keep in loop; reset by interrupt + +r_Database db; +r_Transaction ta; + +bool dbIsOpen = false; +bool taIsOpen = false; + +unsigned int id = DEFAULT_ID; +unsigned long waitTime = DEFAULT_WAIT; +unsigned int requests = DEFAULT_REQU; + +const char *serverName = DEFAULT_SERV; +r_ULong serverPort = DEFAULT_PORT; +const char *baseName = DEFAULT_DB; + +const char *user = DEFAULT_USER; +const char *passwd = DEFAULT_PASSWD; + +const char *fileName = NULL; +const char *queryString=NULL; + +// query result set. +// we define it here because on empty results the set seems to be corrupt which kills the default destructor +r_Set< r_Ref_Any > result_set; + +// end of globals + +void +parseParams(int argc, char** argv) throw (r_Error) +{ + CommandLineParser &cmlInter = CommandLineParser::getInstance(); + + CommandLineParameter &clp_help = cmlInter.addFlagParameter( PARAM_HELP_FLAG, PARAM_HELP, HELP_HELP ); + + CommandLineParameter &clp_wait = cmlInter.addStringParameter( PARAM_WAIT_FLAG, PARAM_WAIT, HELP_WAIT, DEFAULT_WAIT_STR ); + + CommandLineParameter &clp_id = cmlInter.addStringParameter( PARAM_ID_FLAG, PARAM_ID, HELP_ID, DEFAULT_ID_STR ); + + CommandLineParameter &clp_requ = cmlInter.addStringParameter( PARAM_REQU_FLAG, PARAM_REQU, HELP_REQU, DEFAULT_REQU_STR ); + + CommandLineParameter &clp_server = cmlInter.addStringParameter( PARAM_SERV_FLAG, PARAM_SERV, HELP_SERV, DEFAULT_SERV ); + CommandLineParameter &clp_port = cmlInter.addStringParameter( PARAM_PORT_FLAG, PARAM_PORT, HELP_PORT, DEFAULT_PORT_STR); + CommandLineParameter &clp_database = cmlInter.addStringParameter( PARAM_DB_FLAG, PARAM_DB, HELP_DB, DEFAULT_DB ); + CommandLineParameter &clp_user = cmlInter.addStringParameter(CommandLineParser::noShortName, PARAM_USER, HELP_USER, DEFAULT_USER ); + CommandLineParameter &clp_passwd = cmlInter.addStringParameter(CommandLineParser::noShortName, PARAM_PASSWD, HELP_PASSWD, DEFAULT_PASSWD ); + +#ifdef DEBUG + CommandLineParameter &clp_debug = cmlInter.addFlagParameter( CommandLineParser::noShortName, PARAM_DEBUG, HELP_DEBUG ); +#endif + + try + { + cmlInter.processCommandLine(argc, argv); + + if (cmlInter.isPresent( PARAM_HELP_FLAG )) + { + cout << "usage: " << argv[0] << " [options]" << endl; + cout << "options:" << endl; + cmlInter.printHelp(); + exit( EXIT_USAGE ); + } + + // check mandatory parameters ==================================================== + + // evaluate optional parameter server -------------------------------------- + if (cmlInter.isPresent( PARAM_WAIT )) + waitTime = cmlInter.getValueAsLong( PARAM_WAIT ); + + // check optional parameters ==================================================== + + // evaluate optional parameter id -------------------------------------- + if (cmlInter.isPresent( PARAM_ID )) + id = cmlInter.getValueAsLong( PARAM_ID ); + + // evaluate optional parameter requests -------------------------------------- + if (cmlInter.isPresent( PARAM_REQU )) + requests = cmlInter.getValueAsLong( PARAM_REQU ); + + // evaluate optional parameter server -------------------------------------- + if (cmlInter.isPresent( PARAM_SERV )) + serverName = cmlInter.getValueAsString( PARAM_SERV ); + + // evaluate optional parameter port -------------------------------------- + if (cmlInter.isPresent( PARAM_PORT )) + serverPort = cmlInter.getValueAsLong( PARAM_PORT ); + + // evaluate optional parameter database -------------------------------------- + if (cmlInter.isPresent( PARAM_DB )) + baseName = cmlInter.getValueAsString( PARAM_DB ); + + // evaluate optional parameter user -------------------------------------- + if (cmlInter.isPresent( PARAM_USER )) + user = cmlInter.getValueAsString( PARAM_USER ); + + // evaluate optional parameter passwd -------------------------------------- + if (cmlInter.isPresent( PARAM_PASSWD )) + passwd = cmlInter.getValueAsString( PARAM_PASSWD ); + +#ifdef DEBUG + // evaluate optional parameter MDD type name -------------------------------------- + SET_OUTPUT( cmlInter.isPresent( PARAM_DEBUG ) ); +#endif + + } + catch(CmlException& err) + { + cout << argv[0] << ": " << err.what() << endl; + throw; + } +} // parseParams() + + +void catchInterrupt( int n ) +{ + keepOn = false; +} + +void +openDatabase() throw (r_Error) +{ + ENTER( "openDatabase -- db is " << (dbIsOpen?"":"not ") << "open." ); + + db.set_servername(serverName, serverPort); + db.set_useridentification(user, passwd); + TALK( "database was closed, opening database=" << baseName << ", server=" << serverName << ", port=" << serverPort << ", user=" << user << ", passwd=" << passwd << "." ); + db.open(baseName); + dbIsOpen = true; + + LEAVE( "openDatabase" ); +} // openDatabase() + +void +closeDatabase() throw (r_Error) +{ + ENTER( "closeDatabase -- db is " << (dbIsOpen?"":"not ") << "open." ); + + db.close(); + dbIsOpen = false; + + LEAVE( "closeDatabase" ); + return; +} // closeDatabase() + +void +openTransaction(bool readwrite) throw (r_Error) +{ + ENTER( "openTransaction, readwrite=" << (readwrite?"rw":"ro") << ", ta is " << (taIsOpen?"":"not ") << "open." ); + + if (readwrite) + ta.begin(r_Transaction::read_write); + else + ta.begin(r_Transaction::read_only); + taIsOpen = true; + + LEAVE( "openTransaction" ); +} // openTransaction() + +void +closeTransaction() throw (r_Error) +{ + ENTER( "closeTransaction: aborting ta; ta is " << (taIsOpen?"":"not ") << "open." ); + + ta.abort(); + taIsOpen = false; + + LEAVE( "closeTransaction" ); + return; +} // closeTransaction() + +int +touch() throw (r_Error) +{ + int returnValue = EXIT_SUCCESS; + + ENTER( "touch -- fetching type information for " << MDD_TYPE_NAME << "." ); + + char* typeStructure = NULL; + + // get type structure from database just to touch it + ClientComm *cc = db.getComm(); + if (cc == NULL) + { + cout << "got NULL communication object from db..."; + returnValue = EXIT_FAILURE; + } + else + { + typeStructure = cc->getTypeStructure( MDD_TYPE_NAME, ClientComm::r_MDDType_Type ); + TALK( "type structure is " << typeStructure ); + } + + LEAVE( "touch -> " << returnValue ); + return( returnValue ); +} + +void wait( unsigned long w ) +{ + timeval tv; + tv.tv_sec = w / 1000; + tv.tv_usec = w * 1000; + + select(0,NULL,NULL,NULL,&tv); // wait time +} + + +/* + * main prog: evaluate cmd line, access db. + * returns: + * EXIT_SUCCESS all went fine + * EXIT_HELP help was requested + * EXIT_FAILURE something went wrong + */ +int main(int argc, char** argv) +{ + SET_OUTPUT( true ); + + int retval = EXIT_SUCCESS; // overall result status + + signal( SIGTERM, catchInterrupt ); + + try + { + parseParams( argc, argv ); + + cout << argv[0] << " id=" << id << ", " << requests << " requests..."; + openDatabase(); + openTransaction( false ); + + while (keepOn && requests > 0 && retval == EXIT_SUCCESS) + { + cout << id << ":" << flush; + retval = touch(); + cout << TOUCH_SUCCESS << " " << flush; + wait( waitTime ); + requests--; + } + + closeTransaction(); + closeDatabase(); + } + catch (const r_Error& e) + { + cout << argv[0] << ": " << ERROR_INDICATOR << ": " << e.get_errorno() << ": " << e.what() << endl; + retval = EXIT_FAILURE; + } + catch (...) + { + cerr << argv[0] << ERROR_INDICATOR << ": panic: unexpected internal exception." << endl; + retval = EXIT_FAILURE; + } + + if (retval != EXIT_SUCCESS && (dbIsOpen || taIsOpen) ) + { + closeTransaction(); // abort transaction and close database, ignore any further exceptions + closeDatabase(); + } + + cout << " id=" << id << " done." << endl; + + return retval; +} // main() + +// end of test_error-par.cc + -- cgit