summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h')
-rw-r--r--TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h527
1 files changed, 527 insertions, 0 deletions
diff --git a/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h b/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h
new file mode 100644
index 00000000000..a38ed1ec911
--- /dev/null
+++ b/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h
@@ -0,0 +1,527 @@
+/* -*- C++ -*- */
+//=============================================================================
+/**
+ * @file FT_ReplicationManager.h
+ *
+ * $Id$
+ *
+ * This file is part of Fault Tolerant CORBA.
+ *
+ * @author Curt Hibbs <hibbs_c@ociweb.com>
+ */
+//=============================================================================
+
+
+#ifndef FT_REPLICATION_MANAGER_H_
+#define FT_REPLICATION_MANAGER_H_
+
+#include /**/ "ace/pre.h"
+#include <ace/ACE.h>
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include <orbsvcs/FT_ReplicationManagerS.h>
+//#include <orbsvcs/PortableGroup/PG_PropertyManager.h>
+//#include <orbsvcs/PortableGroup/PG_GenericFactory.h>
+//#include <orbsvcs/PortableGroup/PG_ObjectGroupManager.h>
+// Note: the new, improved versions...
+//#include <orbsvcs/PortableGroup/PG_Object_Group_Map.h>
+#include <orbsvcs/PortableGroup/PG_Properties_Support.h>
+#include <orbsvcs/PortableGroup/PG_Group_Factory.h>
+
+#include <orbsvcs/PortableGroup/PG_FactoryRegistry.h>
+#include <orbsvcs/FT_ReplicationManager/FT_FaultConsumer.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /**
+ * Implement the ReplicationManager interfaces.
+ *
+ * The ReplicationManager does most of its work by delegating to
+ * support objects. These include:
+ *
+ * TAO::PG_Group_Factory group_factory_;
+ * The group factory contains a collection of TAO::PG_Object_Groups
+ * It provides methods to create new groups, destroy old groups and
+ * find existing groups.
+ *
+ * TAO::PG_Object_Group
+ * These objects which can be found through the group factory provde
+ * methods to create and add group members, remove and delete group
+ * members and set group properties.
+ *
+ * TAO::PG_Properties_Support properties_support_;
+ * This object maintains sets of properties(TAO::PG_Property_Set).
+ * In particular it has one default property set, and a collection of
+ * property sets indexed by type_id.
+ * The default property set acts as a parent to the type_id property
+ * sets and the type_id property sets act as parents to the property
+ * sets contained in PG_Object_Group.
+ *
+ * FT::FaultNotifier_var fault_notifier_;
+ * This notification channel is "the" source of fault notifications.
+ *
+ * TAO::FT_FaultConsumer fault_consumer_;
+ * This object subscribes to the fault_notifier_as a fault consumer. It
+ * analyzes incoming fault notifications and calls appropriate ReplicationManager
+ * methods to respond to the fault.
+ *
+ * TAO::PG_FactoryRegistry factory_registry_;
+ * This object maintains a collection of factory registrations. When a factory
+ * is started it registeres itself with the ReplicationManager (delegated to this
+ * object). When a member needs to be created in an object group this factory
+ * registry is queried to find factories that can create the member.
+ */
+ class FT_ReplicationManager
+ : public virtual POA_FT::ReplicationManager
+ {
+
+ //////////////////////
+ // non-CORBA interface
+
+ public:
+ /**
+ * Default constructor.
+ * Call init after constructing the object to prepare it for use.
+ */
+ FT_ReplicationManager ();
+
+ /**
+ * Destructor.
+ * Actual cleanup happens in the fini function.
+ */
+ virtual ~FT_ReplicationManager ();
+
+ public:
+
+ /**
+ * Parse command line arguments.
+ * @param argc traditional C argc
+ * @param argv traditional C argv
+ * @return zero for success; nonzero is process return code for failure.
+ */
+ int parse_args (int argc, char * argv[]);
+
+ /**
+ * Initialize this object.
+ * @param orb Our CORBA::ORB -- we keep var to it.
+ * @return zero for success; nonzero is process return code for failure.
+ */
+ int init (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL);
+
+ /**
+ * Prepare to exit.
+ * @return zero for success; nonzero is process return code for failure.
+ */
+ int fini (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Idle-time activity.
+ *
+ * @param result is set to process return code if return value is non-zero.
+ * @return zero to continue; nonzero to exit
+ */
+ int idle (int & result ACE_ENV_ARG_DECL);
+
+
+ /**
+ * Identify this fault detector factory.
+ * @return a string to identify this object for logging/console message purposes.
+ */
+ const char * identity () const;
+
+ /**
+ * Get the type_id associated with an object group.
+ * @param object_group The ObjectGroup.
+ * @return String identifying the type id associated with the ObjectGroup.
+ */
+ char * type_id (PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL);
+
+
+ //////////////////////
+ // CORBA interface(s)
+
+ public:
+
+ /**
+ * @name POA_FT::ReplicationManager Methods
+ *
+ * Methods required by the POA_FT::ReplicationManager interface.
+ */
+ //@{
+
+ /// Registers the Fault Notifier with the Replication Manager.
+ virtual void register_fault_notifier (
+ FT::FaultNotifier_ptr fault_notifier
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Returns the reference of the Fault Notifier.
+ virtual FT::FaultNotifier_ptr get_fault_notifier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , FT::InterfaceNotFound
+ ));
+
+ /// TAO-specific find factory registry
+ virtual ::PortableGroup::FactoryRegistry_ptr get_factory_registry (
+ const PortableGroup::Criteria & selection_criteria
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// TAO-specific shutdown operation.
+ virtual void shutdown (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ //@}
+
+ /**
+ * @name PortableGroup::PropertyManager Methods
+ *
+ * Methods required by the PortableGroup::PropertyManager interface.
+ */
+ //@{
+
+ /// Set the default properties to be used by all object groups.
+ virtual void set_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /// Get the default properties used by all object groups.
+ virtual PortableGroup::Properties * get_default_properties (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Remove default properties.
+ virtual void remove_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Set properties associated with a given Replica type. These
+ * properties override the default properties on a name-by-name basis.
+ */
+ virtual void set_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Return the properties associated with a given Replica type. These
+ * properties include the type-specific properties in use, in
+ * addition to the default properties that were not overridden.
+ */
+ virtual PortableGroup::Properties * get_type_properties (
+ const char * type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Remove the given properties associated with the Replica type ID.
+ virtual void remove_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Dynamically set the properties associated with a given object
+ * group as the replication manager and replicas are being executed.
+ * These properties override the type-specific and default
+ * properties.
+ */
+ virtual void set_properties_dynamically (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Return the properties currently in use by the given object
+ * group. These properties include those that were set dynamically,
+ * type-specific properties that weren't overridden, properties that
+ * were used when the Replica was created, and default properties
+ * that weren't overridden.
+ */
+ virtual PortableGroup::Properties * get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ //@}
+
+ /**
+ * @name FT::FTObjectGroupManager methods
+ *
+ * Methods required by the FT::FTObjectGroupManager
+ * interface.
+ */
+ //@{
+
+ /// Create a member in an object group.
+ virtual PortableGroup::ObjectGroup_ptr create_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria));
+
+ /// Add an existing object to the ObjectGroup.
+ virtual PortableGroup::ObjectGroup_ptr add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded));
+
+ /**
+ * Remove the member at a specific location from an
+ * ObjectGroup. Application created objects must be
+ * deleted by the application. Objects created by the
+ * infrastructure (replication manager) will be deleted by the
+ * infrastructure.
+ * For infrastructure-controlled membership: After the member
+ * is removed from the group the minumum number of members
+ * parameter will be checked and new members will be created
+ * as necessary (if possible.)
+ */
+ virtual PortableGroup::ObjectGroup_ptr remove_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::Locations * locations_of_members (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::ObjectGroups * groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the ObjectGroupId for the given ObjectGroup.
+ virtual PortableGroup::ObjectGroupId get_object_group_id (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /**
+ * Return an update the IOGR for an object group. If no changes have
+ * been made in the group the return value will be the same as the object_group
+ * parameter.
+ */
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /**
+ * TAO-specific extension.
+ * Return the ObjectGroup reference for the given ObjectGroupId.
+ */
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref_from_id (
+ PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::ObjectGroupNotFound
+ ));
+
+ /**
+ * Return the reference corresponding to the Replica of a given
+ * ObjectGroup at the given location.
+ */
+ virtual CORBA::Object_ptr get_member_ref (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & loc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ /// Sets the primary member of a group.
+ virtual PortableGroup::ObjectGroup_ptr set_primary_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::ObjectGroupNotFound
+ , PortableGroup::MemberNotFound
+ , FT::PrimaryNotSet
+ , FT::BadReplicationStyle
+ ));
+
+ //@}
+
+ /**
+ * @name PortableGroup::GenericFactory methods
+ *
+ * Methods required by the PortableGroup::GenericFactory interface.
+ */
+ //@{
+
+ /**
+ * Create an object of the specified type that adheres to the
+ * restrictions defined by the provided Criteria. The out
+ * FactoryCreationId parameter may be passed to the delete_object()
+ * method to delete the object.
+ *
+ * Infrastructure controlled membership: The initial number of members
+ * property will be honored by creating new members and adding them to
+ * the group.
+ */
+ virtual CORBA::Object_ptr create_object (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ PortableGroup::GenericFactory::FactoryCreationId_out
+ factory_creation_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria));
+
+ /**
+ * Delete the object group corresponding to the provided
+ * FactoryCreationId. For infratructure-controlled membership
+ * all members will be deleted. For application-controlled membership
+ * the application is responsible for deleting group members.
+ */
+ virtual void delete_object (
+ const PortableGroup::GenericFactory::FactoryCreationId &
+ factory_creation_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound));
+
+ //@}
+
+ /////////////////////////
+ // Implementation methods
+ private:
+ /**
+ * Write this factory's IOR to a file
+ */
+ int write_ior (void);
+
+ /// Registers the Fault Notifier with the Replication Manager.
+ void register_fault_notifier_i (
+ FT::FaultNotifier_ptr fault_notifier
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ ////////////////
+ // Forbidden methods
+ FT_ReplicationManager (const FT_ReplicationManager & rhs);
+ FT_ReplicationManager & operator = (const FT_ReplicationManager & rhs);
+
+ ///////////////
+ // Data Members
+ private:
+
+ /// The orb
+ CORBA::ORB_var orb_;
+
+ /// The POA.
+ PortableServer::POA_var poa_;
+
+ /// A file to which the factory's IOR should be written.
+ const char * ior_output_file_;
+
+ /// A name to be used to register the factory with the name service.
+ const char * ns_name_;
+ CosNaming::NamingContext_var naming_context_;
+ CosNaming::Name this_name_;
+
+ /// Our object reference.
+ FT::ReplicationManager_var replication_manager_ref_;
+
+ /// A human-readable string to identify this Replication Manager.
+ ACE_CString identity_;
+
+ /// an object that manages a collection of object groups
+ TAO::PG_Group_Factory group_factory_;
+
+ /// an object that manages default and type_id related properties
+ TAO::PG_Properties_Support properties_support_;
+
+ /// The fault notifier.
+ FT::FaultNotifier_var fault_notifier_;
+ /// set by command line -f option
+ const char * fault_notifier_ior_string_;
+
+ /// The fault consumer.
+ TAO::FT_FaultConsumer fault_consumer_;
+
+ /// The factory registry
+ TAO::PG_FactoryRegistry factory_registry_;
+
+ /// Quit flag.
+ int quit_;
+ };
+
+} // namespace TAO
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* FT_REPLICATION_MANAGER_H_ */