diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp | 325 |
1 files changed, 0 insertions, 325 deletions
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp deleted file mode 100644 index 88dedebea60..00000000000 --- a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// $Id$ - -#include "orbsvcs/FaultTolerance/FT_Service_Callbacks.h" -#include "orbsvcs/FaultTolerance/FT_ClientPolicy_i.h" - -#include "ace/OS_NS_sys_time.h" - -#include "tao/MProfile.h" -#include "tao/Profile.h" -#include "tao/Tagged_Components.h" -#include "tao/Stub.h" -#include "tao/Invocation_Utils.h" -#include "tao/ORB_Core.h" -#include "tao/Client_Strategy_Factory.h" -#include "tao/CDR.h" - -ACE_RCSID (FaultTolerance, - FT_Service_Callbacks, - "$Id$") - - -TAO_BEGIN_VERSIONED_NAMESPACE_DECL - -TAO_FT_Service_Callbacks::TAO_FT_Service_Callbacks ( - TAO_ORB_Core *orb_core) - - : orb_core_ (orb_core), - profile_lock_ (0) -{ - this->profile_lock_ = - this->orb_core_->client_factory ()->create_profile_lock (); -} - -TAO_FT_Service_Callbacks::~TAO_FT_Service_Callbacks (void) -{ - // Delete the memeory for the lock - delete this->profile_lock_; -} - -CORBA::Boolean -TAO_FT_Service_Callbacks::object_is_nil (CORBA::Object_ptr obj) -{ - // Get the count - CORBA::ULong count = - obj->_stubobj ()->base_profiles ().profile_count (); - - // If the profile count is zero then return true - if (count == 0) - return 1; - else - { - // else if each of the profile is nil - for (CORBA::ULong cnt = 0; - cnt < count; - cnt++) - { - TAO_Profile *pfile = - obj->_stubobj ()->base_profiles ().get_profile (cnt); - - if (pfile != 0) - return 0; - } - } - - // If it reaches here then it should be nill - return 1; - -} - -TAO_Service_Callbacks::Profile_Equivalence -TAO_FT_Service_Callbacks::is_profile_equivalent (const TAO_Profile *this_p, - const TAO_Profile *that_p) -{ - const TAO_Tagged_Components &this_comp = - this_p->tagged_components (); - - const TAO_Tagged_Components &that_comp = - that_p->tagged_components (); - - IOP::TaggedComponent this_tc, that_tc; - this_tc.tag = that_tc.tag = IOP::TAG_FT_GROUP; - - if (this_comp.get_component (this_tc) == 1) - { - if (that_comp.get_component (that_tc) == 1) - { - TAO_InputCDR this_cdr (reinterpret_cast<const char*> (this_tc.component_data.get_buffer ()), - this_tc.component_data.length ()); - - TAO_InputCDR that_cdr (reinterpret_cast<const char*> (that_tc.component_data.get_buffer ()), - that_tc.component_data.length ()); - - CORBA::Boolean this_byte_order; - CORBA::Boolean that_byte_order; - - if (this_cdr >> ACE_InputCDR::to_boolean (this_byte_order) == 0 || - that_cdr >> ACE_InputCDR::to_boolean (that_byte_order) == 0) - { - // Have tags but full of garbage - not equivalent - return TAO_Service_Callbacks::NOT_EQUIVALENT; - } - - this_cdr.reset_byte_order (static_cast<int> (this_byte_order)); - that_cdr.reset_byte_order (static_cast<int> (that_byte_order)); - - - FT::TagFTGroupTaggedComponent this_group_component; - FT::TagFTGroupTaggedComponent that_group_component; - - this_cdr >> this_group_component; - that_cdr >> that_group_component; - - // check if domain id and group id are the same - if ((ACE_OS::strcmp (this_group_component.group_domain_id, - that_group_component.group_domain_id) == 0) && - (this_group_component.object_group_id == - that_group_component.object_group_id)) - { - // Both have matching tags - true - return TAO_Service_Callbacks::EQUIVALENT; - } - } - - return TAO_Service_Callbacks::NOT_EQUIVALENT; - } - else - { - if (that_comp.get_component (that_tc) == 1) - { - return TAO_Service_Callbacks::NOT_EQUIVALENT; - } - } - - return TAO_Service_Callbacks::DONT_KNOW; -} - -CORBA::ULong -TAO_FT_Service_Callbacks::hash_ft (TAO_Profile *p, - CORBA::ULong max) -{ - // At this point we assume that all the checks for other things - // within the profiles have been satisfied - TAO_Tagged_Components &this_comp = - p->tagged_components (); - - IOP::TaggedComponent tc; - tc.tag = IOP::TAG_FT_GROUP; - - if (this_comp.get_component (tc) == 0) - return 0; - - // extract the group component - TAO_InputCDR cdr (reinterpret_cast<const char*> (tc.component_data.get_buffer ()), - tc.component_data.length ()); - - CORBA::Boolean byte_order; - if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0) - { - return 0; - } - - cdr.reset_byte_order (static_cast<int> (byte_order)); - - FT::TagFTGroupTaggedComponent group_component; - - cdr >> group_component; - - return (CORBA::ULong) group_component.object_group_id % max; -} - -CORBA::Boolean -TAO_FT_Service_Callbacks::is_permanent_forward_condition (const CORBA::Object_ptr obj, - const TAO_Service_Context &service_context) const -{ - // do as much as possible outside of lock - IOP::ServiceContext sc; - sc.context_id = IOP::FT_GROUP_VERSION; - - if (service_context.get_context (sc) == 0) - return false; /* false */ - - IOP::TaggedComponent tc; - tc.tag = IOP::TAG_FT_GROUP; - - const TAO_Stub * stub = obj->_stubobj (); - // check for forward_profiles, branching to speed up operation on base_profiles - if (stub->forward_profiles ()) - { - // set lock, as forward_profiles might be deleted concurrently - ACE_MT (ACE_GUARD_RETURN (ACE_Lock, - guard, - *stub->profile_lock (), - 0)); - - // even now, the forward profiles might have been deleted in the meanwhile - const TAO_MProfile &mprofile = stub->forward_profiles() - ? *(stub->forward_profiles()) - : stub->base_profiles(); - - if (mprofile.profile_count() == 0) - // releasing lock - return false; - - // assuming group-attributes are set for all profiles, check - // only the first profile - const TAO_Tagged_Components &tagged_components = - mprofile.get_profile (0)->tagged_components (); - - if (tagged_components.get_component (tc) == 0) - // releasing lock - return false; /* false */ - - return true; /* true */ - - // releasing lock - } - else /* operate on constant basic_profiles */ - { - const TAO_MProfile &mprofile = stub->base_profiles(); - - if (mprofile.profile_count() == 0) - return false; - - // assuming group-attributes are set for all profiles, check only the first profile - const TAO_Tagged_Components &tagged_components = - mprofile.get_profile (0)->tagged_components (); - - if (tagged_components.get_component (tc) == 0) - return false; /* false */ - - return true; /* true */ - } -} - - -TAO::Invocation_Status -TAO_FT_Service_Callbacks::raise_comm_failure ( - IOP::ServiceContextList &context_list, - TAO_Profile *profile - ACE_ENV_ARG_DECL) -{ - if (this->restart_policy_check (context_list, - profile)) - return TAO::TAO_INVOKE_RESTART; - - // As the right tags are not found close the connection and throw an - // exception - ACE_THROW_RETURN (CORBA::COMM_FAILURE ( - CORBA::SystemException::_tao_minor_code ( - TAO_INVOCATION_RECV_REQUEST_MINOR_CODE, - errno), - CORBA::COMPLETED_MAYBE), - TAO::TAO_INVOKE_SYSTEM_EXCEPTION); -} - -TAO::Invocation_Status -TAO_FT_Service_Callbacks::raise_transient_failure ( - IOP::ServiceContextList &service, - TAO_Profile *profile - ACE_ENV_ARG_DECL_NOT_USED) -{ - if (this->restart_policy_check (service, - profile)) - return TAO::TAO_INVOKE_RESTART; - - // Unlike COMM_FAILURE do not raise an exception since the - // completion status is not known and no assumption can be made. - return TAO::TAO_INVOKE_SYSTEM_EXCEPTION; -} - -CORBA::Boolean -TAO_FT_Service_Callbacks::restart_policy_check ( - IOP::ServiceContextList &service_list, - const TAO_Profile *profile) -{ - // Check whether the IOP::FT_REQUEST exists within the service - // context list and FT::FT_GROUP exists within the profile that we - // have - IOP::TaggedComponent tagged_component; - tagged_component.tag = IOP::TAG_FT_GROUP; - - if (profile->tagged_components ().get_component (tagged_component) - == 1) - { - // Look for the FT_REQUEST context id - for (CORBA::ULong i = 0; - i < service_list.length (); - i++) - { - if (service_list[i].context_id == IOP::FT_REQUEST) - { - // This would be a heck of a lot easier if we had the invocation - // here rather than just the contexts, but lemons -> lemonade I guess. - TAO_InputCDR cdr (reinterpret_cast <const char*> (service_list[i].context_data.get_buffer ()), - service_list[i].context_data.length ()); - CORBA::Boolean byte_order; - if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0) - return 0; - cdr.reset_byte_order (static_cast <int> (byte_order)); - FT::FTRequestServiceContext ftsrc; - if ((cdr >> ftsrc) == 0) - return 0; - - return (ftsrc.expiration_time > now ()); - } - } - } - - // Failure - return 0; -} - -TimeBase::TimeT -TAO_FT_Service_Callbacks::now (void) -{ - // Grab the localtime on the machine where this is running - ACE_Time_Value time_val = ACE_OS::gettimeofday (); - TimeBase::TimeT sec_part = ((TimeBase::TimeT)time_val.sec ()) * 10000000; - TimeBase::TimeT usec_part = ((TimeBase::TimeT)time_val.usec ()) * 10; - - // Add the offset to convert from posix time. - return (sec_part + usec_part + ACE_UINT64_LITERAL (0x1B21DD213814000)); -} - -TAO_END_VERSIONED_NAMESPACE_DECL |