From f444cb80d8b453adde1495eecedda025382f7ca0 Mon Sep 17 00:00:00 2001 From: huangming Date: Fri, 5 Dec 2003 02:16:39 +0000 Subject: *** empty log message *** --- .../Event_Service/Crash_Injector.cpp | 145 +++++++++++++++++++++ .../Event_Service/Crash_Injector.h | 48 +++++++ .../Event_Service/Crash_Injector_Initializer.cpp | 51 ++++++++ .../Event_Service/Crash_Injector_Initializer.h | 34 +++++ .../Event_Service/Crash_Injector_Interceptor.cpp | 78 +++++++++++ .../Event_Service/Crash_Injector_Interceptor.h | 58 +++++++++ .../Event_Service/FT_EventService.cpp | 93 +++---------- .../Event_Service/FT_EventService.h | 4 +- .../FTRT_Event_Service/Event_Service/svc.conf | 2 + 9 files changed, 436 insertions(+), 77 deletions(-) create mode 100644 TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.cpp create mode 100644 TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.h create mode 100644 TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.cpp create mode 100644 TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.h create mode 100644 TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.cpp create mode 100644 TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.h diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.cpp b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.cpp new file mode 100644 index 00000000000..93d43bb38b8 --- /dev/null +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.cpp @@ -0,0 +1,145 @@ +// $Id$ +#include "Crash_Injector.h" +#include "Crash_Injector_Initializer.h" +#include "ace/Get_Opt.h" + +#ifndef WIN32 +#include +#endif + +extern "C" void crash_handler(int) +{ + ACE_DEBUG((LM_DEBUG, "FTRT_Event_Service crashed\n")); + exit(1); +} + + +namespace { + Crash_Injector* injector; + + const char* types[] = { + "immediate", + "after", + "timeout:" + }; +} + +Crash_Injector::Crash_Injector() +: crash_type_(CRASH_IMMEDIATELY) +, num_of_invocation_(0) +, done_(false) +{ + ACE_Service_Config::static_svcs ()->insert (&ace_svc_desc_Crash_Injector); + + PortableInterceptor::ORBInitializer_var orb_initializer = new Crash_Injector_Initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + injector = this; +} + +Crash_Injector::~Crash_Injector() +{ +} + +Crash_Injector* Crash_Injector::instance() +{ + return injector; +} + + +int Crash_Injector::init (int argc, ACE_TCHAR* argv[] ) +{ + ACE_Get_Opt get_opt(argc, argv, ACE_LIB_TEXT("n::o::t::"), 0, 0, ACE_Get_Opt::PERMUTE_ARGS, 1); + get_opt.long_option(ACE_LIB_TEXT("num_invocation"), 'n', ACE_Get_Opt::ARG_OPTIONAL); + get_opt.long_option(ACE_LIB_TEXT("operation"), 'o', ACE_Get_Opt::ARG_OPTIONAL); + get_opt.long_option(ACE_LIB_TEXT("type"), 't', ACE_Get_Opt::ARG_OPTIONAL); + + int opt; + + while ((opt = get_opt ()) != EOF) + { + switch (opt) { + case 'n': + if (get_opt.opt_arg ()) + crash_after_number_of_invocation_ = ACE_OS::atoi(get_opt.opt_arg ()); + break; + case 'o': + if (get_opt.opt_arg ()) + + operation_ = get_opt.opt_arg (); + break; + case 't': + if (get_opt.opt_arg ()) { + if (ACE_OS::strcasecmp(get_opt.opt_arg (), "immediate") == 0) + crash_type_ = CRASH_IMMEDIATELY; + else if (ACE_OS::strcasecmp(get_opt.opt_arg (), "after_reply") == 0) + crash_type_ = CRASH_AFTER_REPLY; + else if (ACE_OS::strncasecmp("timeout:", get_opt.opt_arg (), 8)==0) + + { + crash_type_ = CRASH_TIMEOUT; + this->time_to_crash_in_ms_ = ACE_OS::atoi(get_opt.opt_arg ()+8); + if (this->time_to_crash_in_ms_ ==0) + ACE_ERROR_RETURN((LM_ERROR, "Crash_Injector : Invalid timeout value\n"), -1); + } + } + break; + default: + return -1; + } + } + return 0; +} + +void Crash_Injector::check_on_receive_request(const char* operation) +{ + if (crash_type_ < CRASH_AFTER_REPLY && ACE_OS::strcmp(operation_.c_str() ,operation) == 0 ) + if (crash_after_number_of_invocation_ == ++num_of_invocation_) + { + switch (crash_type_) { + case CRASH_IMMEDIATELY: + exit(1); + case CRASH_TIMEOUT: + this->crash_timeout(); + } + } +} + +void Crash_Injector::check_on_sending_reply(const char* operation) +{ + if (crash_type_ == CRASH_AFTER_REPLY && ACE_OS::strcmp(operation_.c_str() ,operation) == 0 ) + { + if (crash_after_number_of_invocation_ == ++num_of_invocation_) + done_ = true; + } +} + + + +void Crash_Injector::crash_timeout() +{ +#ifndef WIN32 + if (time_to_crash > 0) { + signal(SIGALRM, &crash_handler); + struct itimerval in, out; + in.it_value.tv_sec = time_to_crash/1000; + in.it_value.tv_usec = (time_to_crash%1000)*1000; + setitimer(ITIMER_REAL, &in, &out); + } + else + exit(1); +#endif + +} + + +ACE_FACTORY_DEFINE (CRASH, Crash_Injector) + + +ACE_STATIC_SVC_DEFINE (Crash_Injector, + ACE_TEXT("Crash_Injector"), + ACE_SVC_OBJ_T, + &ACE_SVC_NAME (Crash_Injector), + ACE_Service_Type::DELETE_THIS + | ACE_Service_Type::DELETE_OBJ, + 0) diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.h b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.h new file mode 100644 index 00000000000..2093f39d861 --- /dev/null +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector.h @@ -0,0 +1,48 @@ +// $Id$ +#ifndef CRASH_INJECTOR_H +#define CRASH_INJECTOR_H +#include "ace/Service_Config.h" + +#include "ace/Service_Object.h" +#include "ace/SString.h" + +#define CRASH_Export +#define CRASH + +class Crash_Injector : public ACE_Service_Object +{ +public: + Crash_Injector(); + ~Crash_Injector(); + + static Crash_Injector* instance(); + + virtual int init (int argc, ACE_TCHAR* []); + + void check_on_receive_request(const char* operation); + void check_on_sending_reply(const char* operation); + + bool work_done() { return done_; } +private: + void crash_timeout(); + + enum CRASH_TYPE { + CRASH_IMMEDIATELY, + CRASH_TIMEOUT, + CRASH_AFTER_REPLY + }; + + CRASH_TYPE crash_type_; + ACE_CString operation_; + int time_to_crash_in_ms_; + int crash_after_number_of_invocation_; + int num_of_invocation_; + bool done_; +}; + + +ACE_STATIC_SVC_DECLARE_EXPORT (CRASH, Crash_Injector) +ACE_STATIC_SVC_REQUIRE(Crash_Injector) +ACE_FACTORY_DECLARE (CRASH, Crash_Injector) + +#endif diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.cpp b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.cpp new file mode 100644 index 00000000000..cb80769cc07 --- /dev/null +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.cpp @@ -0,0 +1,51 @@ +// $Id$ + +#include "Crash_Injector_Initializer.h" +#include "Crash_Injector_Interceptor.h" + +Crash_Injector_Initializer::Crash_Injector_Initializer () +{ +} + +void +Crash_Injector_Initializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr + ACE_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +Crash_Injector_Initializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + + /* + PortableInterceptor::ClientRequestInterceptor_var client_interceptor; + PortableInterceptor::ClientRequestInterceptor_ptr ctmp; + + ACE_NEW_THROW_EX(ctmp, + TAO_Set_Update_Interceptor, + CORBA::NO_MEMORY()); + + client_interceptor = ctmp; + + info->add_client_request_interceptor (client_interceptor.in() + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + */ + + PortableInterceptor::ServerRequestInterceptor_var server_interceptor; + PortableInterceptor::ServerRequestInterceptor_ptr stmp; + + ACE_NEW_THROW_EX(stmp, + Crash_Injector_Interceptor, + CORBA::NO_MEMORY()); + server_interceptor = stmp; + + info->add_server_request_interceptor (server_interceptor.in() + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; +} diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.h b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.h new file mode 100644 index 00000000000..0921bea47b2 --- /dev/null +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Initializer.h @@ -0,0 +1,34 @@ +// $Id$ + + +#ifndef CRASH_INJECTOR_INITIALIZER__H_ +#define CRASH_INJECTOR_INITIALIZER__H_ +#include /**/ "ace/pre.h" + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +class Crash_Injector_Initializer + : public virtual PortableInterceptor::ORBInitializer + , public virtual TAO_Local_RefCounted_Object +{ +public: + Crash_Injector_Initializer (); + + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); +}; + +#include /**/ "ace/post.h" +#endif /* CRASH_INJECTOR_INITIALIZER__H_ */ + + diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.cpp b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.cpp new file mode 100644 index 00000000000..99fb4d05ef3 --- /dev/null +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.cpp @@ -0,0 +1,78 @@ +// $Id$ + +#include "Crash_Injector_Interceptor.h" +#include "Crash_Injector.h" + +Crash_Injector_Interceptor::Crash_Injector_Interceptor () +{ +} + +Crash_Injector_Interceptor::~Crash_Injector_Interceptor () +{ +} + + +char * +Crash_Injector_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) +ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return CORBA::string_dup ("Crash_Injector_Interceptor"); +} + +void +Crash_Injector_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) +ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +Crash_Injector_Interceptor::receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + + +} + + + + +void +Crash_Injector_Interceptor::receive_request (PortableInterceptor::ServerRequestInfo_ptr ri + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + CORBA::String_var operation = ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + Crash_Injector::instance()->check_on_receive_request(operation.in()); +} + +void +Crash_Injector_Interceptor::send_reply (PortableInterceptor::ServerRequestInfo_ptr ri + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + CORBA::String_var operation = ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + Crash_Injector::instance()->check_on_sending_reply(operation.in()); +} + +void +Crash_Injector_Interceptor::send_exception ( + PortableInterceptor::ServerRequestInfo_ptr ri + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ +} + +void +Crash_Injector_Interceptor::send_other (PortableInterceptor::ServerRequestInfo_ptr + ACE_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ +} diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.h b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.h new file mode 100644 index 00000000000..e07db863f2d --- /dev/null +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/Crash_Injector_Interceptor.h @@ -0,0 +1,58 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Crash_Injector_Interceptor.h + * + * $Id$ + * + * @author Huang-Ming Huang + */ +//============================================================================= +#ifndef CRASH_INJECTOR_INTERCEPTOR_H +#define CRASH_INJECTOR_INTERCEPTOR_H +#include "tao/PortableInterceptorC.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +class Crash_Injector_Interceptor : + public PortableInterceptor::ServerRequestInterceptor +{ +public: + Crash_Injector_Interceptor(); + ~Crash_Injector_Interceptor(); + + virtual char * name (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); +}; +#endif diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp index 9d1e3c0b718..277c114122b 100644 --- a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp @@ -14,73 +14,12 @@ #include "orbsvcs/FtRtEvent/Utils/Log.h" #include "orbsvcs/FtRtEvent/Utils/RT_Task.h" #include "orbsvcs/Event/EC_Default_Factory.h" - -#ifndef WIN32 -#include -#endif +#include "Crash_Injector.h" ACE_RCSID (Event_Service, FT_EventService, "$Id$") -static int time_to_crash; - -extern "C" void crash_handler(int) -{ - ACE_DEBUG((LM_DEBUG, "FTRT_Event_Service crashed\n")); - exit(1); -} - -class Fault_Event_Service : public TAO_FTEC_Event_Channel -{ -public: - Fault_Event_Service(CORBA::ORB_var orb, - PortableServer::POA_var poa, - RtecScheduler::Scheduler_var scheduler, - int fault_no); - -private: - virtual void push ( - const FtRtecEventChannelAdmin::ObjectId & oid, - const RtecEventComm::EventSet & data - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, FtRtecEventComm::InvalidObjectID)); - int msg_count_; - int fault_no_; -}; - -Fault_Event_Service::Fault_Event_Service(CORBA::ORB_var orb, - PortableServer::POA_var poa, - RtecScheduler::Scheduler_var scheduler, - int fault_no) -: TAO_FTEC_Event_Channel(orb, poa,scheduler), msg_count_(0), fault_no_(fault_no) -{ -} - -void Fault_Event_Service::push (const FtRtecEventChannelAdmin::ObjectId & oid, - const RtecEventComm::EventSet & data - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, FtRtecEventComm::InvalidObjectID)) -{ - if (fault_no_ == msg_count_++) { -#ifndef WIN32 - if (time_to_crash > 0) { - signal(SIGALRM, &crash_handler); - struct itimerval in, out; - in.it_value.tv_sec = time_to_crash/1000; - in.it_value.tv_usec = (time_to_crash%1000)*1000; - setitimer(ITIMER_REAL, &in, &out); - } - else -#endif - { - ACE_DEBUG((LM_DEBUG, "FTRT_Event_Service crashing on %d-th message\n", msg_count_-1)); - exit(1); - } - } - TAO_FTEC_Event_Channel::push(oid, data ACE_ENV_ARG_PARAMETER); -} - int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) @@ -95,7 +34,6 @@ FT_EventService::FT_EventService() , sched_impl_(0) , membership_(TAO_FTEC_Event_Channel::NONE) , task_(orb_) -, fault_no_(-1) { } @@ -153,8 +91,10 @@ FT_EventService::run(int argc, ACE_TCHAR* argv[]) CosNaming::NamingContext::_narrow (naming_obj.in () ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; - RtecScheduler::Scheduler_var scheduler = - setup_scheduler(naming_context.in() + RtecScheduler::Scheduler_var scheduler = + + setup_scheduler(naming_context.in() + ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN(-1); @@ -165,7 +105,7 @@ FT_EventService::run(int argc, ACE_TCHAR* argv[]) // Activate the Event channel implementation - Fault_Event_Service ec(orb_, root_poa, scheduler, fault_no_); + TAO_FTEC_Event_Channel ec(orb_, root_poa, scheduler); FtRtecEventChannelAdmin::EventChannel_var ec_ior = ec.activate(membership_ @@ -175,7 +115,16 @@ FT_EventService::run(int argc, ACE_TCHAR* argv[]) if (report_factory(orb_.in(), ec_ior.in() )==-1) return -1; - orb_->run(ACE_ENV_SINGLE_ARG_PARAMETER); + Crash_Injector* injector = Crash_Injector::instance(); + + while (injector ==0 || !injector->work_done() ) { + if (orb_->work_pending(ACE_ENV_SINGLE_ARG_PARAMETER)) + + orb_->perform_work(ACE_ENV_SINGLE_ARG_PARAMETER); + } + + orb_->shutdown(0 ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; } ACE_CATCHANY @@ -186,7 +135,7 @@ FT_EventService::run(int argc, ACE_TCHAR* argv[]) ACE_ENDTRY; - ACE_Thread_Manager::instance()->wait(); +// ACE_Thread_Manager::instance()->wait(); return 0; } @@ -207,7 +156,7 @@ FT_EventService::parse_args (int argc, ACE_TCHAR* argv []) } } - ACE_Get_Opt get_opt (argc, argv, ACE_LIB_TEXT("d:f:jprs:t:")); + ACE_Get_Opt get_opt (argc, argv, ACE_LIB_TEXT("d:jprs:")); int opt; while ((opt = get_opt ()) != EOF) @@ -217,9 +166,6 @@ FT_EventService::parse_args (int argc, ACE_TCHAR* argv []) case 'd': TAO_FTRTEC::Log::level(ACE_OS::atoi(get_opt.opt_arg ())); break; - case 'f': - this->fault_no_ = ACE_OS::atoi(get_opt.opt_arg ()); - break; case 'j': this->membership_ = TAO_FTEC_Event_Channel::BACKUP; break; @@ -251,9 +197,6 @@ FT_EventService::parse_args (int argc, ACE_TCHAR* argv []) this->global_scheduler_ = 0; } break; - case 't': - time_to_crash = atoi(get_opt.opt_arg ()); - break; case '?': default: ACE_DEBUG ((LM_DEBUG, diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.h b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.h index 17c1063e019..e23d2b44dc6 100644 --- a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.h +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.h @@ -34,7 +34,8 @@ public: private: int parse_args (int argc, ACE_TCHAR* argv []); - RtecScheduler::Scheduler_var + RtecScheduler::Scheduler_var + setup_scheduler(CosNaming::NamingContext_ptr naming_context ACE_ENV_ARG_DECL); @@ -49,7 +50,6 @@ private: TAO_FTEC_Event_Channel::MEMBERSHIP membership_; CORBA::ORB_var orb_; TP_Task task_; - int fault_no_; }; #endif diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/svc.conf b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/svc.conf index c6542e265a8..3059293d8a0 100644 --- a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/svc.conf +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/svc.conf @@ -20,3 +20,5 @@ static FTRTEC_Replication "$FTEC_REPLICATION_STRATEGY -Threads $FTEC_NUM_THREADS ## for the entire object group. static FTRTEC_Identification "-Name $FTEC_EVENT_SERVICE_NAME -Object_ID $FTEC_OBJECT_ID" + +static Crash_Injector "-type=after_reply -operation=push -num_invocation=4" -- cgit v1.2.1