diff options
author | wilson_d <wilson_d@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-11-04 15:57:39 +0000 |
---|---|---|
committer | wilson_d <wilson_d@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-11-04 15:57:39 +0000 |
commit | b6bc9ebee8060e12604c61687cdde3c600a37903 (patch) | |
tree | 2ce33c80dee72ae5382719e0f17c60e9820b0f7e | |
parent | ce30d31756c03764227eb24f6479d578da7cdf78 (diff) | |
download | ATCD-oci_haft_branch.tar.gz |
ChangeLogTag: Tue Nov 4 09:49:20 2003 Dale Wilson <wilson_d@ociweb.com>oci_haft_branch
-rw-r--r-- | TAO/ChangeLog | 69 | ||||
-rw-r--r-- | TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.cpp | 47 | ||||
-rw-r--r-- | TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h | 4 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp | 38 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h | 2 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/PortableGroup.idl | 5 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp | 50 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h | 24 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.cpp | 13 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.h | 3 |
10 files changed, 191 insertions, 64 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog index bc7f2a19796..6ca6bc1fd0d 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,27 +1,52 @@ +Tue Nov 4 09:49:20 2003 Dale Wilson <wilson_d@ociweb.com> + + * orbsvcs/orbsvcs/PortableGroup.idl: + * orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h: + * orbsvcs/FT_ReplicationManager/FT_ReplicationManager.cpp: + * orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h: + * orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp: + * orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h: + * orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp: + Modify the tao_update_object_group method to take an additional + argument: is_primary. This will be true in for the IOGR pushed + to the primary member and false for backup members. + + * orbsvcs/tests/FT_App/FT_TestReplica_i.cpp: + * orbsvcs/tests/FT_App/FT_TestReplica_i.h: + "implement" modified tao_update_object_group method. + Change thrown exception in hopes of triggering transparent + reinvocation (no luck, yet.) + + These changes were made in the oci_haft branch. + + Mon Nov 3 17:29:58 2003 Boris Kolpackov <boris@dre.vanderbilt.edu> - * orbsvcs/examples/FaultTolerance/Makefile: - * orbsvcs/examples/FaultTolerance/RolyPoly/CrashPoint.cpp: - * orbsvcs/examples/FaultTolerance/RolyPoly/CrashPoint.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/Log.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/LogACE_RB_Tree.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/LogStdMap.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/Makefile: - * orbsvcs/examples/FaultTolerance/RolyPoly/ORB_Initializer.cpp: - * orbsvcs/examples/FaultTolerance/RolyPoly/ORB_Initializer.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/README: - * orbsvcs/examples/FaultTolerance/RolyPoly/ReplicaController.cpp: - * orbsvcs/examples/FaultTolerance/RolyPoly/ReplicaController.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/RolyPoly.idl: - * orbsvcs/examples/FaultTolerance/RolyPoly/RolyPoly_i.cpp: - * orbsvcs/examples/FaultTolerance/RolyPoly/RolyPoly_i.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/StateUpdate.h: - * orbsvcs/examples/FaultTolerance/RolyPoly/client.cpp: - * orbsvcs/examples/FaultTolerance/RolyPoly/server.cpp: - - RolyPoly is a simple example that shows how to increase - application reliability by using replication to tolerate - faults. See README for details. + * orbsvcs/examples/FaultTolerance/Makefile: + * orbsvcs/examples/FaultTolerance/RolyPoly/CrashPoint.cpp: + * orbsvcs/examples/FaultTolerance/RolyPoly/CrashPoint.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/Log.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/LogACE_RB_Tree.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/LogStdMap.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/Makefile: + * orbsvcs/examples/FaultTolerance/RolyPoly/ORB_Initializer.cpp: + * orbsvcs/examples/FaultTolerance/RolyPoly/ORB_Initializer.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/README: + * orbsvcs/examples/FaultTolerance/RolyPoly/ReplicaController.cpp: + * orbsvcs/examples/FaultTolerance/RolyPoly/ReplicaController.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/RolyPoly.idl: + * orbsvcs/examples/FaultTolerance/RolyPoly/RolyPoly_i.cpp: + * orbsvcs/examples/FaultTolerance/RolyPoly/RolyPoly_i.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/StateUpdate.h: + * orbsvcs/examples/FaultTolerance/RolyPoly/client.cpp: + * orbsvcs/examples/FaultTolerance/RolyPoly/server.cpp: + + RolyPoly is a simple example that shows how to increase + application reliability by using replication to tolerate + faults. See README for details. + + These changes were made in the oci_haft branch. + Mon Nov 3 16:09:59 2003 Dale Wilson <wilson_d@ociweb.com> diff --git a/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.cpp b/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.cpp index 1dbea34fbb5..c19324b7ac2 100644 --- a/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.cpp +++ b/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.cpp @@ -672,7 +672,7 @@ TAO::FT_ReplicationManager::set_primary_member ( TAO::PG_Object_Group * group; if (this->object_group_map_.find_group (object_group, group)) { -// group->set_primary (member ACE_ENV_ARG_PARAMETER); + group->set_primary_location (the_location ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (CORBA::Object::_nil ()); // Set the new group reference // and distribute it to all members @@ -706,6 +706,48 @@ TAO::FT_ReplicationManager::create_member ( ACE_ENV_ARG_PARAMETER); } +#if 0 // debug code +void TAO::FT_ReplicationManager::dump_membership (TAO_IOP::TAO_IOR_Manipulation_ptr iorm, const char * label, PortableGroup::ObjectGroup_ptr member) const +{ + FT::TagFTGroupTaggedComponent ft_tag_component; + TAO_FT_IOGR_Property prop (ft_tag_component); + if (iorm->is_primary_set(&prop, member)) + { + ACE_DEBUG ((LM_DEBUG, + "%s: PRIMARY member.\n", + label + )); + } + else + { + ACE_DEBUG ((LM_DEBUG, + "%s: backup member.\n", + label + )); + } + + PortableGroup::TagGroupTaggedComponent tag_component; + if (TAO::PG_Utils::get_tagged_component (member, tag_component)) + { + ACE_DEBUG ((LM_DEBUG, + "%s: Group: ." + " version: %u\n", + + label, + tag_component.object_group_ref_version + )); + } + else + { + ACE_DEBUG ((LM_DEBUG, + "%s: No group information found.\n", + label + )); + } +} +#endif // debug code + + PortableGroup::ObjectGroup_ptr TAO::FT_ReplicationManager::add_member ( @@ -762,6 +804,7 @@ TAO::FT_ReplicationManager::add_member ( )); } ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil()); + merged = cleaned; } ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil()); @@ -784,9 +827,11 @@ TAO::FT_ReplicationManager::add_member ( { group->add_member (the_location, member ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (CORBA::Object::_nil ()); + // Set the new group reference // and distribute it to all members group->set_reference (merged, tag_component.object_group_ref_version, 1); + } return merged._retn(); diff --git a/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h b/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h index a3a22be2325..df87fb00e6a 100644 --- a/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h +++ b/TAO/orbsvcs/FT_ReplicationManager/FT_ReplicationManager.h @@ -431,6 +431,10 @@ namespace TAO //@} + //////////////// + // Forbidden methods + FT_ReplicationManager (const FT_ReplicationManager & rhs); + FT_ReplicationManager & operator = (const FT_ReplicationManager & rhs); /////////////// // Data Members diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp index 70cf58ed390..beb006a4ca6 100644 --- a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp +++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp @@ -95,9 +95,6 @@ namespace TAO if (ACE_OS::strcmp (op.in (), PortableGroup::TAO_UPDATE_OBJECT_GROUP_METHOD_NAME) == 0) { - ACE_DEBUG ((LM_DEBUG, - "FT_ServerRequestInterceptor updating IOGR.\n" - )); this->update_iogr (ri ACE_ENV_ARG_PARAMETER); ACE_CHECK; @@ -175,7 +172,7 @@ namespace TAO if (TAO_debug_level > 0) { ACE_DEBUG ((LM_DEBUG, - "Forwarding request to new IOGR [%u | %u] \n", + "TAO-FT (%P|%t) - Forwarding request to new IOGR [%u | %u] \n", ACE_static_cast( unsigned, fgvsc.object_group_ref_version ), ACE_static_cast( unsigned, this->object_group_ref_version_) )); @@ -192,7 +189,7 @@ namespace TAO if (TAO_debug_level > 0) { ACE_DEBUG ((LM_DEBUG, - "Request arrived at backup replica. Throwing TRANSIENT.[%u] \n", + "TAO-FT (%P|%t) - Request arrived at backup replica. Throwing TRANSIENT.[%u] \n", ACE_static_cast( unsigned, this->object_group_ref_version_) )); } @@ -244,35 +241,32 @@ namespace TAO ri->arguments (ACE_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK; - if (param->length () != 2) + if (param->length () != 3) ACE_THROW (CORBA::TRANSIENT ()); const char *str = 0; + this->is_primary_ = 0; // assume we're a backup member - (*param)[0].argument >>= str; - (*param)[1].argument >>= this->object_group_ref_version_; + (*param)[0].argument >>= str; // the stringified IOGR + (*param)[1].argument >>= this->object_group_ref_version_; // the version + (*param)[2].argument >>= CORBA::Any::to_boolean (this->is_primary_);// boolean is_primary - CORBA::String_var obj (str); + if (TAO_debug_level > 0) + { + ACE_DEBUG ((LM_DEBUG, + "TAO-FT (%P|%t) - FT_ServerRequestInterceptor updating IOGR to version %u %s.\n", + ACE_static_cast (unsigned, this->object_group_ref_version_), + (this->is_primary_ ? "Primary" : "Backup") + )); + } + CORBA::String_var obj (str); this->iogr_ = this->orb_->string_to_object (obj.in () ACE_ENV_ARG_PARAMETER); ACE_CHECK; - this->is_primary_ = 1; // assume we're primary -#if 0 // @@ disabled 'cause I don't know "whoami" - CORBA::Boolean primary_set = iorm_->is_primary_set (this->iogr_.in() ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - if (primary_set) - { - CORBA::Object_var primary_obj = iorm_->get_primary (this->iogr_.in() ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - this->is_primary_ = whoami->_is_equivalent (primary_obj.in() ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - } -#endif // 0 - // @@ This exception is a hack to let the RM know that we have // received and updated the IOGR. We will add a special minor code // soon. diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h index 7bf6a37b7c7..3c69275d1ea 100644 --- a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h +++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h @@ -121,7 +121,7 @@ namespace TAO CORBA::ULong object_group_ref_version_; - bool is_primary_; + CORBA::Boolean is_primary_; CORBA::Object_var iogr_; diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup.idl b/TAO/orbsvcs/orbsvcs/PortableGroup.idl index 40546e2eb23..92c0b22a278 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup.idl +++ b/TAO/orbsvcs/orbsvcs/PortableGroup.idl @@ -300,7 +300,10 @@ module PortableGroup * Pseudo used method to update IOGR in Object Group Members * TAO specific. The CORBA spec. doesn't address the issue. */ - void tao_update_object_group (in string iogr, in PortableGroup::ObjectGroupRefVersion version); + void tao_update_object_group ( + in string iogr, + in PortableGroup::ObjectGroupRefVersion version, + in boolean is_primary); }; diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp index e336501de8e..ca84d3fa9ee 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp @@ -22,6 +22,7 @@ TAO::PG_Object_Group::MemberInfo::MemberInfo ( : member_ (CORBA::Object::_duplicate (member)) , location_ (location) , factory_(PortableGroup::GenericFactory::_nil()) + , is_primary_ (0) { } @@ -34,6 +35,7 @@ TAO::PG_Object_Group::MemberInfo::MemberInfo ( , factory_ (PortableGroup::GenericFactory::_duplicate (factory)) , factory_id_ (factory_id) , location_ (location) + , is_primary_ (0) { } @@ -94,10 +96,10 @@ TAO::PG_Object_Group::~PG_Object_Group () } -void dump_ior (const char * base, unsigned long version, const char * iogr) +void dump_ior (const char * base, const char * ext, unsigned long version, const char * iogr) { char filename[1000]; - sprintf(filename, "%s_%lu.iogr", base, version ); + sprintf(filename, "%s_%lu.%s", base, version, ext ); FILE * iorfile = fopen(filename, "w"); fwrite (iogr, 1, strlen(iogr), iorfile); @@ -124,21 +126,29 @@ void TAO::PG_Object_Group::set_reference ( ++it) { MemberInfo const * info = (*it).int_id_; + // + // Unchecked narrow means the member doesn't have to actually implement the TAO_UpdateObjectGroup interface + // PortableGroup::TAO_UpdateObjectGroup_var uog = PortableGroup::TAO_UpdateObjectGroup::_unchecked_narrow ( info->member_); + // but it doesn work: error message at replica is: + // TAO-FT (2996|976) - Wrong version information within the interceptor [1 | 0] + // TAO_Perfect_Hash_OpTable:find for operation 'tao_update_object_group' (length=23) failed + // back to using _narrow PortableGroup::TAO_UpdateObjectGroup_var uog = PortableGroup::TAO_UpdateObjectGroup::_narrow ( info->member_); if (! CORBA::is_nil (uog) ) { ACE_TRY_NEW_ENV { ACE_DEBUG ((LM_DEBUG, - "PG_Object_Group pushing IOGR to member: %s@%s.\n", + "PG (%P|%t) - Object_Group pushing IOGR to %s member: %s@%s.\n", + (info->is_primary_ ? "Primary" : "Backup"), this->role_.c_str(), ACE_static_cast(const char *, info->location_[0].id) )); - dump_ior ("group", this->version_, this->IOGR_); + dump_ior ("group", "iogr", this->version_, this->IOGR_); CORBA::String_var replica_ior = this->orb_->object_to_string(uog.in() ACE_ENV_ARG_PARAMETER); - dump_ior ("replica", n_rep++, replica_ior); + dump_ior (info->location_[0].id, "ior", (this->version_ * 100) + n_rep++, replica_ior); - uog->tao_update_object_group (this->IOGR_, this->version_); + uog->tao_update_object_group (this->IOGR_, this->version_, info->is_primary_); } ACE_CATCHANY { @@ -207,9 +217,33 @@ void TAO::PG_Object_Group::group_specific_factories (PortableGroup::FactoryInfos } -void TAO::PG_Object_Group::set_primary_location (PortableGroup::Location & location) +void TAO::PG_Object_Group::set_primary_location ( + const PortableGroup::Location & location + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((PortableGroup::MemberNotFound)) { - this->primary_location_ = location; + MemberInfo * info; + if (this->members_.find (location, info) == 0) + { + int cleared = 0; + this->primary_location_ = location; + for (MemberMap_Iterator it = this->members_.begin(); + !cleared && it != this->members_.end(); + ++it) + { + cleared = (*it).int_id_->is_primary_; + (*it).int_id_->is_primary_ = 0; + } + info->is_primary_ = 1; + } + else + { + ACE_DEBUG ((LM_DEBUG, + "TAO-PG (%P|%t) - set_primary_location throwing MemberNotFound.\n" + )); + ACE_THROW (PortableGroup::MemberNotFound()) + ACE_CHECK; + } } const PortableGroup::Location & TAO::PG_Object_Group::primary_location() const diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h index 36675657c15..7ea7453869e 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h @@ -66,6 +66,11 @@ namespace TAO /// Location where this member exists PortableGroup::Location location_; + + /// TRUE if this is primary member + CORBA::Boolean is_primary_; + + /////////////// // Methods @@ -150,10 +155,21 @@ namespace TAO */ void group_specific_factories (PortableGroup::FactoryInfos & result) const; - // Note: primary location is a concept from FT CORBA. - // It doesn't hurt other PortableGroup-based services to - // have these two metods and the underlying member. - void set_primary_location (PortableGroup::Location & primary_location_); + /** + * Set the member at "location" to be primary. + * + * Note: primary location is a concept from FT CORBA. + * It doesn't hurt other PortableGroup-based services to + * have these two methods and the underlying members. + */ + void set_primary_location ( + const PortableGroup::Location & location + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((PortableGroup::MemberNotFound)); + + /** + * get location of primary member + */ const PortableGroup::Location & primary_location() const; /** diff --git a/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.cpp b/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.cpp index 4d678f5bfd9..5eccee9f5bb 100644 --- a/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.cpp +++ b/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.cpp @@ -65,11 +65,15 @@ namespace } } +// NO_RESPONSE ->no reinvocation + +#define FAULT_CODE CORBA::TRANSIENT + // Macros to simplify suicide. #define KEVORKIAN(value, method) \ if (this->death_pending_ == (FT_TEST::TestReplica::value)){ \ suicide (#value " in method " #method); \ - ACE_THROW (CORBA::NO_RESPONSE ( \ + ACE_THROW (FAULT_CODE ( \ CORBA::SystemException::_tao_minor_code ( \ TAO_DEFAULT_MINOR_CODE, \ EFAULT), \ @@ -79,7 +83,7 @@ namespace #define KEVORKIAN_DURING(method) \ if (this->death_pending_ == FT_TEST::TestReplica::BEFORE_REPLY ){\ suicide ("read-only method " #method); \ - ACE_THROW (CORBA::NO_RESPONSE ( \ + ACE_THROW (FAULT_CODE ( \ CORBA::SystemException::_tao_minor_code ( \ TAO_DEFAULT_MINOR_CODE, \ EFAULT), \ @@ -108,7 +112,7 @@ FT_TestReplica_i::~FT_TestReplica_i () void FT_TestReplica_i::suicide(const char * note) { - std::cout << name_.c_str() << '@' << this->factory_->location() << '#' << this->factory_id_ << " Simulate fault: " << note << std::endl; + std::cout << name_.c_str() << '@' << this->factory_->location() << '#' << this->factory_id_ << " Simulate FAULT_CODE fault: " << note << std::endl; // Tell the poa we aren't accepting future calls this->poa_->deactivate_object (this->object_id_.in () @@ -294,7 +298,8 @@ void FT_TestReplica_i::set_state (const FT::State & s) void FT_TestReplica_i::tao_update_object_group ( const char * iogr, - PortableGroup::ObjectGroupRefVersion version + PortableGroup::ObjectGroupRefVersion version, + CORBA::Boolean is_primary ACE_ENV_ARG_DECL ) ACE_THROW_SPEC ((CORBA::SystemException)) diff --git a/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.h b/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.h index 84ddcdb7869..06f3b16ca53 100644 --- a/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.h +++ b/TAO/orbsvcs/tests/FT_App/FT_TestReplica_i.h @@ -143,7 +143,8 @@ private: virtual void tao_update_object_group ( const char * iogr, - PortableGroup::ObjectGroupRefVersion version + PortableGroup::ObjectGroupRefVersion version, + CORBA::Boolean is_primary ACE_ENV_ARG_DECL ) ACE_THROW_SPEC ((CORBA::SystemException)); |