diff options
author | Ossama Othman <ossama-othman@users.noreply.github.com> | 2001-06-21 04:12:09 +0000 |
---|---|---|
committer | Ossama Othman <ossama-othman@users.noreply.github.com> | 2001-06-21 04:12:09 +0000 |
commit | 85774468ea596af18f4d83c04de36974b2bad92c (patch) | |
tree | c95044e8892e2887abf4a653336fd658f6eb5f84 | |
parent | 5aecb73a31e6a0a0758e2ff19c17fb22b7fb144b (diff) | |
download | ATCD-85774468ea596af18f4d83c04de36974b2bad92c.tar.gz |
*** empty log message ***
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_; |