diff options
Diffstat (limited to 'TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp')
-rw-r--r-- | TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp b/TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp new file mode 100644 index 00000000000..03fc838db47 --- /dev/null +++ b/TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp @@ -0,0 +1,174 @@ +/* -*- C++ -*- */ +//============================================================================= +/** + * @file FT_DefaultFaultAnalyzer.cpp + * + * $Id$ + * + * This file is part of TAO's implementation of Fault Tolerant CORBA. + * + * @author Steve Totten <totten_s@ociweb.com> + */ +//============================================================================= + +#include "FT_DefaultFaultAnalyzer.h" +#include "orbsvcs/CosNotifyCommC.h" +#include "orbsvcs/FT_NotifierC.h" +#include "orbsvcs/FT_FaultDetectorFactoryC.h" +#include "orbsvcs/FT_ReplicationManagerC.h" +#include "orbsvcs/FT_ReplicationManager/FT_FaultEventDescriptor.h" +#include "tao/debug.h" +#include "ace/OS_NS_string.h" + +ACE_RCSID (FT_DefaultFaultAnalyzer, + FT_DefaultFaultAnalyzer, + "$Id$") + + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +/// Default constructor. +TAO::FT_DefaultFaultAnalyzer::FT_DefaultFaultAnalyzer () +{ +} + +/// Destructor. +TAO::FT_DefaultFaultAnalyzer::~FT_DefaultFaultAnalyzer () +{ +} + +// Validate the event to make sure it is one we can handle. +// If it is not an event we can handle, this function logs the error +// and returns -1. +int TAO::FT_DefaultFaultAnalyzer::validate_event_type ( + const CosNotification::StructuredEvent & event) +{ + int result = 0; + + // CORBA 3.0.2, section 23.4.5.1 states: + // + // The fault management specification defines one event type: + // ObjectCrashFault. As the name suggests, this event is + // generated by a Fault Detector when it detects that an object + // has crashed. + + // So, the event header's event_type.domain_name must be "FT_CORBA" + // and the event header's event_type.type_name must be "ObjectCrashFault". + // @@ why make string dups just to do a strcmp? + CORBA::String_var domain_name = CORBA::string_dup ( + event.header.fixed_header.event_type.domain_name); + CORBA::String_var type_name = CORBA::string_dup ( + event.header.fixed_header.event_type.type_name); + CORBA::String_var event_name = CORBA::string_dup ( + event.header.fixed_header.event_name); + + if (result == 0) + { + if (ACE_OS::strcmp (domain_name.in(), FT::FT_EVENT_TYPE_DOMAIN) != 0 || + ACE_OS::strcmp (type_name.in(), FT::FT_EVENT_TYPE_NAME) != 0) + { + if (TAO_debug_level > 6) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ( + "TAO::FT_DefaultFaultAnalyzer::validate_event_type: " + "Received invalid event type.\n" + "EventType domain: <%s>\n" + "EventType type: <%s>\n" + "EventName: <%s>\n"), + domain_name.in(), + type_name.in(), + event_name.in() + )); + } + result = -1; + } + } + + // CORBA 3.0.2, section 23.4.5.1 also states: + // + // The filterable_data part of the event body contains the + // identity of the crashed object as four name-value pairs: the + // fault tolerance domain identifier, the member’s location + // identifier, the repository identifier and the object group + // identifier. The Fault Notifier filters events based on the + // domain_name, the type_name, and the four identifiers. All + // other fields of the structured event may be set to null. + // + // The Fault Detector always sets the following fault event + // fields: domain_name, type_name, FTDomainId, and Location. + // + // So, at least "FTDomainId" and "Location" must be present: + if (result == 0) + { + if (event.filterable_data.length () >= 2) + { + // Check for FTDomainId. + if (ACE_OS::strcmp ( + event.filterable_data[0].name.in(), FT::FT_DOMAIN_ID) != 0) + { + if (TAO_debug_level > 6) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ( + "TAO::FT_DefaultFaultAnalyzer::validate_event_type: " + "Received invalid structured event.\n" + "filterable_data[0] must be \"FTDomainId\", not \"%s\"\n"), + event.filterable_data[0].name.in() + )); + } + result = -1; + } + else if (ACE_OS::strcmp ( + event.filterable_data[1].name.in(), FT::FT_LOCATION) != 0) + { + if (TAO_debug_level > 6) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ( + "TAO::FT_DefaultFaultAnalyzer::validate_event_type: " + "Received invalid structured event.\n" + "filterable_data[1] must be \"Location\", not \"%s\"\n"), + event.filterable_data[1].name.in() + )); + } + result = -1; + } + } + else + { + if (TAO_debug_level > 6) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ( + "TAO::FT_DefaultFaultAnalyzer::validate_event_type: " + "Received invalid structured event.\n" + "There must be at least two name/value pairs in " + "the filterable_data field, for \"FTDomainId\" and \"Location\".\n") + )); + } + result = -1; + } + } + + return result; +} + +/// Analyze a fault event. +int TAO::FT_DefaultFaultAnalyzer::analyze_fault_event ( + const CosNotification::StructuredEvent & event) +{ + ACE_UNUSED_ARG (event); + if (TAO_debug_level > 6) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ( + "In TAO::FT_DefaultFaultAnalyzer::analyze_fault_event.\n") + )); + } + + // no-op + return 0; +} + +TAO_END_VERSIONED_NAMESPACE_DECL |