void TAO::PG_Object_Group::create_members (size_t count) { // assume internals is locked // @@ what if factories were passed as criteria? CORBA::String_var factory_type; PortableGroup::FactoryInfos_var factories = this->factory_registry_->list_factories_by_role ( role_.c_str(), factory_type.out ()); CORBA::ULong factory_count = factories->length (); if (factory_count > 0) { CORBA::ULong factory_pos = 0; while (members_.current_size () < count && factory_pos < factory_count) { const PortableGroup::FactoryInfo & factory_info = (*factories)[factory_pos]; const PortableGroup::Location & factory_location = factory_info.the_location; if (0 != this->members_.find (factory_location)) { /////////////////////////////////////////// // If a factory refuses to create a replica // it's not fatal. try { PortableGroup::GenericFactory::FactoryCreationId_var fcid; CORBA::Object_var member = factory_info.the_factory->create_object ( this->type_id_.in (), factory_info.the_criteria, fcid. out()); // convert the new member to a stringified IOR to avoid // contamination with group info CORBA::String_var member_ior_string = orb_->object_to_string (member.in ()); PortableGroup::ObjectGroup_var new_reference = this->add_member_to_iogr (member.in ()); // Convert new member back to a (non group) ior. CORBA::Object_var member_ior = this->orb_->string_to_object (member_ior_string.in ()); MemberInfo * info = 0; ACE_NEW_THROW_EX (info, MemberInfo( member_ior.in(), factory_location, factory_info.the_factory, fcid.in ()), CORBA::NO_MEMORY()); if (this->members_.bind (factory_location, info) != 0) { throw CORBA::NO_MEMORY(); } this->reference_ = new_reference; // note var-to-var assignment does // a duplicate } catch (const CORBA::Exception&) { // log, but otherwise ignore the errorf if (TAO_debug_level > 0) { ORBSVCS_ERROR ((LM_ERROR, ACE_TEXT ("PG (%P|%t) Replica Factory ") ACE_TEXT ("@ %s refused create_object ") ACE_TEXT ("request for type %s\n"), static_cast<const char *> (factory_info.the_location[0].id), static_cast<const char *> (this->type_id_.in ()) )); } } } } if (this->increment_version ()) { this->distribute_iogr (); } } else { throw PortableGroup::NoFactory(); } }
CORBA::Object_ptr join_object_group (CORBA::ORB_ptr orb, CosLoadBalancing::LoadManager_ptr lm, const PortableGroup::Location & location) { CORBA::Object_var ns_object = orb->resolve_initial_references ("NameService"); CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow (ns_object.in ()); CosNaming::Name name (1); name.length (1); name[0].id = "RoundtripObjectGroup"; name[0].kind = "Object Group"; CORBA::Object_var group; try { group = nc->resolve (name); } catch (const CosNaming::NamingContext::NotFound& ) { // Object group not created. Create one. const char repository_id[] = "IDL:Test/Roundtrip:1.0"; PortableGroup::Criteria criteria (1); criteria.length (1); PortableGroup::Property & property = criteria[0]; property.nam.length (1); property.nam[0].id = CORBA::string_dup ("org.omg.PortableGroup.MembershipStyle"); PortableGroup::MembershipStyleValue msv = PortableGroup::MEMB_APP_CTRL; property.val <<= msv; PortableGroup::GenericFactory::FactoryCreationId_var fcid; group = lm->create_object (repository_id, criteria, fcid.out ()); try { nc->bind (name, group.in ()); PortableGroup::Properties props (1); props.length (1); props[0].nam.length (1); props[0].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.StrategyInfo"); CosLoadBalancing::StrategyInfo strategy_info; strategy_info.name = CORBA::string_dup (strategy); if (ACE_OS::strcasecmp (strategy, "LeastLoaded") == 0 && (reject_threshold != 0 || critical_threshold != 0 || dampening != 0)) { CORBA::ULong len = 1; PortableGroup::Properties & props = strategy_info.props; if (reject_threshold != 0) { const CORBA::ULong i = len - 1; props.length (len++); props[i].nam.length (1); props[i].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.Strategy.LeastLoaded.RejectThreshold"); props[i].val <<= reject_threshold; } if (critical_threshold != 0) { const CORBA::ULong i = len - 1; props.length (len++); props[i].nam.length (1); props[i].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.Strategy.LeastLoaded.CriticalThreshold"); props[i].val <<= critical_threshold; } if (dampening != 0) { const CORBA::ULong i = len - 1; props.length (len++); props[i].nam.length (1); props[i].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.Strategy.LeastLoaded.Dampening"); props[i].val <<= dampening; } } props[0].val <<= strategy_info; lm->set_default_properties (props); } catch (const CosNaming::NamingContext::AlreadyBound& ) { // Somebody beat us to creating the object group. Clean up // the one we created. lm->delete_object (fcid.in ()); group = nc->resolve (name); } } Roundtrip * roundtrip_impl; ACE_NEW_THROW_EX (roundtrip_impl, Roundtrip (orb), CORBA::NO_MEMORY ()); PortableServer::ServantBase_var owner_transfer (roundtrip_impl); Test::Roundtrip_var roundtrip = roundtrip_impl->_this (); group = lm->add_member (group.in (), location, roundtrip.in ()); return group._retn (); }
void TAO::PG_Object_Group::create_member ( const PortableGroup::Location & the_location, const char * type_id, const PortableGroup::Criteria & the_criteria) { ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_); if (0 != this->members_.find (the_location)) { // @@ what if factories were passed as criteria? CORBA::String_var factory_type; PortableGroup::FactoryInfos_var factories = this->factory_registry_->list_factories_by_role ( role_.c_str(), factory_type.out ()); // @@ what if factory_type != type_id != this->type_id_ int created = 0; // bool CORBA::ULong factory_count = factories->length (); for (CORBA::ULong factory_pos = 0; ! created && factory_pos < factory_count; ++factory_pos) { const PortableGroup::FactoryInfo & factory_info = (*factories)[factory_pos]; if (factory_info.the_location == the_location) { // @@ should we merge the_criteria with // factory_info.the_criteria? PortableGroup::GenericFactory::FactoryCreationId_var fcid; CORBA::Object_var member = factory_info.the_factory->create_object ( type_id, the_criteria, fcid. out()); // convert the new member to a stringified IOR to avoid // contamination with group info CORBA::String_var member_ior_string = orb_->object_to_string (member.in ()); PortableGroup::ObjectGroup_var new_reference = this->add_member_to_iogr (member.in ()); // Convert new member back to a (non group) ior. CORBA::Object_var member_ior = this->orb_->string_to_object (member_ior_string.in ()); MemberInfo * info = 0; ACE_NEW_THROW_EX (info, MemberInfo( member_ior.in(), the_location, factory_info.the_factory, fcid.in ()), CORBA::NO_MEMORY()); if (this->members_.bind (the_location, info) != 0) { throw CORBA::NO_MEMORY(); } this->reference_ = new_reference; // note var-to-var // assignment does a // duplicate if (this->increment_version ()) { this->distribute_iogr (); } created = 1; } } if (! created) { throw PortableGroup::NoFactory (); } } else { throw PortableGroup::MemberAlreadyPresent (); } }
CORBA::Boolean TAO_LB_ObjectReferenceFactory::find_object_group ( const char * repository_id, CORBA::ULong & index, PortableGroup::ObjectGroup_out object_group) { if (!this->load_managed_object (repository_id, index)) return false; PortableGroup::ObjectGroup_var group; if (this->table_.find (repository_id, group) != 0) { if (ACE_OS::strcasecmp (this->object_groups_[index], "CREATE") == 0) { PortableGroup::Criteria criteria (1); criteria.length (1); PortableGroup::Property & property = criteria[0]; property.nam.length (1); property.nam[0].id = CORBA::string_dup ("org.omg.PortableGroup.MembershipStyle"); // Configure for application-controlled membership. PortableGroup::MembershipStyleValue msv = PortableGroup::MEMB_APP_CTRL; property.val <<= msv; PortableGroup::GenericFactory::FactoryCreationId_var fcid; group = this->lm_->create_object (repository_id, criteria, fcid.out ()); CORBA::ULong const len = this->fcids_.size (); this->fcids_.size (len + 1); // Incremental growth. Yuck! this->fcids_[len] = fcid; } else { group = this->orb_->string_to_object (this->object_groups_[index]); } if (this->table_.bind (repository_id, group) != 0) { if (TAO_debug_level > 0) ORBSVCS_ERROR ((LM_ERROR, "TAO_LB_ObjectReferenceFactory::" "find_object_group - " "Couldn't bind object group reference.\n")); throw CORBA::INTERNAL (); } object_group = group._retn (); } return 1; }