summaryrefslogtreecommitdiff
path: root/trunk/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp')
-rw-r--r--trunk/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp235
1 files changed, 235 insertions, 0 deletions
diff --git a/trunk/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp b/trunk/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp
new file mode 100644
index 00000000000..3243d7ea5fd
--- /dev/null
+++ b/trunk/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp
@@ -0,0 +1,235 @@
+// -*- C++ -*-
+
+#include "orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.h"
+
+#include "tao/Profile_Transport_Resolver.h"
+#include "tao/Stub.h"
+#include "tao/Profile.h"
+#include "tao/Endpoint.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Environment.h"
+#include "tao/debug.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID (FaultTolerance,
+ FT_Invocation_Endpoint_Selectors,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FT_Invocation_Endpoint_Selector::TAO_FT_Invocation_Endpoint_Selector (void)
+ : TAO_Default_Endpoint_Selector ()
+{
+}
+
+TAO_FT_Invocation_Endpoint_Selector::~TAO_FT_Invocation_Endpoint_Selector (void)
+{
+}
+
+void
+TAO_FT_Invocation_Endpoint_Selector::select_endpoint (
+ TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *val
+ ACE_ENV_ARG_DECL)
+{
+ bool retval =
+ this->select_primary (r,
+ val
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (retval)
+ return;
+
+ retval =
+ this->select_secondary (r,
+ val
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (retval == false)
+ {
+ // If we get here, we completely failed to find an endpoint selector
+ // that we know how to use, so throw an exception.
+ ACE_THROW (CORBA::TRANSIENT (CORBA::OMGVMCID | 2,
+ CORBA::COMPLETED_NO));
+ }
+
+ return;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::select_primary (
+ TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL)
+{
+ // Grab the forwarded list
+ TAO_MProfile *prof_list =
+ const_cast<TAO_MProfile *> (r->stub ()->forward_profiles ());
+
+ TAO_MProfile &basep = r->stub ()->base_profiles ();
+
+ if (prof_list ==0)
+ prof_list = &basep;
+
+ if (prof_list == 0)
+ return false;
+
+ // Did not succeed. Try to look for primaries all over the place
+ CORBA::ULong sz =
+ prof_list->size ();
+
+ // Iterate through the list in a circular fashion. Stop one before
+ // the list instead of trying the same thing again.
+ for (CORBA::ULong i = 0;
+ i != sz;
+ ++i)
+ {
+ TAO_Profile *tmp = prof_list->get_profile (i);
+
+ bool retval =
+ this->check_profile_for_primary (tmp
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ // Choose a non-primary
+ if (retval == true && tmp != 0)
+ {
+ retval =
+ this->try_connect (r,
+ tmp,
+ max_wait_time
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ if (retval == true)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::select_secondary (
+ TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL)
+{
+ // Grab the forwarded list
+ TAO_MProfile *prof_list =
+ const_cast<TAO_MProfile *> (r->stub ()->forward_profiles ());
+
+ TAO_MProfile &basep =
+ r->stub ()->base_profiles ();
+
+ if (prof_list ==0)
+ prof_list = &basep;
+
+ if (prof_list == 0)
+ return false;
+
+ CORBA::ULong sz =
+ prof_list->size ();
+
+ for (CORBA::ULong i = 0;
+ i != sz;
+ ++i)
+ {
+ TAO_Profile *tmp =
+ prof_list->get_profile (i);
+
+ bool retval =
+ this->check_profile_for_primary (tmp
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ // Choose a non-primary
+ if (retval == false && tmp != 0)
+ {
+ retval =
+ this->try_connect (r,
+ tmp,
+ max_wait_time
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ if (retval == true)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::try_connect (
+ TAO::Profile_Transport_Resolver *r,
+ TAO_Profile *profile,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL)
+{
+ r->profile (profile);
+
+ size_t endpoint_count =
+ r->profile ()->endpoint_count ();
+
+ TAO_Endpoint *ep =
+ r->profile ()->endpoint ();
+
+ for (size_t i = 0; i < endpoint_count; ++i)
+ {
+ TAO_Base_Transport_Property desc (ep);
+
+ bool retval =
+ r->try_connect (&desc,
+ max_wait_time
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ // @@ Good place to handle timeouts.. We can omit timeouts and
+ // go ahead looking for other things... There are some small
+ // issues that needs ironed out first in the invocation
+ // classes.
+
+ // Check if the connect has completed.
+ if (retval)
+ return true;
+
+ // Go to the next endpoint in this profile.
+ ep = ep->next ();
+ }
+
+ return false;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::check_profile_for_primary (
+ TAO_Profile *pfile
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (pfile == 0)
+ return false;
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = IOP::TAG_FT_PRIMARY;
+
+ // Get the tagged component from the profile
+ TAO_Tagged_Components &pfile_tagged =
+ pfile->tagged_components ();
+
+ // Search for the TaggedComponent that we want
+ if (pfile_tagged.get_component (tagged_component) != 1)
+ return false;
+
+ if (TAO_debug_level > 2)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - Got a primary component\n")));
+ }
+
+ return true;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL