diff options
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.cpp | 264 |
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; |