summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOssama Othman <ossama-othman@users.noreply.github.com>2001-06-21 04:12:09 +0000
committerOssama Othman <ossama-othman@users.noreply.github.com>2001-06-21 04:12:09 +0000
commit85774468ea596af18f4d83c04de36974b2bad92c (patch)
treec95044e8892e2887abf4a653336fd658f6eb5f84
parent5aecb73a31e6a0a0758e2ff19c17fb22b7fb144b (diff)
downloadATCD-85774468ea596af18f4d83c04de36974b2bad92c.tar.gz
*** empty log message ***
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_GenericFactory.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_GenericFactory.h17
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_Location_Map.cpp20
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_Location_Map.h25
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_Minimum_Dispersion.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.h20
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_ReplicaInfo.h13
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing.idl7
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.h17
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.cpp20
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.h25
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Minimum_Dispersion.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.h20
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp69
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h6
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ReplicaInfo.h13
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.cpp66
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.h12
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancingI.cpp66
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancingI.h12
23 files changed, 411 insertions, 187 deletions
diff --git a/TAO/orbsvcs/orbsvcs/LB_GenericFactory.cpp b/TAO/orbsvcs/orbsvcs/LB_GenericFactory.cpp
index 9718f23ef5d..4c33b802490 100644
--- a/TAO/orbsvcs/orbsvcs/LB_GenericFactory.cpp
+++ b/TAO/orbsvcs/orbsvcs/LB_GenericFactory.cpp
@@ -2,6 +2,8 @@
#include "LB_GenericFactory.h"
#include "LB_ReplicaInfo.h"
+#include "LB_Location_Map.h"
+#include "LB_ObjectGroup_Map.h"
#include "LB_PropertyManager.h"
#include "ace/Auto_Ptr.h"
@@ -12,11 +14,13 @@ ACE_RCSID (LoadBalancing,
TAO_LB_GenericFactory::TAO_LB_GenericFactory (
- TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &object_group_map)
+ TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager)
: poa_ (),
- property_manager_ (property_manager),
+ location_map_ (location_map),
object_group_map_ (object_group_map),
+ property_manager_ (property_manager),
next_fcid_ (0),
lock_ ()
{
@@ -72,7 +76,11 @@ TAO_LB_GenericFactory::create_object (
TAO_LB_ObjectGroup_Map_Entry *object_group_entry = 0;
ACE_NEW_THROW_EX (object_group_entry,
TAO_LB_ObjectGroup_Map_Entry,
- CORBA::NO_MEMORY ());
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
ACE_CHECK_RETURN (CORBA::Object::_nil ());
auto_ptr<TAO_LB_ObjectGroup_Map_Entry> safe_object_group_entry (
@@ -212,6 +220,8 @@ TAO_LB_GenericFactory::delete_object (
}
(void) replica_infos.remove (replica_info);
+ (void) replica_info->location_entry->replica_infos.remove (
+ replica_info);
delete replica_info;
}
@@ -257,6 +267,26 @@ TAO_LB_GenericFactory::populate_object_group (
ACE_TRY_ENV);
ACE_CHECK;
+ // If no location entry exists for the given location, then
+ // create and bind a new one.
+ if (this->location_map_.find (factory_info.the_location,
+ location_entry) != 0)
+ {
+ ACE_NEW_THROW_EX (location_entry,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ safe_location_entry = location_entry;
+
+ if (this->location_map_.bind (factory_info.the_location,
+ location_entry) != 0)
+ ACE_THROW (LoadBalancing::ObjectNotCreated ());
+ }
+
#if 0
// @@ Should an "_is_a()" be performed here? While it appears
// to be the right thing to do, it can be expensive.
@@ -294,7 +324,8 @@ TAO_LB_GenericFactory::populate_object_group (
auto_ptr<TAO_LB_ReplicaInfo> safe_replica_info (replica_info);
- if (object_group_entry->replica_infos.insert (replica_info) != 0)
+ if (object_group_entry->replica_infos.insert (replica_info) != 0
+ || location_entry->replica_infos.insert (replica_info) != 0)
{
// An Object of incorrect type was created. Delete it, and
// throw a NoFactory exception.
@@ -310,6 +341,8 @@ TAO_LB_GenericFactory::populate_object_group (
replica_info->factory_creation_id = replica_fcid;
+ replica_info->location_entry = location_entry;
+
// No longer need to protect the allocated Replica_Map.
safe_replica_info.release ();
}
@@ -352,6 +385,9 @@ TAO_LB_GenericFactory::get_ObjectId (
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class auto_ptr<TAO_LB_Location_Map_Entry>;
+template class ACE_Auto_Basic_Ptr<TAO_LB_Location_Map_Entry>;
+
template class auto_ptr<TAO_LB_ObjectGroup_Map_Entry>;
template class ACE_Auto_Basic_Ptr<TAO_LB_ObjectGroup_Map_Entry>;
@@ -360,6 +396,9 @@ template class ACE_Auto_Basic_Ptr<TAO_LB_ReplicaInfo>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate auto_ptr<TAO_LB_Location_Map_Entry>
+#pragma instantiate ACE_Auto_Basic_Ptr<TAO_LB_Location_Map_Entry>
+
#pragma instantiate auto_ptr<TAO_LB_ObjectGroup_Map_Entry>
#pragma instantiate ACE_Auto_Basic_Ptr<TAO_LB_ObjectGroup_Map_Entry>
diff --git a/TAO/orbsvcs/orbsvcs/LB_GenericFactory.h b/TAO/orbsvcs/orbsvcs/LB_GenericFactory.h
index d276e7c9780..12b221f8722 100644
--- a/TAO/orbsvcs/orbsvcs/LB_GenericFactory.h
+++ b/TAO/orbsvcs/orbsvcs/LB_GenericFactory.h
@@ -26,11 +26,14 @@
#include "orbsvcs/LoadBalancingC.h"
-#include "LB_ObjectGroup_Map.h"
/// Forward declarations.
+class TAO_LB_Location_Map;
+class TAO_LB_ObjectGroup_Map;
class TAO_LB_PropertyManager;
+struct TAO_LB_ObjectGroup_Map_Entry;
+
/**
* @class TAO_LB_GenericFactory
@@ -48,8 +51,9 @@ class TAO_LB_GenericFactory
public:
/// Constructor.
- TAO_LB_GenericFactory (TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &object_group_map);
+ TAO_LB_GenericFactory (TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager);
/**
* @name TAO_LoadBalancer::GenericFactory methods
@@ -118,12 +122,15 @@ private:
/// Reference to the POA used to create object group references.
PortableServer::POA_var poa_;
- /// Reference to the PropertyManager.
- TAO_LB_PropertyManager &property_manager_;
+ /// Reference to the Location map.
+ TAO_LB_Location_Map &location_map_;
/// Reference to the ObjectGroup map.
TAO_LB_ObjectGroup_Map &object_group_map_;
+ /// Reference to the PropertyManager.
+ TAO_LB_PropertyManager &property_manager_;
+
/// The FactoryCreationId that will be assigned to the next object
/// group that is created.
/**
diff --git a/TAO/orbsvcs/orbsvcs/LB_Location_Map.cpp b/TAO/orbsvcs/orbsvcs/LB_Location_Map.cpp
index e752c8c5136..4dc143db217 100644
--- a/TAO/orbsvcs/orbsvcs/LB_Location_Map.cpp
+++ b/TAO/orbsvcs/orbsvcs/LB_Location_Map.cpp
@@ -9,18 +9,18 @@ ACE_RCSID (LoadBalancing,
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
-template class ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set>;
-template class ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
-template class ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
-template class ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
-template class ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_Location_Map_Entry>;
+template class ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
-#pragma instantiate ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set>
-#pragma instantiate ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
-#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
-#pragma instantiate ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
-#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_Location_Map_Entry>
+#pragma instantiate ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/LB_Location_Map.h b/TAO/orbsvcs/orbsvcs/LB_Location_Map.h
index f25d4f404a7..13b598c63ab 100644
--- a/TAO/orbsvcs/orbsvcs/LB_Location_Map.h
+++ b/TAO/orbsvcs/orbsvcs/LB_Location_Map.h
@@ -29,11 +29,34 @@
#include "LB_Location_Hash.h"
#include "LB_Location_Equal_To.h"
+/**
+ * @class TAO_LB_Location_Map_Entry
+ *
+ * @brief Value field (internal ID) of the location hash map.
+ *
+ * Structure that contains all information corresponding to a given
+ * location.
+ */
+struct TAO_LB_Location_Map_Entry
+{
+
+ /// Set of replicas at the location corresponding to this location
+ /// map entry.
+ TAO_LB_ReplicaInfo_Set replica_infos;
+
+ /// List of loads reported by the load monitor at the given
+ /// location.
+ LoadBalancing::LoadList_var load_list;
+
+ /// Reference to the load monitor at the given location.
+ LoadBalancing::LoadMonitor_var load_monitor;
+
+};
/// Location hash map.
typedef ACE_Hash_Map_Manager_Ex<
LoadBalancing::Location,
- TAO_LB_ReplicaInfo_Set,
+ TAO_LB_Location_Map_Entry,
TAO_LB_Location_Hash,
TAO_LB_Location_Equal_To,
TAO_SYNCH_MUTEX> TAO_LB_Location_Map;
diff --git a/TAO/orbsvcs/orbsvcs/LB_Minimum_Dispersion.cpp b/TAO/orbsvcs/orbsvcs/LB_Minimum_Dispersion.cpp
index 3ca7acc587c..27e1b605df7 100644
--- a/TAO/orbsvcs/orbsvcs/LB_Minimum_Dispersion.cpp
+++ b/TAO/orbsvcs/orbsvcs/LB_Minimum_Dispersion.cpp
@@ -35,30 +35,26 @@ TAO_LB_Minimum_Dispersion_Strategy::replica (
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
CORBA::Object::_nil ());
- TAO_LB_ReplicaInfo_Set_Iterator begin = entry->replica_infos.begin ();
- TAO_LB_ReplicaInfo_Set_Iterator end = entry->replica_infos.end ();
+ TAO_LB_ReplicaInfo_Set::iterator begin = entry->replica_infos.begin ();
+ TAO_LB_ReplicaInfo_Set::iterator end = entry->replica_infos.end ();
- TAO_LB_ReplicaInfo_Set_Iterator i = begin;
+ TAO_LB_ReplicaInfo_Set::iterator i = begin;
TAO_LB_ReplicaInfo *replica_info = (*i);
- LoadBalancing::LoadList_var d =
- replica_info->load_monitor->current_load (ACE_TRY_ENV);
-
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ LoadBalancing::LoadList *d =
+ replica_info->location_entry->load_list.ptr ();
for (++i ; i != end; ++i)
{
- LoadBalancing::LoadList_var load =
- (*i)->load_monitor->current_load (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ LoadBalancing::LoadList *load =
+ (*i)->location_entry->load_list.ptr ();
// @@ Hardcode one load and don't bother checking the
// LoadId, for now. (just to get things going)
- if (d[CORBA::Long (0)].value > load[CORBA::Long (0)].value)
+ if (d[CORBA::ULong (0)].value > load[CORBA::ULong (0)].value)
{
replica_info = *i;
- d = (*i)->load_monitor->current_load (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ d = (*i)->location_entry->load_list.ptr ();
}
}
diff --git a/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.cpp b/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.cpp
index f265a17dcf0..df9c223580a 100644
--- a/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.cpp
+++ b/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.cpp
@@ -1,19 +1,23 @@
// -*- C++ -*-
#include "LB_ObjectGroupManager.h"
+
+#include "LB_Location_Map.h"
#include "LB_ObjectGroup_Map.h"
+
ACE_RCSID (LoadBalancing,
LB_ObjectGroupManager,
"$Id$")
TAO_LB_ObjectGroupManager::TAO_LB_ObjectGroupManager (
- TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &map)
- : property_manager_ (property_manager),
- object_group_map_ (map),
- location_map_ ()
+ TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager)
+ : location_map_ (location_map),
+ object_group_map_ (object_group_map),
+ property_manager_ (property_manager)
{
}
diff --git a/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.h b/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.h
index b4426406ffa..d523a05313e 100644
--- a/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.h
+++ b/TAO/orbsvcs/orbsvcs/LB_ObjectGroupManager.h
@@ -22,12 +22,13 @@
#pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
-#include "LB_ObjectGroup_Map.h"
-#include "LB_Location_Map.h"
/// Forward declarations.
+class TAO_LB_Location_Map;
+class TAO_LB_ObjectGroup_Map;
class TAO_LB_PropertyManager;
+
/**
* @class TAO_LB_ObjectGroupManager
*
@@ -42,8 +43,9 @@ class TAO_LB_ObjectGroupManager
public:
/// Constructor.
- TAO_LB_ObjectGroupManager (TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &map);
+ TAO_LB_ObjectGroupManager (TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager);
/**
* @name TAO_LoadBalancer::ObjectGroupManager methods
@@ -151,14 +153,16 @@ public:
private:
- /// Reference to the PropertyManager.
- TAO_LB_PropertyManager &property_manager_;
+ /// Map that contains list of all replicas at a given location, in
+ /// addition to the load monitor at that location.
+ TAO_LB_Location_Map &location_map_;
/// Pointer to the ObjectGroup map.
TAO_LB_ObjectGroup_Map &object_group_map_;
- /// Map that contains list of all replicas at a given location.
- TAO_LB_Location_Map location_map_;
+ /// Reference to the PropertyManager.
+ TAO_LB_PropertyManager &property_manager_;
+
};
#endif /* TAO_LB_OBJECT_GROUP_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/LB_ReplicaInfo.h b/TAO/orbsvcs/orbsvcs/LB_ReplicaInfo.h
index 706b165350b..fc4578ca6ac 100644
--- a/TAO/orbsvcs/orbsvcs/LB_ReplicaInfo.h
+++ b/TAO/orbsvcs/orbsvcs/LB_ReplicaInfo.h
@@ -33,9 +33,8 @@ typedef ACE_Unbounded_Set<TAO_LB_ReplicaInfo *> TAO_LB_ReplicaInfo_Set;
*
* @brief Class that contains all replica-specific information.
*/
-class TAO_LB_ReplicaInfo
+struct TAO_LB_ReplicaInfo
{
-public:
/// Reference to the replica.
CORBA::Object_var replica;
@@ -48,12 +47,10 @@ public:
/// was not created using a GenericFactory.
LoadBalancing::GenericFactory::FactoryCreationId_var factory_creation_id;
- /// Reference to the load monitor residing at the same location the
- /// replica resides.
- LoadBalancing::LoadMonitor_var load_monitor;
-
- /// Average load(s) on the replica
- LoadBalancing::LoadList_var load_list;
+ /// Pointer to the location map entry containing the information
+ /// related to the location the replica corresponding to this
+ /// TAO_LB_ReplicaInfo structure.
+ TAO_LB_Location_Map_Entry *location_entry;
};
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing.idl b/TAO/orbsvcs/orbsvcs/LoadBalancing.idl
index 42b36ba9a07..ec16142cd2f 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing.idl
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing.idl
@@ -133,6 +133,8 @@ module LoadBalancing
exception CannotMeetCriteria {
Criteria unmet_criteria;
};
+ exception MonitorAlreadyPresent {};
+ exception LocationNotFound {};
/// Specification of PropertyManager Interface which
/// ReplicationManager Inherits
@@ -246,10 +248,11 @@ module LoadBalancing
raises (InterfaceNotFound);
void register_load_monitor (in LoadMonitor load_monitor,
- in Location the_location);
+ in Location the_location)
+ raises (MonitorAlreadyPresent);
LoadMonitor get_load_monitor (in Location the_location)
- raises (InterfaceNotFound);
+ raises (LocationNotFound);
};
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.cpp
index 9718f23ef5d..4c33b802490 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.cpp
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.cpp
@@ -2,6 +2,8 @@
#include "LB_GenericFactory.h"
#include "LB_ReplicaInfo.h"
+#include "LB_Location_Map.h"
+#include "LB_ObjectGroup_Map.h"
#include "LB_PropertyManager.h"
#include "ace/Auto_Ptr.h"
@@ -12,11 +14,13 @@ ACE_RCSID (LoadBalancing,
TAO_LB_GenericFactory::TAO_LB_GenericFactory (
- TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &object_group_map)
+ TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager)
: poa_ (),
- property_manager_ (property_manager),
+ location_map_ (location_map),
object_group_map_ (object_group_map),
+ property_manager_ (property_manager),
next_fcid_ (0),
lock_ ()
{
@@ -72,7 +76,11 @@ TAO_LB_GenericFactory::create_object (
TAO_LB_ObjectGroup_Map_Entry *object_group_entry = 0;
ACE_NEW_THROW_EX (object_group_entry,
TAO_LB_ObjectGroup_Map_Entry,
- CORBA::NO_MEMORY ());
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
ACE_CHECK_RETURN (CORBA::Object::_nil ());
auto_ptr<TAO_LB_ObjectGroup_Map_Entry> safe_object_group_entry (
@@ -212,6 +220,8 @@ TAO_LB_GenericFactory::delete_object (
}
(void) replica_infos.remove (replica_info);
+ (void) replica_info->location_entry->replica_infos.remove (
+ replica_info);
delete replica_info;
}
@@ -257,6 +267,26 @@ TAO_LB_GenericFactory::populate_object_group (
ACE_TRY_ENV);
ACE_CHECK;
+ // If no location entry exists for the given location, then
+ // create and bind a new one.
+ if (this->location_map_.find (factory_info.the_location,
+ location_entry) != 0)
+ {
+ ACE_NEW_THROW_EX (location_entry,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ safe_location_entry = location_entry;
+
+ if (this->location_map_.bind (factory_info.the_location,
+ location_entry) != 0)
+ ACE_THROW (LoadBalancing::ObjectNotCreated ());
+ }
+
#if 0
// @@ Should an "_is_a()" be performed here? While it appears
// to be the right thing to do, it can be expensive.
@@ -294,7 +324,8 @@ TAO_LB_GenericFactory::populate_object_group (
auto_ptr<TAO_LB_ReplicaInfo> safe_replica_info (replica_info);
- if (object_group_entry->replica_infos.insert (replica_info) != 0)
+ if (object_group_entry->replica_infos.insert (replica_info) != 0
+ || location_entry->replica_infos.insert (replica_info) != 0)
{
// An Object of incorrect type was created. Delete it, and
// throw a NoFactory exception.
@@ -310,6 +341,8 @@ TAO_LB_GenericFactory::populate_object_group (
replica_info->factory_creation_id = replica_fcid;
+ replica_info->location_entry = location_entry;
+
// No longer need to protect the allocated Replica_Map.
safe_replica_info.release ();
}
@@ -352,6 +385,9 @@ TAO_LB_GenericFactory::get_ObjectId (
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class auto_ptr<TAO_LB_Location_Map_Entry>;
+template class ACE_Auto_Basic_Ptr<TAO_LB_Location_Map_Entry>;
+
template class auto_ptr<TAO_LB_ObjectGroup_Map_Entry>;
template class ACE_Auto_Basic_Ptr<TAO_LB_ObjectGroup_Map_Entry>;
@@ -360,6 +396,9 @@ template class ACE_Auto_Basic_Ptr<TAO_LB_ReplicaInfo>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate auto_ptr<TAO_LB_Location_Map_Entry>
+#pragma instantiate ACE_Auto_Basic_Ptr<TAO_LB_Location_Map_Entry>
+
#pragma instantiate auto_ptr<TAO_LB_ObjectGroup_Map_Entry>
#pragma instantiate ACE_Auto_Basic_Ptr<TAO_LB_ObjectGroup_Map_Entry>
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.h
index d276e7c9780..12b221f8722 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.h
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_GenericFactory.h
@@ -26,11 +26,14 @@
#include "orbsvcs/LoadBalancingC.h"
-#include "LB_ObjectGroup_Map.h"
/// Forward declarations.
+class TAO_LB_Location_Map;
+class TAO_LB_ObjectGroup_Map;
class TAO_LB_PropertyManager;
+struct TAO_LB_ObjectGroup_Map_Entry;
+
/**
* @class TAO_LB_GenericFactory
@@ -48,8 +51,9 @@ class TAO_LB_GenericFactory
public:
/// Constructor.
- TAO_LB_GenericFactory (TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &object_group_map);
+ TAO_LB_GenericFactory (TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager);
/**
* @name TAO_LoadBalancer::GenericFactory methods
@@ -118,12 +122,15 @@ private:
/// Reference to the POA used to create object group references.
PortableServer::POA_var poa_;
- /// Reference to the PropertyManager.
- TAO_LB_PropertyManager &property_manager_;
+ /// Reference to the Location map.
+ TAO_LB_Location_Map &location_map_;
/// Reference to the ObjectGroup map.
TAO_LB_ObjectGroup_Map &object_group_map_;
+ /// Reference to the PropertyManager.
+ TAO_LB_PropertyManager &property_manager_;
+
/// The FactoryCreationId that will be assigned to the next object
/// group that is created.
/**
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.cpp
index e752c8c5136..4dc143db217 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.cpp
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.cpp
@@ -9,18 +9,18 @@ ACE_RCSID (LoadBalancing,
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
-template class ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set>;
-template class ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
-template class ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
-template class ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
-template class ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_Location_Map_Entry>;
+template class ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
+template class ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
-#pragma instantiate ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set>
-#pragma instantiate ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
-#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
-#pragma instantiate ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
-#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_ReplicaInfo_Set, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Entry<LoadBalancing::Location, TAO_LB_Location_Map_Entry>
+#pragma instantiate ACE_Hash_Map_Manager_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<LoadBalancing::Location, TAO_LB_Location_Map_Entry, TAO_LB_Location_Hash, TAO_LB_Location_Equal_To, TAO_SYNCH_MUTEX>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.h
index f25d4f404a7..13b598c63ab 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.h
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Map.h
@@ -29,11 +29,34 @@
#include "LB_Location_Hash.h"
#include "LB_Location_Equal_To.h"
+/**
+ * @class TAO_LB_Location_Map_Entry
+ *
+ * @brief Value field (internal ID) of the location hash map.
+ *
+ * Structure that contains all information corresponding to a given
+ * location.
+ */
+struct TAO_LB_Location_Map_Entry
+{
+
+ /// Set of replicas at the location corresponding to this location
+ /// map entry.
+ TAO_LB_ReplicaInfo_Set replica_infos;
+
+ /// List of loads reported by the load monitor at the given
+ /// location.
+ LoadBalancing::LoadList_var load_list;
+
+ /// Reference to the load monitor at the given location.
+ LoadBalancing::LoadMonitor_var load_monitor;
+
+};
/// Location hash map.
typedef ACE_Hash_Map_Manager_Ex<
LoadBalancing::Location,
- TAO_LB_ReplicaInfo_Set,
+ TAO_LB_Location_Map_Entry,
TAO_LB_Location_Hash,
TAO_LB_Location_Equal_To,
TAO_SYNCH_MUTEX> TAO_LB_Location_Map;
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Minimum_Dispersion.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Minimum_Dispersion.cpp
index 3ca7acc587c..27e1b605df7 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Minimum_Dispersion.cpp
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Minimum_Dispersion.cpp
@@ -35,30 +35,26 @@ TAO_LB_Minimum_Dispersion_Strategy::replica (
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
CORBA::Object::_nil ());
- TAO_LB_ReplicaInfo_Set_Iterator begin = entry->replica_infos.begin ();
- TAO_LB_ReplicaInfo_Set_Iterator end = entry->replica_infos.end ();
+ TAO_LB_ReplicaInfo_Set::iterator begin = entry->replica_infos.begin ();
+ TAO_LB_ReplicaInfo_Set::iterator end = entry->replica_infos.end ();
- TAO_LB_ReplicaInfo_Set_Iterator i = begin;
+ TAO_LB_ReplicaInfo_Set::iterator i = begin;
TAO_LB_ReplicaInfo *replica_info = (*i);
- LoadBalancing::LoadList_var d =
- replica_info->load_monitor->current_load (ACE_TRY_ENV);
-
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ LoadBalancing::LoadList *d =
+ replica_info->location_entry->load_list.ptr ();
for (++i ; i != end; ++i)
{
- LoadBalancing::LoadList_var load =
- (*i)->load_monitor->current_load (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ LoadBalancing::LoadList *load =
+ (*i)->location_entry->load_list.ptr ();
// @@ Hardcode one load and don't bother checking the
// LoadId, for now. (just to get things going)
- if (d[CORBA::Long (0)].value > load[CORBA::Long (0)].value)
+ if (d[CORBA::ULong (0)].value > load[CORBA::ULong (0)].value)
{
replica_info = *i;
- d = (*i)->load_monitor->current_load (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ d = (*i)->location_entry->load_list.ptr ();
}
}
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.cpp
index f265a17dcf0..df9c223580a 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.cpp
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.cpp
@@ -1,19 +1,23 @@
// -*- C++ -*-
#include "LB_ObjectGroupManager.h"
+
+#include "LB_Location_Map.h"
#include "LB_ObjectGroup_Map.h"
+
ACE_RCSID (LoadBalancing,
LB_ObjectGroupManager,
"$Id$")
TAO_LB_ObjectGroupManager::TAO_LB_ObjectGroupManager (
- TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &map)
- : property_manager_ (property_manager),
- object_group_map_ (map),
- location_map_ ()
+ TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager)
+ : location_map_ (location_map),
+ object_group_map_ (object_group_map),
+ property_manager_ (property_manager)
{
}
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.h
index b4426406ffa..d523a05313e 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.h
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectGroupManager.h
@@ -22,12 +22,13 @@
#pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
-#include "LB_ObjectGroup_Map.h"
-#include "LB_Location_Map.h"
/// Forward declarations.
+class TAO_LB_Location_Map;
+class TAO_LB_ObjectGroup_Map;
class TAO_LB_PropertyManager;
+
/**
* @class TAO_LB_ObjectGroupManager
*
@@ -42,8 +43,9 @@ class TAO_LB_ObjectGroupManager
public:
/// Constructor.
- TAO_LB_ObjectGroupManager (TAO_LB_PropertyManager &property_manager,
- TAO_LB_ObjectGroup_Map &map);
+ TAO_LB_ObjectGroupManager (TAO_LB_Location_Map &location_map,
+ TAO_LB_ObjectGroup_Map &object_group_map,
+ TAO_LB_PropertyManager &property_manager);
/**
* @name TAO_LoadBalancer::ObjectGroupManager methods
@@ -151,14 +153,16 @@ public:
private:
- /// Reference to the PropertyManager.
- TAO_LB_PropertyManager &property_manager_;
+ /// Map that contains list of all replicas at a given location, in
+ /// addition to the load monitor at that location.
+ TAO_LB_Location_Map &location_map_;
/// Pointer to the ObjectGroup map.
TAO_LB_ObjectGroup_Map &object_group_map_;
- /// Map that contains list of all replicas at a given location.
- TAO_LB_Location_Map location_map_;
+ /// Reference to the PropertyManager.
+ TAO_LB_PropertyManager &property_manager_;
+
};
#endif /* TAO_LB_OBJECT_GROUP_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp
index 972d1ca143c..469223613f8 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp
@@ -7,8 +7,8 @@ ACE_RCSID (LoadBalancing,
"$Id$")
TAO_LB_Pull_Handler::TAO_LB_Pull_Handler (
- TAO_LB_ObjectGroup_Map &object_group_map)
- : object_group_map_ (object_group_map)
+ TAO_LB_Location_Map &location_map)
+ : location_map_ (location_map)
{
}
@@ -17,58 +17,39 @@ TAO_LB_Pull_Handler::handle_timeout (
const ACE_Time_Value & /* current_time */,
const void * /* arg */)
{
- TAO_LB_ObjectGroup_Map::iterator begin =
- this->object_group_map_.begin ();
+ TAO_LB_Location_Map::iterator begin =
+ this->location_map_.begin ();
- TAO_LB_ObjectGroup_Map::iterator begin =
- this->object_group_map_.end ();
+ TAO_LB_Location_Map::iterator begin =
+ this->location_map_.end ();
- // Iterate over all registered object groups.
+ // Iterate over all registered load monitors.
//
// @todo This could be potentially very slow. Improve concurrent
// operation at some point in the near future.
- for (TAO_LB_ObjectGroup_Map::iterator i = begin;
+ for (TAO_LB_Location_Map::iterator i = begin;
i != end;
- ++i
- {
- TAO_LB_ObjectGroup_Map_Entry *object_group = i->ext_id_;
+ ++i)
+ {
+ TAO_LB_Location_Map_Entry *location = i->ext_id_;
- ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, object_group->lock, 0);
-
- if (entry->replica_infos.is_empty ())
- // @@ What do we do if the set is empty?
- continue;
-
- TAO_LB_ReplicaInfo_Set::iterator begin =
- object_group->replica_infos.begin ();
-
- TAO_LB_ReplicaInfo_Set::iterator end =
- object_group->replica_infos.end ();
-
- // Now iterate over the replica set.
-
- TAO_LB_ReplicaInfo *replica_info = (*i);
-
- for (TAO_LB_ReplicaInfo_Set::iterator i = begin;
- i != end;
- ++i)
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
{
- LoadBalancing::LoadList_var load =
- (*i)->load_monitor->current_load (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
-
- // @@ Hardcode one load and don't bother checking the
- // LoadId, for now. (just to get things going)
- if (d[CORBA::Long (0)].value > load[CORBA::Long (0)].value)
- {
- replica_info = *i;
- d = (*i)->load_monitor->current_load (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
- }
+ location->load_list =
+ location->load_monitor->current_load (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
}
+ ACE_CATCHANY
+ {
+ // Catch the exception and ignore it.
- }
-
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "(%P|%t) Load monitoring exception");
+ }
+ ACE_ENDTRY;
+ }
return 0;
}
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h
index a7c1c39a1c7..fc6d1507465 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h
@@ -28,7 +28,7 @@
// Forward declarations.
-class TAO_LB_ObjectGroup_Map;
+class TAO_LB_Location_Map;
/**
@@ -45,7 +45,7 @@ class TAO_LB_Pull_Handler : public ACE_Event_Handler
public:
/// Constructor
- TAO_LB_Pull_Handler (TAO_LB_ObjectGroup_Map &object_group_map);
+ TAO_LB_Pull_Handler (TAO_LB_Location_Map &location_map);
/// Receive the timeout event.
/
@@ -56,7 +56,7 @@ private:
/// The table that contains all object groups registered with the
/// load balancer.
- TAO_LB_ObjectGroup_Map &object_group_map_;
+ TAO_LB_Location_Map &location_map_;
};
#include "ace/post.h"
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ReplicaInfo.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ReplicaInfo.h
index 706b165350b..fc4578ca6ac 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ReplicaInfo.h
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ReplicaInfo.h
@@ -33,9 +33,8 @@ typedef ACE_Unbounded_Set<TAO_LB_ReplicaInfo *> TAO_LB_ReplicaInfo_Set;
*
* @brief Class that contains all replica-specific information.
*/
-class TAO_LB_ReplicaInfo
+struct TAO_LB_ReplicaInfo
{
-public:
/// Reference to the replica.
CORBA::Object_var replica;
@@ -48,12 +47,10 @@ public:
/// was not created using a GenericFactory.
LoadBalancing::GenericFactory::FactoryCreationId_var factory_creation_id;
- /// Reference to the load monitor residing at the same location the
- /// replica resides.
- LoadBalancing::LoadMonitor_var load_monitor;
-
- /// Average load(s) on the replica
- LoadBalancing::LoadList_var load_list;
+ /// Pointer to the location map entry containing the information
+ /// related to the location the replica corresponding to this
+ /// TAO_LB_ReplicaInfo structure.
+ TAO_LB_Location_Map_Entry *location_entry;
};
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.cpp
index a8d87ce9d48..b1581573a10 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.cpp
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.cpp
@@ -19,12 +19,15 @@ TAO_LoadBalancing_ReplicationManager_i::TAO_LoadBalancing_ReplicationManager_i
(void)
: poa_ (),
lock_ (),
+ location_map_
object_group_map_ (),
property_manager_ (this->object_group_map_),
- generic_factory_ (this->property_manager_,
- this->object_group_map_),
- object_group_manager_ (this->property_manager_,
- this->object_group_map_),
+ generic_factory_ (this->location_map_,
+ this->object_group_map_,
+ this->property_manager_),
+ object_group_manager_ (this->location_map_,
+ this->object_group_map_,
+ this->property_manager_),
balancing_strategy_ (new TAO_LB_Minimum_Dispersion_Strategy) //@@ FIXME!
{
// (void) this->init ();
@@ -57,23 +60,64 @@ TAO_LoadBalancing_ReplicationManager_i::get_load_notifier (
void
TAO_LoadBalancing_ReplicationManager_i::register_load_monitor (
- LoadBalancing::LoadMonitor_ptr /* load_monitor */,
- const LoadBalancing::Location & /* the_location */,
+ LoadBalancing::LoadMonitor_ptr load_monitor,
+ const LoadBalancing::Location &the_location,
CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException))
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ LoadBalancing::MonitorAlreadyPresent))
{
- ACE_THROW (CORBA::NO_IMPLEMENT ());
+ TAO_LB_Location_Map_Entry *location_entry = 0;
+ auto_ptr<TAO_LB_Location_Map_Entry> safe_location_entry;
+
+ int result = this->location_map_.find (the_location,
+ location_entry);
+
+ // If no location entry exists for the given location, then create
+ // and bind a new one.
+ if (result != 0)
+ {
+ ACE_NEW_THROW_EX (location_entry,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+ safe_location_entry = location_entry;
+
+ if (this->location_map_.bind (the_location,
+ location_entry) != 0)
+ ACE_THROW (CORBA::INTERNAL ()); // @@ Pick a better (user?)
+ // exception.
+ }
+ else if (CORBA::is_nil (location_entry->load_monitor))
+ {
+ location_entry->load_monitor =
+ LoadBalancing::LoadMonitor::_duplicate (load_monitor);
+ }
+ else
+ ACE_THROW (LoadBalancing::MonitorAlreadyPresent ());
}
LoadBalancing::LoadMonitor_ptr
TAO_LoadBalancing_ReplicationManager_i::get_load_monitor (
- const LoadBalancing::Location & /* the_location */,
+ const LoadBalancing::Location &the_location,
CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException,
- LoadBalancing::InterfaceNotFound))
+ LoadBalancing::LocationNotFound))
{
- ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ TAO_LB_Location_Map_Entry *location_entry = 0;
+
+ if (this->location_map_.find (the_location,
+ location_entry) == 0)
+ {
+ return
+ LoadBalancing::LoadMonitor::_duplicate (
+ location_entry->load_monitor.in ());
+ }
+
+ ACE_THROW_RETURN (LoadBalancing::LocationNotFound (),
LoadBalancing::LoadMonitor::_nil ());
}
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.h
index 1968d5498dd..0dcecf939e6 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.h
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancingI.h
@@ -64,14 +64,15 @@ public:
LoadBalancing::LoadMonitor_ptr load_monitor,
const LoadBalancing::Location & the_location,
CORBA::Environment &ACE_TRY_ENV = TAO_default_environment ())
- ACE_THROW_SPEC ((CORBA::SystemException));
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ LoadBalancing::MonitorAlreadyPresent));
- /// Return a reference to the load notifier in use.
+ /// Return a reference to the load monitor at the given location.
virtual LoadBalancing::LoadMonitor_ptr get_load_monitor (
const LoadBalancing::Location & the_location,
CORBA::Environment &ACE_TRY_ENV = TAO_default_environment ())
ACE_THROW_SPEC ((CORBA::SystemException,
- LoadBalancing::InterfaceNotFound));
+ LoadBalancing::LocationNotFound));
/**
* @name LoadBalancing::PropertyManager methods
@@ -324,6 +325,11 @@ private:
/// Mutex that provides synchronization.
TAO_SYNCH_MUTEX lock_;
+ /// Table that maps LoadBalancing::Location to load monitor at that
+ /// location, in addition to the replicas residing at that
+ /// location.
+ TAO_LB_Location_Map location_map_;
+
/// Map between RepositoryId, ObjectGroup reference, replica list and
/// factory creation ID.
TAO_LB_ObjectGroup_Map object_group_map_;
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancingI.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancingI.cpp
index a8d87ce9d48..b1581573a10 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancingI.cpp
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancingI.cpp
@@ -19,12 +19,15 @@ TAO_LoadBalancing_ReplicationManager_i::TAO_LoadBalancing_ReplicationManager_i
(void)
: poa_ (),
lock_ (),
+ location_map_
object_group_map_ (),
property_manager_ (this->object_group_map_),
- generic_factory_ (this->property_manager_,
- this->object_group_map_),
- object_group_manager_ (this->property_manager_,
- this->object_group_map_),
+ generic_factory_ (this->location_map_,
+ this->object_group_map_,
+ this->property_manager_),
+ object_group_manager_ (this->location_map_,
+ this->object_group_map_,
+ this->property_manager_),
balancing_strategy_ (new TAO_LB_Minimum_Dispersion_Strategy) //@@ FIXME!
{
// (void) this->init ();
@@ -57,23 +60,64 @@ TAO_LoadBalancing_ReplicationManager_i::get_load_notifier (
void
TAO_LoadBalancing_ReplicationManager_i::register_load_monitor (
- LoadBalancing::LoadMonitor_ptr /* load_monitor */,
- const LoadBalancing::Location & /* the_location */,
+ LoadBalancing::LoadMonitor_ptr load_monitor,
+ const LoadBalancing::Location &the_location,
CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException))
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ LoadBalancing::MonitorAlreadyPresent))
{
- ACE_THROW (CORBA::NO_IMPLEMENT ());
+ TAO_LB_Location_Map_Entry *location_entry = 0;
+ auto_ptr<TAO_LB_Location_Map_Entry> safe_location_entry;
+
+ int result = this->location_map_.find (the_location,
+ location_entry);
+
+ // If no location entry exists for the given location, then create
+ // and bind a new one.
+ if (result != 0)
+ {
+ ACE_NEW_THROW_EX (location_entry,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_DEFAULT_MINOR_CODE,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+ safe_location_entry = location_entry;
+
+ if (this->location_map_.bind (the_location,
+ location_entry) != 0)
+ ACE_THROW (CORBA::INTERNAL ()); // @@ Pick a better (user?)
+ // exception.
+ }
+ else if (CORBA::is_nil (location_entry->load_monitor))
+ {
+ location_entry->load_monitor =
+ LoadBalancing::LoadMonitor::_duplicate (load_monitor);
+ }
+ else
+ ACE_THROW (LoadBalancing::MonitorAlreadyPresent ());
}
LoadBalancing::LoadMonitor_ptr
TAO_LoadBalancing_ReplicationManager_i::get_load_monitor (
- const LoadBalancing::Location & /* the_location */,
+ const LoadBalancing::Location &the_location,
CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException,
- LoadBalancing::InterfaceNotFound))
+ LoadBalancing::LocationNotFound))
{
- ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ TAO_LB_Location_Map_Entry *location_entry = 0;
+
+ if (this->location_map_.find (the_location,
+ location_entry) == 0)
+ {
+ return
+ LoadBalancing::LoadMonitor::_duplicate (
+ location_entry->load_monitor.in ());
+ }
+
+ ACE_THROW_RETURN (LoadBalancing::LocationNotFound (),
LoadBalancing::LoadMonitor::_nil ());
}
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancingI.h b/TAO/orbsvcs/orbsvcs/LoadBalancingI.h
index 1968d5498dd..0dcecf939e6 100644
--- a/TAO/orbsvcs/orbsvcs/LoadBalancingI.h
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancingI.h
@@ -64,14 +64,15 @@ public:
LoadBalancing::LoadMonitor_ptr load_monitor,
const LoadBalancing::Location & the_location,
CORBA::Environment &ACE_TRY_ENV = TAO_default_environment ())
- ACE_THROW_SPEC ((CORBA::SystemException));
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ LoadBalancing::MonitorAlreadyPresent));
- /// Return a reference to the load notifier in use.
+ /// Return a reference to the load monitor at the given location.
virtual LoadBalancing::LoadMonitor_ptr get_load_monitor (
const LoadBalancing::Location & the_location,
CORBA::Environment &ACE_TRY_ENV = TAO_default_environment ())
ACE_THROW_SPEC ((CORBA::SystemException,
- LoadBalancing::InterfaceNotFound));
+ LoadBalancing::LocationNotFound));
/**
* @name LoadBalancing::PropertyManager methods
@@ -324,6 +325,11 @@ private:
/// Mutex that provides synchronization.
TAO_SYNCH_MUTEX lock_;
+ /// Table that maps LoadBalancing::Location to load monitor at that
+ /// location, in addition to the replicas residing at that
+ /// location.
+ TAO_LB_Location_Map location_map_;
+
/// Map between RepositoryId, ObjectGroup reference, replica list and
/// factory creation ID.
TAO_LB_ObjectGroup_Map object_group_map_;