diff options
author | dengg <dengg@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2006-01-20 01:04:02 +0000 |
---|---|---|
committer | dengg <dengg@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2006-01-20 01:04:02 +0000 |
commit | 692f1cadd0e96dc23f02266b8ff3c427ca177c4c (patch) | |
tree | 7249c8701072503a4023dc9784c54a6835b6aa31 | |
parent | b3bc1526b1a63974207b49f16c9a8f135de4fc62 (diff) | |
download | ATCD-692f1cadd0e96dc23f02266b8ff3c427ca177c4c.tar.gz |
*** empty log message ***
13 files changed, 161 insertions, 55 deletions
diff --git a/TAO/CIAO/DAnCE/DomainApplicationManager/DomainApplicationManager_Impl.cpp b/TAO/CIAO/DAnCE/DomainApplicationManager/DomainApplicationManager_Impl.cpp index 46563fe6e7e..3d989ddbc26 100644 --- a/TAO/CIAO/DAnCE/DomainApplicationManager/DomainApplicationManager_Impl.cpp +++ b/TAO/CIAO/DAnCE/DomainApplicationManager/DomainApplicationManager_Impl.cpp @@ -1059,12 +1059,8 @@ destroyApplication (ACE_ENV_SINGLE_ARG_DECL) CIAO_TRACE("CIAO::DomainApplicationManager_Impl::destroyApplication"); ACE_TRY { - CORBA::ULong i; - - // Invoke ciao_passivate () operation on each cached NodeApplication object. - for (i = 0; i < this->num_child_plans_; ++i) + for (CORBA::ULong i = 0; i < this->num_child_plans_; ++i) { - // Get the NodeApplication object references. ACE_Hash_Map_Entry <ACE_CString, Chained_Artifacts> *entry = 0; if (this->artifact_map_.find (this->node_manager_names_[i], @@ -1072,52 +1068,59 @@ destroyApplication (ACE_ENV_SINGLE_ARG_DECL) { ACE_ERROR ((LM_ERROR, "DAnCE (%P|%t) DomainApplicationManager_Impl.cpp -" - "CIAO::DomainApplicationManager_Impl::destroyApplication -" + "CIAO::DomainApplicationManager_Impl::destroyApplication -" "ERROR while finding the node specific plan " "for the node [%s] \n", this->node_manager_names_[i].c_str ())); - ACE_TRY_THROW (Deployment::StopError ()); + ACE_CString error + ("Unable to resolve a reference to NodeManager: "); + error += this->node_manager_names_[i]; + + ACE_TRY_THROW + (Deployment::StopError + ("DomainApplicationManager_Impl::destroyApplication", + error.c_str ())); } + // Invoke ciao_passivate () operation on each cached NodeApplication object. ::Deployment::NodeApplication_ptr my_na = (entry->int_id_).node_application_.in (); my_na->ciao_passivate (); - ACE_TRY_CHECK; - } - // Invoke destroyManager() operation on each cached - // NodeManager object. - for (i = 0; i < this->num_child_plans_; ++i) - { - // Get the NodeManager and NodeApplicationManager object references. - ACE_Hash_Map_Entry <ACE_CString, Chained_Artifacts> *entry; + Deployment::Connections * my_connections = + this->get_outgoing_connections ( + (entry->int_id_).child_plan_.in (), + true, // yes, get *all* the connections + true // yes, we search the current plan + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - if (this->artifact_map_.find (this->node_manager_names_[i], - entry) != 0) + // Invoke finishLaunch() on NodeApplication to remove bindings. + if (my_connections->length () != 0) { - ACE_ERROR ((LM_ERROR, - "DAnCE (%P|%t) DomainApplicationManager_Impl.cpp -" - "CIAO::DomainApplicationManager_Impl::destroyApplication -" - "ERROR while finding the node specific plan " - "for the node [%s] \n", - this->node_manager_names_[i].c_str ())); - - ACE_TRY_THROW (Deployment::StopError ()); + entry->int_id_.node_application_->finishLaunch + (*my_connections, + start, + true // "true" => remove new connections only + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; } - ::Deployment::NodeApplicationManager_ptr - my_node_application_manager = - (entry->int_id_).node_application_manager_.in (); + // Invoke destroyPlan() operation on the NodeManager + Deployment::NodeManager_var + my_node_manager = (entry->int_id_).node_manager_; - // Invoke destoryApplication() operation on the NodeApplicationManger. - // Since we have the first arg is not used by NAM anyway. - my_node_application_manager->destroyApplication - (0 - ACE_ENV_ARG_PARAMETER); + my_node_manager->destroyPlan ((entry->int_id_).child_plan_ + ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; } + + // Invoke destroyManager () operation on the NodeManager, since we need + // to clean up all the NodeApplicationManagers associated with this deployment + // plan (one NodeApplicationManager per Node per plan). + } ACE_CATCHANY { @@ -1216,7 +1219,7 @@ perform_redeployment ( // node level, the connections are cached within the NodeApplication *and* // Container, then we should modify the implementation of the // <finishLaunch> on the NodeApplication to accomplish this. - this->finishLaunch (true, true); // true means start activtion also. + this->finishLaunch (true, true); // true means start activation also. // ture means "ReDAC" is desired } ACE_CATCHANY diff --git a/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.cpp b/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.cpp index c9cf6be6adf..759a1c9bc1b 100644 --- a/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.cpp +++ b/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.cpp @@ -15,6 +15,12 @@ namespace CIAO { } + size_t + DAM_Map::size (void) + { + return this->map_.current_size (); + } + bool DAM_Map::is_plan_available (const ACE_CString &str) { diff --git a/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.h b/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.h index 21d8dee5de9..2be163c6908 100644 --- a/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.h +++ b/TAO/CIAO/DAnCE/ExecutionManager/DAM_Map.h @@ -52,6 +52,8 @@ namespace CIAO get_dams (ACE_ENV_SINGLE_ARG_DECL); bool unbind_dam (const ACE_CString &str); + + size_t size (void); private: typedef diff --git a/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.cpp b/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.cpp index 5584a411771..c7af75c6f11 100644 --- a/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.cpp +++ b/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.cpp @@ -122,6 +122,14 @@ namespace CIAO return this->map_.get_dams (ACE_ENV_SINGLE_ARG_PARAMETER); } + Deployment::DomainApplicationManager_ptr + Execution_Manager_Impl::getManager (const char * plan_uuid + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, Deployment::PlanNotExist)) + { + return this->map_.fetch_dam_reference (plan_uuid); + } + void Execution_Manager_Impl::destroyManager ( Deployment::DomainApplicationManager_ptr manager diff --git a/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.h b/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.h index 4f70b234edc..7f6e3ab87dd 100644 --- a/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.h +++ b/TAO/CIAO/DAnCE/ExecutionManager/Execution_Manager_Impl.h @@ -61,6 +61,12 @@ namespace CIAO getManagers (ACE_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)); + // Below method is CIAO specific extension + virtual Deployment::DomainApplicationManager_ptr + getManager (const char * plan_uuid + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, Deployment::PlanNotExist)); + virtual void destroyManager (Deployment::DomainApplicationManager_ptr manager ACE_ENV_ARG_DECL_WITH_DEFAULTS) diff --git a/TAO/CIAO/DAnCE/NodeApplication/NodeApplication_Impl.cpp b/TAO/CIAO/DAnCE/NodeApplication/NodeApplication_Impl.cpp index 94abc352a09..36966457426 100644 --- a/TAO/CIAO/DAnCE/NodeApplication/NodeApplication_Impl.cpp +++ b/TAO/CIAO/DAnCE/NodeApplication/NodeApplication_Impl.cpp @@ -66,8 +66,9 @@ CIAO::NodeApplication_Impl::finishLaunch ( { ACE_UNUSED_ARG (start); - // parameter "true" means we want to establish new connections - // instead of "remove" existing connections. + // If parameter "is_ReDAC" is true, then it means we want to "remove" + // existing connections. Otherwise, it means we want to "add" new + // connections this->finishLaunch_i (providedReference, start, is_ReDAC); } diff --git a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager.mpc b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager.mpc index 4a78aabaa86..03e89656275 100644 --- a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager.mpc +++ b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager.mpc @@ -1,9 +1,10 @@ -// -*- MPC -*- + // -*- MPC -*- // $Id$ project(NodeApplicationManager): ciao_component_dnc, ciao_deployment_svnt { sharedname = NodeApplicationManager + after += NodeManager_stub idlflags += -Wb,export_include=CIAO_NAM_Export.h -Wb,export_macro=CIAO_NAM_Export dynamicflags = CIAO_NAM_BUILD_DLL diff --git a/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.cpp b/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.cpp index 0cb007b85b0..6803f142b25 100644 --- a/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.cpp +++ b/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.cpp @@ -319,8 +319,50 @@ CIAO::NodeManager_Impl_Base::destroyManager ACE_ENDTRY; } +void +CIAO::NodeManager_Impl_Base:: +destroyPlan (const Deployment::DeploymentPlan & plan + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((::CORBA::SystemException, + ::Deployment::StopError)) +{ + // Update the reference counting map (subtract by 1 for each instance) + // If the ref count becomes 0, then remove this component, otherwise, + // we should remove the necesary bindings on this component specified + // in the deployment plan. + + // Create a list of components that are not to be removed, and send + // this list to the NAM, who will delegate to appropriate NAs to + // remove bindings from these components. + + // The problem is that we probably also want to call another NAM, which + // manages the shared components in a different child plan. :( + + + // Find the NAM from the map and invoke the destroyPlan() operation on + // it, which will actuall remove components and connections in this plan. + // If + CORBA::Object_var obj = + this->poa_->id_to_reference (this->map_.get_nam (plan.UUID.in ())); + ACE_TRY_CHECK; + + Deployment::NodeApplicationManager_var nam = + Deployment::NodeApplicationManager::_narrow (obj.in ()); + ACE_TRY_CHECK; + + nam->destroyApplication (0); + + + + // The problem is that we should NOT actually kill the NA process if + // there are some components that are shared by other plans. + +} + + bool -CIAO::NodeManager_Impl_Base::validate_plan (const Deployment::DeploymentPlan &plan) +CIAO::NodeManager_Impl_Base:: +validate_plan (const Deployment::DeploymentPlan &plan) { const char * resource_id = 0; CORBA::ULong i = 0; diff --git a/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.h b/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.h index 2dc4b11ebac..6eb12a49433 100644 --- a/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.h +++ b/TAO/CIAO/DAnCE/NodeManager/NodeManager_Impl.h @@ -95,6 +95,13 @@ namespace CIAO Deployment::StopError, Deployment::InvalidReference)); + // CIAO specific extension, which is particularly useful for dealing with + // shared components issue + virtual void destroyPlan (const Deployment::DeploymentPlan & plan + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((::CORBA::SystemException, + ::Deployment::StopError)); + // ********* CIAO Specific Helper functions ************ virtual const ::Components::FacetDescriptions & @@ -111,7 +118,6 @@ namespace CIAO set_all_consumers (ACE_CString &name, const ::Components::ConsumerDescriptions_var & consumers); - private: /// Validate the child deployment plan. In particular, we are /// trying to verify that all the component instances within this diff --git a/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher.mpc b/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher.mpc index 20921a279e8..41a34263764 100644 --- a/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher.mpc +++ b/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher.mpc @@ -3,17 +3,18 @@ project(Plan_Launcher_Impl) : ciao_component_dnc, ciao_config_handlers { sharedname = Plan_Launcher_Impl - after += ExecutionManager_stub NodeDaemon_stub + after += ExecutionManager_stub libs += ExecutionManager_stub dynamicflags = PLAN_LAUNCHER_IMPL_BUILD_DLL Source_Files { Plan_Launcher_Impl.cpp - DAM_Map.cpp + ../ExecutionManager/DAM_Map.cpp } Header_Files { + ../ExecutionManager/DAM_Map.h Plan_Launcher_Impl_Export.h } } diff --git a/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.cpp b/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.cpp index c31d32be127..eaec59004f8 100644 --- a/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.cpp +++ b/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.cpp @@ -228,20 +228,29 @@ namespace CIAO bool Plan_Launcher_i::teardown_plan (const char *uuid) { - size_t map_size = this->map_.size (); + // Since people could always run another instance of the Plan_Launcher + // executable to tear down a plan, so we could NOT rely on the local + // DAM_Map to fetch DAM obj reference. Instead, we make a remote call + // on ExecutionManager to fetch it. + ACE_TRY + { + ::Deployment::DomainApplicationManager_var dapp_mgr = + this->em_->getManager (uuid); - if (!this->map_.is_plan_available (uuid)) - return false; - - ::Deployment::DomainApplicationManager_var dapp_mgr - (this->map_.fetch_dam_reference (uuid)); - - dapp_mgr->destroyApplication (); - if (CIAO::debug_level ()) - ACE_DEBUG ((LM_DEBUG, "[success]\n")); + dapp_mgr->destroyApplication (); + if (CIAO::debug_level ()) + ACE_DEBUG ((LM_DEBUG, "[success]\n")); + + this->destroy_dam (dapp_mgr.in ()); + } + ACE_CATCHANY + { + ACE_DEBUG ((LM_ERROR, "Unable to find DomainApplicationManager " + "for plan with uuid: %s\n", uuid)); + return false; + } + ACE_ENDTRY; - this->map_.unbind_dam (uuid); - return true; } @@ -258,7 +267,7 @@ namespace CIAO if (CIAO::debug_level ()) ACE_DEBUG ((LM_DEBUG, "[success]\n")); - this->destroy_dam (dam); + this->destroy_dam (dam); return true; } diff --git a/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.h b/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.h index a58c95f1434..0993b6bf46a 100644 --- a/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.h +++ b/TAO/CIAO/DAnCE/Plan_Launcher/Plan_Launcher_Impl.h @@ -82,7 +82,6 @@ namespace CIAO /// Local map for DAMs, to save expensive UUID lookups. Execution_Manager::DAM_Map map_; - }; } diff --git a/TAO/CIAO/ciao/Deployment.idl b/TAO/CIAO/ciao/Deployment.idl index 11eabc058c9..a5534b06517 100644 --- a/TAO/CIAO/ciao/Deployment.idl +++ b/TAO/CIAO/ciao/Deployment.idl @@ -40,6 +40,10 @@ module Deployment { exception InvalidReference { }; + // Below exception types are CIAO specific + exception PlanNotExist { + }; + interface ApplicationManager { Application startLaunch (in Properties configProperty, out Connections providedReference, @@ -72,9 +76,11 @@ module Deployment { void start () raises (StartError); + // CIAO speicifc extension void destroyApplication () raises (StopError); + // CIAO specific extension to destroy NodeApplicationManager void destroyManager () raises (StopError); @@ -95,7 +101,12 @@ module Deployment { DomainApplicationManager preparePlan (in DeploymentPlan plan, in boolean commitResources) raises (ResourceNotAvailable, PlanError, StartError); + DomainApplicationManagers getManagers (); + + DomainApplicationManager getManager (in string plan_uuid) + raises (PlanNotExist); + void destroyManager (in DomainApplicationManager manager) raises (StopError); @@ -162,11 +173,22 @@ module Deployment { void joinDomain (in Domain ciao_domain, in TargetManager manager, in Logger log); + void leaveDomain (); + NodeApplicationManager preparePlan (in DeploymentPlan plan) raises (StartError, PlanError); + void destroyManager (in NodeApplicationManager appManager) raises (StopError, InvalidReference); + + // CIAO specific extension + // Destroy the NAM and all the associated NAs with this child_plan + // We can guarantee that the input DeploymentPlan is valid, since it + // is fetched from the cached DeploymentPlan of DAM, which has been + // validated before. + void destroyPlan (in DeploymentPlan plan) + raises (StopError); }; interface RepositoryManager { |