📄 ft_replicationmanagerfaultanalyzer.cpp
字号:
// We get back a new object group.
if ((result == 0) &&
(fault_event_desc.membership_style == FT::MEMB_INF_CTRL))
{
if (TAO_debug_level > 6)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT (
"TAO::FT_ReplicationManagerFaultAnalyzer::single_replica_failure: "
"Potentially adding new members to "
"ObjectGroup with id <%Q>.\n"),
fault_event_desc.object_group_id
));
}
result = this->add_members (
the_object_group.in(),
fault_event_desc,
new_object_group.out());
the_object_group = new_object_group;
}
#endif
return result;
}
int TAO::FT_ReplicationManagerFaultAnalyzer::remove_failed_member (
PortableGroup::ObjectGroup_ptr iogr,
TAO::FT_FaultEventDescriptor & fault_event_desc,
PortableGroup::ObjectGroup_out new_iogr)
{
int result = 0;
new_iogr = PortableGroup::ObjectGroup::_nil ();
ACE_TRY_NEW_ENV
{
// Remove the old primary member from the object group.
PortableGroup::ObjectGroup_var temp_iogr =
this->replication_manager_->remove_member (
iogr,
fault_event_desc.location.in()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
new_iogr = temp_iogr._retn ();
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (
ACE_ANY_EXCEPTION,
"TAO::FT_ReplicationManagerFaultAnalyzer::remove_failed_member: ");
result = -1;
}
ACE_ENDTRY;
return result;
}
// Choose a new primary member for the ObjectGroup.
// Sets <new_iogr> and returns 0 on success.
// Returns -1 on failure.
int TAO::FT_ReplicationManagerFaultAnalyzer::set_new_primary (
PortableGroup::ObjectGroup_ptr iogr,
TAO::FT_FaultEventDescriptor & fault_event_desc,
PortableGroup::ObjectGroup_out new_iogr)
{
int result = 0;
new_iogr = PortableGroup::ObjectGroup::_nil ();
ACE_TRY_NEW_ENV
{
// Get the locations of the remaining members of the object group.
PortableGroup::Locations_var locations =
this->replication_manager_->locations_of_members (
iogr
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Choose the first location as our new primary location.
if (locations->length() >= 1)
{
new_iogr = this->replication_manager_->set_primary_member (
iogr,
(*locations)[0]
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
else
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT (
"TAO::FT_ReplicationManagerFaultAnalyzer::set_new_primary: "
"No locations remaining in ObjectGroup with id <%Q>.\n"),
fault_event_desc.object_group_id),
-1);
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (
ACE_ANY_EXCEPTION,
"TAO::FT_ReplicationManagerFaultAnalyzer::set_new_primary: ");
result = -1;
}
ACE_ENDTRY;
return result;
}
#if 0 // this is handled by the remove_member method
// While the number of members in the object group is less than
// the MinimumNumberMembers property, add new members.
// Sets <new_iogr> and returns 0 on success.
// Returns -1 on failure.
int TAO::FT_ReplicationManagerFaultAnalyzer::add_members (
PortableGroup::ObjectGroup_ptr iogr,
TAO::FT_FaultEventDescriptor & fault_event_desc,
PortableGroup::ObjectGroup_out new_iogr)
{
int result = 0;
new_iogr = PortableGroup::ObjectGroup::_nil ();
ACE_TRY_NEW_ENV
{
// Get current number of members in object group
// (same as number of locations).
PortableGroup::Locations_var locations =
this->replication_manager_->locations_of_members (
iogr
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::ULong num_members = locations->length();
// If it is less than the MinimumNumberMembers property, add
// new members.
if (num_members < fault_event_desc.minimum_number_members)
{
//@@ To create a member, we need to know the ObjectGroup,
// Location, TypeId, and Criteria.
// Get the factory registry from the Replication Manager.
PortableGroup::Criteria fake_criteria;
PortableGroup::FactoryRegistry_var factory_registry =
this->replication_manager_->get_factory_registry (
fake_criteria ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// @@ DLW SAYS: we need to find out the role played by this object
// group so we can use the correct set of factories.
// Get the list of factories for the type of the failed replica.
CORBA::String_var type_id;
PortableGroup::FactoryInfos_var factories_by_type =
factory_registry->list_factories_by_role (
fault_event_desc.type_id.in(), type_id ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
//
// Build a set of locations of factories for this type that we
// can use to create new members (i.e., at locations where
// members do not currently exist).
//
FT_Location_Set valid_locations;
// For each factory that can be used for this type...
for (CORBA::ULong f=0; f<factories_by_type->length(); ++f)
{
// ...insert its location into valid_locations set.
valid_locations.insert (factories_by_type[f].the_location);
}
// Now remove any locations where members already exist.
for (CORBA::ULong m=0; m<num_members; ++m)
{
if (valid_locations.find (locations[m]))
valid_locations.remove (locations[m]);
}
// The valid_locations set now contains all the factory
// locations we can use to add members to this object group.
// So, now we add new members until we reach
// the value of the MinimumNumberMembers property.
PortableGroup::Location_var good_location;
for (FT_Location_Set::iterator iter (valid_locations);
iter.next (good_location.out()) &&
fault_event_desc.minimum_number_members > num_members;
iter.advance(), ++num_members)
{
// Create a new member of the object group at this location.
new_iogr = this->replication_manager_->create_member (
iogr,
good_location.in(),
fault_event_desc.type_id.in(),
fake_criteria
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Stop adding members when we reach the value of the
// MinimumNumberMembers property.
// if (num_members++ >= fault_event_desc.minimum_number_members)
// break;
}
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (
ACE_ANY_EXCEPTION,
"TAO::FT_ReplicationManagerFaultAnalyzer::add_members: ");
result = -1;
}
ACE_ENDTRY;
return result;
}
#endif // 0
// Handle a location failure.
int TAO::FT_ReplicationManagerFaultAnalyzer::location_failure (
TAO::FT_FaultEventDescriptor & fault_event_desc)
{
int result = 0;
// To handle a location failure, we should:
// - Unregister all the factories at that location.
// (We do this first so that we don't try to create a new replica
// at that location for any of the affected object groups.)
// - Determine all the object groups that had members at that
// location.
// - Handle each one of them as a single replica failure.
ACE_TRY_NEW_ENV
{
// Get the factory registry from the Replication Manager.
PortableGroup::Criteria fake_criteria;
PortableGroup::FactoryRegistry_var factory_registry =
this->replication_manager_->get_factory_registry (
fake_criteria ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Unregister all factories at the failed location.
factory_registry->unregister_factory_by_location (
fault_event_desc.location.in() ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Determine all the object groups that had members at that
// location.
PortableGroup::ObjectGroups_var object_groups_at_location =
this->replication_manager_->groups_at_location (
fault_event_desc.location.in() ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Handle each one of them as a single replica failure.
for (CORBA::ULong i=0;
result==0 && i<object_groups_at_location->length();
++i)
{
// Get the object group id.
fault_event_desc.object_group_id =
this->replication_manager_->get_object_group_id (
object_groups_at_location[i] ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get type id of this object group.
fault_event_desc.type_id =
this->replication_manager_->type_id (
object_groups_at_location[i] ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Handle it as a single replica failure.
result = this->single_replica_failure (fault_event_desc);
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (
ACE_ANY_EXCEPTION,
"TAO::FT_ReplicationManagerFaultAnalyzer::location_failure: ");
result = -1;
}
ACE_ENDTRY;
return result;
}
// Handle a type failure.
int TAO::FT_ReplicationManagerFaultAnalyzer::type_failure (
TAO::FT_FaultEventDescriptor & fault_event_desc)
{
int result = 0;
// To handle a type failure, we should:
// - Unregister the factory at the location of the failure
// that is associated with the failed type.
// (We do this first so that we don't try to create a new replica
// with that factory for any of the affected object groups.)
// - Determine all the object groups that had members at that
// location of that type.
// - Handle each one of them as a single replica failure.
ACE_TRY_NEW_ENV
{
// Get the factory registry from the Replication Manager.
PortableGroup::Criteria fake_criteria;
PortableGroup::FactoryRegistry_var factory_registry =
this->replication_manager_->get_factory_registry (
fake_criteria ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Unregister the factory at the failed location associated with
// the role.
//@@ Using type_id as the role for now.
factory_registry->unregister_factory (
fault_event_desc.type_id.in(),
fault_event_desc.location.in()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get all the object groups that had members at that
// location.
PortableGroup::ObjectGroups_var object_groups_at_location =
this->replication_manager_->groups_at_location (
fault_event_desc.location.in() ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// For each one, if it was of the same type as the failed type,
// handle it as a single replica failure.
for (CORBA::ULong i=0;
result==0 && i<object_groups_at_location->length();
++i)
{
// Get the object group id.
fault_event_desc.object_group_id =
this->replication_manager_->get_object_group_id (
object_groups_at_location[i] ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get type id of this object group.
PortableGroup::TypeId_var type_id =
this->replication_manager_->type_id (
object_groups_at_location[i] ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// If the type id is the same as the failed type id...
if (ACE_OS::strcmp (type_id.in(), fault_event_desc.type_id.in()) == 0)
{
// Handle it as a single replica failure.
result = this->single_replica_failure (fault_event_desc);
}
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (
ACE_ANY_EXCEPTION,
"TAO::FT_ReplicationManagerFaultAnalyzer::type_failure: ");
result = -1;
}
ACE_ENDTRY;
return result;
}
// Template instantiations.
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Unbounded_Set<PortableGroup::Location>;
template class ACE_Unbounded_Set_Iterator<PortableGroup::Location>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Unbounded_Set<PortableGroup::Location>
#pragma instantiate ACE_Unbounded_Set_Iterator<PortableGroup::Location>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -