summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp')
-rw-r--r--TAO/orbsvcs/FT_ReplicationManager/FT_DefaultFaultAnalyzer.cpp174
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