summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/FT_App/TAO_Object_Group_Creator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/FT_App/TAO_Object_Group_Creator.cpp')
-rw-r--r--TAO/orbsvcs/tests/FT_App/TAO_Object_Group_Creator.cpp264
1 files changed, 179 insertions, 85 deletions
diff --git a/TAO/orbsvcs/tests/FT_App/TAO_Object_Group_Creator.cpp b/TAO/orbsvcs/tests/FT_App/TAO_Object_Group_Creator.cpp
index 2393614cae1..f8af3f0f943 100644
--- a/TAO/orbsvcs/tests/FT_App/TAO_Object_Group_Creator.cpp
+++ b/TAO/orbsvcs/tests/FT_App/TAO_Object_Group_Creator.cpp
@@ -16,6 +16,8 @@
#include <iostream>
#include <fstream>
#include <orbsvcs/PortableGroup/PG_Properties_Encoder.h>
+#include <orbsvcs/FT_FaultDetectorFactoryC.h>
+#include <orbsvcs/PortableGroup/PG_Operators.h>
#include <ace/Get_Opt.h>
@@ -24,7 +26,7 @@ TAO::Object_Group_Creator::Object_Group_Creator ()
: registry_(0)
, replication_manager_(0)
, have_replication_manager_(0)
- , iogr_seq_(0)
+ , detector_infos_ (0)
{
}
@@ -87,22 +89,36 @@ int TAO::Object_Group_Creator::init (CORBA::ORB_var & orb ACE_ENV_ARG_DECL)
ACE_TRY_CHECK;
if (!CORBA::is_nil (this->registry_))
{
- result = 0; // success
+ this->detector_infos_ = this->registry_->list_factories_by_role (FT::FAULT_DETECTOR_ROLE_NAME, this->detector_type_id_.out()
+ ACE_ENV_ARG_PARAMETER)
+ ACE_TRY_CHECK;
+ CORBA::ULong count = this->detector_infos_->length();
+ ACE_DEBUG ((LM_DEBUG,
+ "%T %n (%P|%t)Object_Group_Creator: found %u factories for FaultDetectors\n",
+ ACE_static_cast (unsigned, count)
+ ));
+ result = 0;
}
else
{
- std::cerr << "Creator: ReplicationManager failed to return FactoryRegistry." << std::endl;
+ ACE_ERROR ((LM_ERROR,
+ "%T %n (%P|%t) Object_Group_Creator: ReplicationManager failed to return FactoryRegistry.\n"
+ ));
+ ACE_THROW (CORBA::NO_IMPLEMENT());
}
}
else
{
- std::cerr << "Creator: Can't resolve ReplicationManager, and no factory registry option was given." << std::endl;
+ ACE_ERROR ((LM_ERROR,
+ "%T %n (%P|%t) Object_Group_Creator: resolve_initial_references for ReplicationManager failed.\n"
+ ));
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST());
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
- "Creator: Exception resolving ReplicationManager, and no -f option was given.\n");
+ "Creator: Exception resolving ReplicationManager,\n");
result = 1;
}
@@ -115,32 +131,124 @@ int TAO::Object_Group_Creator::init (CORBA::ORB_var & orb ACE_ENV_ARG_DECL)
int TAO::Object_Group_Creator::unregister_role(const char * role ACE_ENV_ARG_DECL)
{
int result = 0;
- std::cout << std::endl << "Creator: Unregistering all factories for " << role << std::endl;
+ ACE_ERROR ((LM_INFO,
+ "%T %n (%P|%t) Object_Group_Creator: Unregistering all factories for %s\n",
+ role
+ ));
this->registry_->unregister_factory_by_role (role ACE_ENV_ARG_PARAMETER);
- ACE_CHECK;
+ ACE_CHECK_RETURN (-1);
+ return result;
+}
+
+
+
+int TAO::Object_Group_Creator::create_detector_for_replica (
+ CORBA::Object_ptr replica,
+ const char * role,
+ const char * type_id,
+ PortableGroup::ObjectGroupId group_id,
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL)
+{
+ int result = 0;
+
+ CORBA::ULong detector_count = this->detector_infos_->length();
+ for (CORBA::ULong n_detector = 0; result == 0 && n_detector < detector_count; ++n_detector)
+ {
+ PortableGroup::FactoryInfo & info = (*this->detector_infos_)[n_detector];
+ if ( info.the_location == location || n_detector + 1 == detector_count)
+ {
+ TAO_PG::Properties_Encoder encoder;
+
+ PortableGroup::Value value;
+
+/*
+ //////////////////
+ // FaultDetectorFactory gets picky about FaultNotifier's object type.
+ // coddle it.
+ ::FT::FaultNotifier_var notifier = ::FT::FaultNotifier::_narrow(this_obj);
+ value <<= notifier;
+ encoder.add(::FT::FT_NOTIFIER, value);
+*/
+
+ FT::PullMonitorable_ptr monitorable = FT::PullMonitorable::_narrow (replica);
+ value <<= monitorable;
+ encoder.add (::FT::FT_MONITORABLE, value);
+
+ FT::FTDomainId domain_id = 0;
+ value <<= domain_id;
+ encoder.add (::FT::FT_DOMAIN_ID, value);
+
+ value <<= location;
+ encoder.add (::FT::FT_LOCATION, value);
+
+ value <<= type_id;
+ encoder.add (::FT::FT_TYPE_ID, value);
+
+ value <<= group_id;
+ encoder.add (::FT::FT_GROUP_ID, value);
+
+ value <<= CORBA::string_dup (role);
+ encoder.add (PortableGroup::role_criterion, value);
+
+ // allocate and populate the criteria
+ FT::Criteria_var criteria;
+ ACE_NEW_NORETURN (criteria,
+ FT::Criteria);
+ if (criteria.ptr() == 0)
+ {
+ ACE_ERROR((LM_ERROR,
+ "%T %n (%P|%t)Object_Group_Creater: Error cannot allocate criteria.\n"
+ ));
+ result = -1;
+ }
+ else
+ {
+ encoder.encode(criteria);
+ FT::GenericFactory::FactoryCreationId_var factory_creation_id;
+
+ info.the_factory->create_object (
+ type_id,
+ criteria.in(),
+ factory_creation_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = 1;
+ }
+ }
+ }
return result;
}
-int TAO::Object_Group_Creator::create_group(const char * role, int write_iors, int write_iogr ACE_ENV_ARG_DECL)
+CORBA::Object_ptr TAO::Object_Group_Creator::create_group(
+ const char * role,
+ int write_iors
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException ))
{
int result = 0;
+ CORBA::Object_var group;
+ PortableGroup::ObjectGroupId group_id = 0;
CORBA::String_var type_id;
::PortableGroup::FactoryInfos_var infos = this->registry_->list_factories_by_role (role, type_id
ACE_ENV_ARG_PARAMETER)
- ACE_CHECK;
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
CORBA::ULong count = infos->length();
- std::cout << "Creator: found " << count << " factories for "
- << role << "(" << ACE_static_cast(const char *, type_id) << ")"<< std::endl;
+ ACE_ERROR ((LM_INFO,
+ "%T %n (%P|%t): Object_Group_Creator: found %u factories for %s : %s\n",
+ ACE_static_cast (unsigned, count),
+ role,
+ ACE_static_cast(const char *, type_id)
+ ));
if (count > 0)
{
///////////////////////////
// Begin with an empty IOGR
::PortableGroup::GenericFactory::FactoryCreationId_var creation_id;
- CORBA::Object_var group;
- if (write_iogr && this->have_replication_manager_)
+ if (this->have_replication_manager_)
{
PortableGroup::Criteria criteria(1);
criteria.length(1);
@@ -154,43 +262,25 @@ int TAO::Object_Group_Creator::create_group(const char * role, int write_iors, i
creation_id
ACE_ENV_ARG_PARAMETER
);
- ACE_CHECK;
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
+
+ //@@ this is a bit of a hack
+ creation_id >>= group_id;
}
+ const PortableGroup::Location * first_location = 0;
+
for (CORBA::ULong nFact = 0; nFact < count; ++nFact)
{
+ ::PortableGroup::FactoryInfo & info = infos[nFact];
-#define DUMP_EM_ALL
-#ifdef DUMP_EM_ALL
- if (write_iogr && this->have_replication_manager_)
- {
- const char * group_ior = orb_->object_to_string (group ACE_ENV_ARG_PARAMETER );
- char group_ior_filename[200]; // "${role}_$(location)_${factory_id}.ior"
-
- ACE_OS::snprintf(group_ior_filename, sizeof(group_ior_filename)-1, "%s_%lu_%lu.group",
- role,
- this->iogr_seq_,
- ACE_static_cast(unsigned long, nFact));
-
- std::cout << "Creator: Writing ior before factory " << nFact << " to " << group_ior_filename << std::endl;
-
- if (write_ior_file(group_ior_filename, group_ior) != 0)
- {
- std::cerr << "Creator: Error writing ior [" << group_ior << "] to " << group_ior_filename << std::endl;
- }
- }
-#endif //DUMP_EM_ALL
-
- ::PortableGroup::FactoryInfo info = infos[nFact];
- /* struct FactoryInfo {
- GenericFactory the_factory;
- Location the_location;
- Criteria the_criteria;
- };
- */
const char * loc_name = info.the_location[0].id;
- std::cout << "Creator: Creating " << role << " at " << loc_name << std::endl;
+ ACE_ERROR ((LM_INFO,
+ "%T %n (%P|%t) Object_Group_Creator: Creating %s@%s\n",
+ role,
+ loc_name
+ ));
PortableGroup::GenericFactory::FactoryCreationId_var factory_creation_id;
CORBA::Object_var created_obj = info.the_factory->create_object (
@@ -198,11 +288,24 @@ int TAO::Object_Group_Creator::create_group(const char * role, int write_iors, i
info.the_criteria,
factory_creation_id
ACE_ENV_ARG_PARAMETER);
- ACE_CHECK;
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
if ( !CORBA::is_nil(created_obj) )
{
+ if (nFact == 0)
+ {
+ first_location = & info.the_location;
+ }
+ create_detector_for_replica (
+ created_obj,
+ role,
+ type_id.in(),
+ group_id,
+ info.the_location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
+
const char * replica_ior = orb_->object_to_string (created_obj ACE_ENV_ARG_PARAMETER );
- ACE_CHECK;
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
if (write_iors)
@@ -222,7 +325,9 @@ int TAO::Object_Group_Creator::create_group(const char * role, int write_iors, i
}
else
{
- std::cerr << "Can't decypher factory creation id." << std::endl;
+ ACE_ERROR ((LM_ERROR,
+ "%T %n (%P|%t) Object_Group_Creator: Can't decypher factory creation id.\n"
+ ));
// Guessed wrong. Just use default value
}
@@ -234,61 +339,50 @@ int TAO::Object_Group_Creator::create_group(const char * role, int write_iors, i
ACE_static_cast(unsigned long, ulong_id));
replica_ior_filename[sizeof(replica_ior_filename)-1] = '\0';
- std::cout << "Creator: Writing ior for created object to " << replica_ior_filename << std::endl;
+ ACE_ERROR ((LM_INFO,
+ "%T %n (%P|%t) Object_Group_Creator: Writing ior for created object to %s\n",
+ replica_ior_filename
+ ));
if (write_ior_file(replica_ior_filename, replica_ior) != 0)
{
- std::cerr << "Creator: Error writing ior [" << replica_ior << "] to " << replica_ior_filename << std::endl;
+ ACE_ERROR ((LM_ERROR,
+ "%T %n (%P|%t) Object_Group_Creator: Error writing ior [%s] to %s\n",
+ replica_ior,
+ replica_ior_filename
+ ));
}
}
- if (write_iogr && this->have_replication_manager_)
- {
- group = this->replication_manager_->add_member (group,
- info.the_location,
- created_obj
- ACE_ENV_ARG_PARAMETER);
- ACE_CHECK;
-#if 0 // DEBUG_DISABLE
- if (nFact == 0)
- {
- group = this->replication_manager_->set_primary_member(group, info.the_location
- ACE_ENV_ARG_PARAMETER);
- }
-#endif// DEBUG_DISABLE
- }
+ group = this->replication_manager_->add_member (group,
+ info.the_location,
+ created_obj
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
}
else
{
- std::cerr << "Creator: create_object returned nil????" << std::endl;
+ ACE_ERROR ((LM_ERROR,
+ "%T %n (%P|%t) Object_Group_Creator: create_object returned nil????\n"
+ ));
}
}
- std::cout << "Creator: Successfully created group of " << role << std::endl;
-
- if(write_iogr && have_replication_manager_)
+ if (first_location != 0)
{
- const char * group_iogr = orb_->object_to_string (group ACE_ENV_ARG_PARAMETER );
- ACE_CHECK;
- char group_ior_filename[200];
-
- ACE_OS::snprintf(group_ior_filename, sizeof(group_ior_filename)-1, "%s_%lu.iogr",
- role,
- this->iogr_seq_);
- group_ior_filename[sizeof(group_ior_filename)-1] = '\0';
-
- std::cout << "Creator: Writing ior for created object group to " << group_ior_filename << std::endl;
-
- if (write_ior_file(group_ior_filename, group_iogr) != 0)
- {
- std::cerr << "Creator: Error writing ior [" << group_iogr << "] to " << group_ior_filename << std::endl;
- }
- this->iogr_seq_ += 1;
+ group = this->replication_manager_->set_primary_member (group.in(), * first_location ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
}
+ ACE_ERROR ((LM_INFO,
+ "%T %n (%P|%t) Object_Group_Creator: Successfully created group of %s\n",
+ role
+ ));
+ const char * group_iogr = orb_->object_to_string (group ACE_ENV_ARG_PARAMETER );
+ ACE_CHECK_RETURN (CORBA::Object::_nil());
}
- return result;
+ return group._retn();
}
@@ -310,7 +404,7 @@ int TAO::Object_Group_Creator::write_ior_file(const char * outputFile, const cha
else
{
ACE_ERROR ((LM_ERROR,
- "Open failed for %s\n", outputFile
+ "%T %n (%P|%t) Object_Group_Creator: Open failed for %s\n", outputFile
));
}
return result;