diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp | 441 |
1 files changed, 0 insertions, 441 deletions
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp deleted file mode 100644 index ad331580af6..00000000000 --- a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp +++ /dev/null @@ -1,441 +0,0 @@ -// $Id$ - -#include "orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h" -#include "orbsvcs/FaultTolerance/FT_Service_Callbacks.h" -#include "orbsvcs/FT_CORBA_ORBC.h" - -#include "tao/CORBA_String.h" -#include "tao/debug.h" -#include "tao/ORB_Constants.h" -#include "tao/CDR.h" -#include "tao/PI/ClientRequestInfo.h" - -#include "ace/UUID.h" -#include "ace/Lock_Adapter_T.h" -#include "ace/Lock.h" -#include "ace/Synch_Traits.h" - -ACE_RCSID (FaultTolerance, - FT_ORBInitializer, - "$Id$") - - -TAO_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace TAO -{ - FT_ClientRequest_Interceptor::FT_ClientRequest_Interceptor (void) - : name_ ("TAO_FT_ClientRequest_Interceptor") - , uuid_ (0) - , lock_ (0) - , retention_id_ (0) - { - ACE_Utils::UUID_GENERATOR::instance ()->init (); - - this->uuid_ = - ACE_Utils::UUID_GENERATOR::instance ()->generateUUID (); - - // Would be nice to have runtime option. - ACE_NEW (this->lock_, - ACE_Lock_Adapter<ACE_SYNCH_MUTEX>); - - } - - FT_ClientRequest_Interceptor::~FT_ClientRequest_Interceptor (void) - { - delete this->uuid_; - delete this->lock_; - } - - char * - FT_ClientRequest_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException)) - { - return CORBA::string_dup (this->name_); - } - - void - FT_ClientRequest_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException)) - { - } - - void - FT_ClientRequest_Interceptor::send_poll ( - PortableInterceptor::ClientRequestInfo_ptr - ACE_ENV_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException)) - { - // Do Nothing - } - - void - FT_ClientRequest_Interceptor::send_request ( - PortableInterceptor::ClientRequestInfo_ptr ri - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, - PortableInterceptor::ForwardRequest)) - { - if (TAO_debug_level > 3) - { - CORBA::String_var op = - ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; - - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO_FT (%P|%t) - %s called for %s\n"), - this->name_, - op.in ())); - } - - this->group_version_context (ri - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - - this->request_service_context (ri - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - } - - void - FT_ClientRequest_Interceptor::receive_reply ( - PortableInterceptor::ClientRequestInfo_ptr - ACE_ENV_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException)) - { - } - - void - FT_ClientRequest_Interceptor::receive_other ( - PortableInterceptor::ClientRequestInfo_ptr ri - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, - PortableInterceptor::ForwardRequest)) - { - TAO_ClientRequestInfo* tao_ri = dynamic_cast<TAO_ClientRequestInfo*> (ri); - - if (!tao_ri) - { - ACE_THROW (CORBA::INTERNAL ()); - } - - TimeBase::TimeT expires = tao_ri->tao_ft_expiration_time (); - - if (!expires) - { - // Not an FT request - return; - } - - PortableInterceptor::ReplyStatus status = -1; - - ACE_TRY - { - status = ri->reply_status(ACE_ENV_SINGLE_ARG_PARAMETER); - } - ACE_CATCHANY - { - // No reply status => Not a location forward. - return; - } - ACE_ENDTRY; - - if (status == PortableInterceptor::LOCATION_FORWARD) - { - // We are in an FT request and a location forward has been received. - - if (expires < TAO_FT_Service_Callbacks::now ()) - { - // The request has already expired... - - if (TAO_debug_level > 3) - { - ACE_DEBUG ((LM_DEBUG, - "TAO_FT (%P|%t): FT_ClientRequest_Interceptor::receive_other - LOCATION_FORWARD received after request expiration.\n")); - } - - // The spec says throw a SYSTEM_EXCEPTION, but doesn't specify which one. - // I think a TRANSIENT is the most suitable. - ACE_THROW (CORBA::TRANSIENT ( - CORBA::SystemException::_tao_minor_code ( - TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE, - errno), - CORBA::COMPLETED_NO)); - } - } - } - - void - FT_ClientRequest_Interceptor::receive_exception ( - PortableInterceptor::ClientRequestInfo_ptr - ACE_ENV_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException, - PortableInterceptor::ForwardRequest)) - { -#if 0 - // @@ Will be used later. - // Do a check for policy in which this can be done.. - PortableInterceptor::ReplyStatus rs = - ri->reply_status (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; - - if (rs != PortableInterceptor::SYSTEM_EXCEPTION) - { - return; - } - - CORBA::Any_var ex = - ri->received_exception (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; - - TAO_OutputCDR cdr; - - if (!ex->impl ()->marshal_value (cdr)) - return; - - // Place for optimization.. - TAO_InputCDR icdr (cdr); - - CORBA::String_var rep_id; - - CORBA::ULong min, cs = 0; - - if (!(icdr.read_string (rep_id.out ()) && - icdr.read_ulong (min) && - icdr.read_ulong (cs))) - ACE_THROW (CORBA::MARSHAL (TAO::VMCID, - CORBA::COMPLETED_MAYBE)); - - cs = CORBA::CompletionStatus (cs); - - // ORB would take care of it - if (cs != CORBA::COMPLETED_MAYBE) - return; - - // If it is COMPLETED_MAYBE, then we will throw a COMPLETED_NO, - // which the ORB should understand - if (ACE_OS_String::strcmp (rep_id.in (), - "IDL:omg.org/CORBA/TRANSIENT:1.0") == 0) - ACE_THROW (CORBA::TRANSIENT (min, - CORBA::COMPLETED_NO)); - else if (ACE_OS_String::strcmp (rep_id.in (), - "IDL:omg.org/CORBA/COMM_FAILURE:1.0") == 0) - ACE_THROW (CORBA::COMM_FAILURE (min, - CORBA::COMPLETED_NO)); - else if (ACE_OS_String::strcmp (rep_id.in (), - "IDL:omg.org/CORBA/NO_REPONSE:1.0") == 0) - ACE_THROW (CORBA::NO_RESPONSE (min, - CORBA::COMPLETED_NO)); - - else if (ACE_OS_String::strcmp (rep_id.in (), - "IDL:omg.org/CORBA/OBJ_ADAPTER:1.0") == 0) - ACE_THROW (CORBA::OBJ_ADAPTER (min, - CORBA::COMPLETED_NO)); - cout << "Didnt throw exception " << endl; -#endif /*if 0*/ - return; - } - - - void - FT_ClientRequest_Interceptor::group_version_context ( - PortableInterceptor::ClientRequestInfo_ptr ri - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException)) - { - ACE_TRY - { - IOP::TaggedComponent_var tp = - ri->get_effective_component (IOP::TAG_FT_GROUP - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - // Grab the object group version - // @@ NOTE: This involves an allocation and a dellocation. This is - // really bad. - TAO_InputCDR cdr (reinterpret_cast<const char*> (tp->component_data.get_buffer ()), - tp->component_data.length ()); - CORBA::Boolean byte_order; - - if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0) - return; - - cdr.reset_byte_order (static_cast<int> (byte_order)); - - FT::TagFTGroupTaggedComponent gtc; - - if ((cdr >> gtc) == 0) - ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 28, - CORBA::COMPLETED_NO)); - - IOP::ServiceContext sc; - sc.context_id = IOP::FT_GROUP_VERSION; - - TAO_OutputCDR ocdr; - if (!(ocdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER))) - return; - //ACE_THROW (CORBA::MARSHAL ()); - - if (!(ocdr << gtc.object_group_ref_version)) - return; - //ACE_THROW (CORBA::MARSHAL ()); - - CORBA::ULong length = - static_cast<CORBA::ULong> (ocdr.total_length ()); - sc.context_data.length (length); - CORBA::Octet *buf = sc.context_data.get_buffer (); - - for (const ACE_Message_Block *i = ocdr.begin (); - i != 0; - i = i->cont ()) - { - ACE_OS::memcpy (buf, i->rd_ptr (), i->length ()); - buf += i->length (); - } - - // Add this context to the service context list. - ri->add_request_service_context (sc, - 0 - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - } - ACE_CATCHANY - { - // Not much can be done anyway. Just keep quiet - // ACE_RE_THROW; - } - ACE_ENDTRY; - ACE_CHECK; - - return; - } - - void - FT_ClientRequest_Interceptor::request_service_context ( - PortableInterceptor::ClientRequestInfo_ptr ri - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException)) - { - ACE_TRY - { - IOP::ServiceContext sc; - sc.context_id = IOP::FT_REQUEST; - - CORBA::Policy_var policy = - ri->get_request_policy (FT::REQUEST_DURATION_POLICY - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - FT::FTRequestServiceContext ftrsc; - ftrsc.client_id = - CORBA::string_dup (this->uuid_->to_string ()->c_str ()); - - TAO_ClientRequestInfo* tao_ri = dynamic_cast<TAO_ClientRequestInfo*> (ri); - - if (!tao_ri) - { - ACE_THROW (CORBA::INTERNAL ()); - } - - if (tao_ri->tao_ft_expiration_time ()) - { - ftrsc.retention_id = tao_ri->tao_ft_retention_id (); - ftrsc.expiration_time = tao_ri->tao_ft_expiration_time (); - } - else - { - ACE_GUARD (ACE_Lock, - guard, - *this->lock_); - - ftrsc.retention_id = ++this->retention_id_; - ftrsc.expiration_time = - this->request_expiration_time (policy.in () - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - tao_ri->tao_ft_retention_id (ftrsc.retention_id); - tao_ri->tao_ft_expiration_time (ftrsc.expiration_time); - } - - TAO_OutputCDR ocdr; - if (!(ocdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER))) - return; - //ACE_THROW (CORBA::MARSHAL ()); - - if (!(ocdr << ftrsc)) - return; - // ACE_THROW (CORBA::MARSHAL ()); - - // Make a *copy* of the CDR stream... - CORBA::ULong length = - static_cast<CORBA::ULong> (ocdr.total_length ()); - sc.context_data.length (length); - CORBA::Octet *buf = sc.context_data.get_buffer (); - - for (const ACE_Message_Block *i = ocdr.begin (); - i != 0; - i = i->cont ()) - { - ACE_OS::memcpy (buf, i->rd_ptr (), i->length ()); - buf += i->length (); - } - - // Add this context to the service context list. - ri->add_request_service_context (sc, - 0 - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCHANY - { - // ACE_RE_THROW; - } - ACE_ENDTRY; - ACE_CHECK; - return; - } - - TimeBase::TimeT - FT_ClientRequest_Interceptor::request_expiration_time ( - CORBA::Policy *policy - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException)) - { - FT::RequestDurationPolicy_var p; - - if (policy != 0) - { - p = FT::RequestDurationPolicy::_narrow (policy - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (0); - } - - TimeBase::TimeT t = 0; - - if (p.in ()) - { - t = - p->request_duration_policy_value (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (0); - } - else - { - if (TAO_debug_level > 3) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO_FT (%P|%t) - Using default value") - ACE_TEXT ("of 1.5 seconds\n"))); - } - t = 15 * 1000000; - } - - // Calculaton of the expiration time - t += TAO_FT_Service_Callbacks::now (); - - return t; - } -} - -TAO_END_VERSIONED_NAMESPACE_DECL |