diff options
Diffstat (limited to 'CIAO/DAnCE/TM_Daemon/DomainDataManager.cpp')
-rw-r--r-- | CIAO/DAnCE/TM_Daemon/DomainDataManager.cpp | 614 |
1 files changed, 64 insertions, 550 deletions
diff --git a/CIAO/DAnCE/TM_Daemon/DomainDataManager.cpp b/CIAO/DAnCE/TM_Daemon/DomainDataManager.cpp index 45f1de77f7a..a3b24bd1c99 100644 --- a/CIAO/DAnCE/TM_Daemon/DomainDataManager.cpp +++ b/CIAO/DAnCE/TM_Daemon/DomainDataManager.cpp @@ -9,16 +9,14 @@ #include <orbsvcs/CosNamingC.h> -#include <fstream> - const char * domain_file_name = "Domain.cdd"; CIAO::DomainDataManager* CIAO::DomainDataManager::global_data_manager_ = 0; -CIAO::DomainDataManager * CIAO::DomainDataManager::create (CORBA::ORB_ptr orb, - ::Deployment::TargetManager_ptr target, - const char* dat_file - ) +CIAO::DomainDataManager * +CIAO::DomainDataManager::create (CORBA::ORB_ptr orb, + ::Deployment::TargetManager_ptr target, + const char* dat_file) { if (global_data_manager_ == 0) { @@ -50,116 +48,72 @@ int CIAO::DomainDataManager::update_domain ( // Update the subset of the domain which the above // parameter corresponds to - ACE_DEBUG ((LM_DEBUG, "THe update domain called\n")); + // ACE_DEBUG ((LM_DEBUG, "[TM] Update domain called\n")); //check the type of update .. - ex_occur = false; + this->update_dynamic (domainSubset); + +// switch (update_kind) +// { +// case ::Deployment::UpdateAll: +// case ::Deployment::UpdateDynamic: +// this->update_dynamic (domainSubset); +// break; + +// case ::Deployment::Add: +// ex_occur = true; +// break; +// default: +// return 1; +// } + return 0; - switch (update_kind) - { - case ::Deployment::UpdateAll: - case ::Deployment::UpdateDynamic: - break; - case ::Deployment::Add: - ex_occur = true; - //add_to_domain (domainSubset); - break; - case ::Deployment::Delete: - delete_from_domain (domainSubset); - break; - default: - break; - } +} +int +CIAO::DomainDataManager::update_dynamic (const ::Deployment::Domain + &domainSubset) +{ CORBA::ULong const size = current_domain_.node.length (); + this->node_info_map_ [domainSubset.node[0].name.in ()] = domainSubset.node[0]; - if (ex_occur == false) - { - ACE_GUARD_RETURN (ACE_Thread_Mutex, guard, lock, 0); - - Profile_Code prfTagg ("Tagg"); - - prfTagg.start (); - - CORBA::ULong i; - for (i=0;i < size;i++) - { - if (!ACE_OS::strcmp (domainSubset.node[0].name , - current_domain_.node[i].name)) - { - // found a match - // for now overwrite the entire Node info ... - // but later , this has to be changed to overwrite - // only the specific part ... - current_domain_.node[i] = domainSubset.node[0]; - - CORBA::Double load; - current_domain_.node[i].resource[0].property[0].value >>= load; - ACE_DEBUG ((LM_DEBUG, "The current load is %f\n", load)); - break; // finished job ...break - } - } - if (i == size) - { - // thus the node is new .. add it to current_domain_ - // later change it ... - current_domain_.node.length (size+1); - current_domain_.node[size]=domainSubset.node[0]; - } - prfTagg.stop (); - - } - - - profile_nodes_[domainSubset.node[0].name.in ()]->stop (); + int temp_count; + this->mutex_.acquire (); this->response_count_++; + temp_count = this->response_count_; + this->mutex_.release (); - if (this->response_count_ == current_domain_.node.length ()) + if (temp_count == current_domain_.node.length ()) { - this->got_all_response_ = true; - // all responses have come in .... now time stamp the event this->profile_->stop (); + this->profile_->dump (); + for (std::map<std::string, Profile_Code*>::iterator itr = this->profile_nodes_.begin (); + itr != this->profile_nodes_.end (); + itr++) + { + (*itr).second->dump (); - // now delete the object then file will be closed .. - delete this->profile_; - } + } + this->got_all_response_ = true; - if (ex_occur = true) - return 0; + } - CORBA::ULong response_time; + // CORBA::Double load; + // domainSubset.node[0].resource[0].property[0].value >>= load; + // ACE_DEBUG ((LM_DEBUG, "The current load is %f\n", load)); - domainSubset.node[0].qos_seq[0].value >>= response_time; - ACE_DEBUG ((LM_DEBUG, "The response time is %u\n", response_time)); + profile_nodes_[domainSubset.node[0].name.in ()]->stop (); -/* - CORBA::Double cpu_load; - CORBA::Double na_load; - for (CORBA::ULong i =0; - i < domainSubset.node[0].resource.length (); - i++) - { - if (!strcmp (domainSubset.node[0].resource[i].name.in (), "NA_Monitor")) - domainSubset.node[0].resource[i].property[0].value >>= na_load; + // CORBA::ULong response_time; - if (!strcmp (domainSubset.node[0].resource[i].name.in (), "Processor")) - domainSubset.node[0].resource[i].property[0].value >>= cpu_load; - } -*/ -// std::ofstream out (domainSubset.node[0].name.in (), std::ios::app); -// out << cpu_load -// << "\t" -// << na_load -// << "\t" -// << response_time -// << std::endl; + // domainSubset.node[0].qos_seq[0].value >>= response_time; -// out.close (); + // ACE_DEBUG ((LM_DEBUG, "The response time is %u\n", response_time)); return 0; } @@ -170,8 +124,8 @@ DomainDataManager (CORBA::ORB_ptr orb, const char* dat_file) : orb_ (CORBA::ORB::_duplicate (orb)), deployment_config_ (orb_.in()), - target_mgr_ (::Deployment::TargetManager::_duplicate(target)), - dat_file_ (dat_file) + dat_file_ (dat_file), + profile_ (new Profile_Code ("Tst")) { CIAO::Config_Handlers::DD_Handler dd (domain_file_name); ::Deployment::Domain* dmn = dd.domain_idl (); @@ -182,34 +136,19 @@ DomainDataManager (CORBA::ORB_ptr orb, current_domain_ = *dmn; initial_domain_ = current_domain_; - // initialize the provisioning domain - provisioned_data_ = initial_domain_; - - update_node_status (); + // update_node_status (); - // set up the profile timers for each node + // set up the profile timers for each node for (int i = 0;i < current_domain_.node.length ();i++) { profile_nodes_[current_domain_.node[i].name.in ()] = - new Profile_Code (current_domain_.node[i].name.in ()); + new Profile_Code (current_domain_.node[i].name.in ()); } - - call_all_node_managers (); } -::Deployment::Domain* CIAO::DomainDataManager::get_current_domain () -{ - return new ::Deployment::Domain (provisioned_data_); -} - -::Deployment::Domain* CIAO::DomainDataManager::get_initial_domain () -{ - return new ::Deployment::Domain (initial_domain_); -} - int CIAO::DomainDataManager::readin_domain_data () { // here read in Domain data ... @@ -268,7 +207,7 @@ int CIAO::DomainDataManager::call_all_node_managers () { ACE_DEBUG ((LM_DEBUG, "CAlling Join DOmain\n")); node_manager->joinDomain (sub_domain, - target_mgr_.in (), + NULL, log); } catch (CORBA::Exception& ex) @@ -284,207 +223,6 @@ int CIAO::DomainDataManager::call_all_node_managers () } -void CIAO::DomainDataManager -::commitResources ( - const ::Deployment::DeploymentPlan & plan) -{ - // commit the resources - // parse into the plan and commit resources ... - - // set the action value - current_action_ = commit; - - // temporary created to guard against exceptions - ::Deployment::Domain temp_provisioned_data = - provisioned_data_; - - for (CORBA::ULong i = 0;i < plan.instance.length ();i++) - { - for (CORBA::ULong j = 0;j < temp_provisioned_data.node.length ();j++) - { - if (!ACE_OS::strcmp (plan.instance[i].node.in () , - temp_provisioned_data.node[j].name.in ())) - { - try { - match_requirement_resource ( - plan.instance[i].deployedResource, - temp_provisioned_data.node[j].resource); - } - catch (::Deployment::ResourceCommitmentFailure& ex) - { - // catch the exception and add parameters - throw ex; - } - } - } - } - - // here commit the commitresources - provisioned_data_ = temp_provisioned_data; -} - - -void CIAO::DomainDataManager:: -releaseResources ( - const ::Deployment::DeploymentPlan& plan) -{ - // release the resources - - - // set the action value - current_action_ = release; - - for (CORBA::ULong i = 0;i < plan.instance.length ();i++) - { - for (CORBA::ULong j = 0;j < provisioned_data_.node.length ();j++) - { - if (!ACE_OS::strcmp (plan.instance[i].node.in () , - provisioned_data_.node[j].name.in ())) - { - match_requirement_resource ( - plan.instance[i].deployedResource, - provisioned_data_.node[j].resource); - - } - } - } - -} - - -void CIAO::DomainDataManager:: -match_requirement_resource ( - ::Deployment::InstanceResourceDeploymentDescriptions deployed, - ::Deployment::Resources & available - ) -{ - // here match the deployed to the available - - for (CORBA::ULong i = 0;i < deployed.length ();i++) - { - // for each deployed resource ....search the corresponding - // available resource - for (CORBA::ULong j = 0;j < available.length ();j++) - { - if (!ACE_OS::strcmp (deployed[i].requirementName, available[j].name)) - { - if (CIAO::debug_level () > 9) - // search for the resourcename in the resourceType - for (CORBA::ULong k = 0;k < available[j].resourceType.length ();k++) - { - if (!ACE_OS::strcmp (deployed[i].resourceName, - available[j].resourceType[k])) - { - try { - match_properties (deployed[i].property, - available[j].property); - } - catch (::Deployment::ResourceCommitmentFailure& ex) - { - // catch the exception and add parameters - throw ex; - } - } - } - } - } - } - -} - -void CIAO::DomainDataManager:: -match_properties ( - ::Deployment::Properties deployed, - ::Deployment::SatisfierProperties & available) -{ - bool property_found; - - for (CORBA::ULong i = 0;i < deployed.length ();i++) - { - property_found = false; - - for (CORBA::ULong j = 0;j < available.length ();j++) - { - if (!ACE_OS::strcmp (deployed[i].name , available[j].name)) - { - // check kind here ....and then subtract .... - // accordingly , ..this is complex ... better to write - // some specialised algo - // for now assuming Capacity .... - // and tk_double .... - - commit_release_resource (deployed[i] , available[j]); - property_found = true; - } - } // internal for .... - - // check if property was found or not - if (property_found == false) - { - // throw an error since property was not found in the Resource - ::Deployment::ResourceCommitmentFailure failure; - - failure.reason = CORBA::string_dup ("Property Not Found\n"); - failure.propertyName = CORBA::string_dup (deployed[i].name); - failure.propertyValue.length (0); - - throw failure; - } - } // outside for ... -} - -void CIAO::DomainDataManager::commit_release_resource ( - ::Deployment::Property & deployed, - ::Deployment::SatisfierProperty & available) -{ - if (current_action_ == commit) - { - - CORBA::Long required_d; - - if ((deployed.value >>= required_d) == false) - ACE_ERROR ((LM_ERROR, "Failed to extract required amount\n")); - - CORBA::Long available_d; - - if ((available.value >>= available_d) == false) - ACE_ERROR ((LM_ERROR, "failed to extract available amount\n")); - - if (available_d >= required_d) - { - available_d = available_d - required_d; - - available.value <<= available_d; - } - else - { - ::Deployment::ResourceCommitmentFailure failure; - - failure.reason = CORBA::string_dup ("Insufficient resources!"); - failure.propertyName = CORBA::string_dup (available.name); - failure.propertyValue.length (1); - failure.propertyValue[0] = available.value; - - throw failure; - } - } - else - { - //must be release - // @todo check return value of >>= - CORBA::Long required_d; - deployed.value >>= required_d; - CORBA::Long available_d; - available.value >>= available_d; - - available_d = available_d + required_d; - - // Should we check for bin > 100 ?????? - - available.value <<= available_d; - } -} - void CIAO::DomainDataManager::stop_monitors () { @@ -527,230 +265,6 @@ void CIAO::DomainDataManager::stop_monitors () } -int CIAO::DomainDataManager::add_to_domain ( - const ::Deployment::Domain& domain) -{ - // here add the domain to the Domain - // right now use only a node - - // got to take care of the fact , that a node can be added , - // while it is still in the domain - - //iterate through the supplied domain - //for each node - // find it in the pristine domain - // and copy it back to the provisioned_domain - - for (CORBA::ULong i = 0;i < domain.node.length ();i++) - { - //find in the pristine domain - ::Deployment::Node a_node; - - if (!this->find_in_initial_domain (domain.node[i].name.in (), - a_node)) - continue; // dont know this node - - //check if already present - if (!this->find_in_provisioned_domain (domain.node[i].name.in (), - a_node)) - { - // add the node to the domain ... - provisioned_data_.node.length (provisioned_data_.node.length () + 1); - provisioned_data_.node[provisioned_data_.node.length () - 1] = - a_node; - } - } - - return 0; -} - -bool CIAO::DomainDataManager:: -find_in_initial_domain (const char* node_name, - ::Deployment::Node& node) -{ - for (CORBA::ULong i =0; - i < this->initial_domain_.node.length (); - i++) - { - if (ACE_OS::strcmp (node_name, this->initial_domain_.node[i].name.in ()) == 0) - { - node = this->initial_domain_.node[i]; - return true; - } - } - - // not found the node , return a node with an empty name - return false; -} - - -bool CIAO::DomainDataManager:: -find_in_provisioned_domain (const char* node_name, - ::Deployment::Node& node) -{ - for (CORBA::ULong i =0; - i < this->provisioned_data_.node.length (); - i++) - { - if (ACE_OS::strcmp (node_name, this->provisioned_data_.node[i].name.in ()) == 0) - { - node = this->provisioned_data_.node[i]; - return true; - } - } - - // not found the node , return a node with an empty name - return false; -} - -int CIAO::DomainDataManager::delete_from_domain ( - const ::Deployment::Domain& domain) -{ - // validate input - if (domain.node.length () == 0) - return 1; - - if (domain.node.length () > - this->provisioned_data_.node.length ()) - return 0; - - //algo : parse through the provisioned_data - // for each node , find in the deleted domain list - // if not found add it to the updated nodes list - - ::Deployment::Nodes updated_nodes; - bool found = false; - - for (CORBA::ULong j = 0; - j < this->provisioned_data_.node.length (); - j++) - { - found = false; - - for (CORBA::ULong i = 0;i < domain.node.length ();i++) - { - if (ACE_OS::strcmp (domain.node[i].name.in (), - this->provisioned_data_.node[j].name.in ()) == 0) - { - found = true; - break; // found the node - } - } - if (found) - continue; - - // not found in the deleted list - - // update the length of the list - updated_nodes.length (updated_nodes.length () + 1); - - // copy the node info - updated_nodes[updated_nodes.length () - 1] = - this->provisioned_data_.node[j]; - - } // for provisioned_data - - // here update the provisioned data - this->provisioned_data_.node = updated_nodes; - - return 1; -} - -int CIAO::DomainDataManager::intimate_planner ( - const ::Deployment::Domain& domain) -{ - // use the connection with the planner and get a reference to the planner - // make a call top the planner - Deployment::Domain d = domain; - return 0; - -} - -bool CIAO::DomainDataManager::update_node_status () -{ - // update the node status here ... - return 0; -} - -void CIAO::DomainDataManager::commitResourceAllocation ( - const ::Deployment::ResourceAllocations & resources) -{ - // commit the resources - // parse into the plan and commit resources ... - - // set the action value - current_action_ = commit; - - this->commit_release_RA (resources); -} - -void CIAO::DomainDataManager::releaseResourceAllocation ( - const ::Deployment::ResourceAllocations & resources) -{ - // set the action value - current_action_ = release; - - this->commit_release_RA (resources); -} - - -int CIAO::DomainDataManager:: -commit_release_RA (const ::Deployment::ResourceAllocations& resources) -{ - // temporary used to guard against exceptions - temp_provisioned_data_ = provisioned_data_; - - - for (CORBA::ULong i = 0;i < resources.length ();i++) - { - try - { - ::Deployment::Resource& res = find_resource (resources[i]); - - match_properties (resources[i].property , res.property); - } - catch (::Deployment::ResourceCommitmentFailure& ex) - { - // catch the exception and add parameters - ACE_ERROR ((LM_ERROR, "Caught the Exception in releaseResourceAllocation\n")); - ex.index = i; - throw ex; - } - } - - // here commit the commitresources - provisioned_data_ = temp_provisioned_data_; - - return 0; -} - -::Deployment::Resource& -CIAO::DomainDataManager::find_resource ( - const ::Deployment::ResourceAllocation& resource) -{ - // for now search the resource in the Node sequence; Later need - // to add it to the Bridges and Interconnects too according to the - // spec - for (CORBA::ULong j = 0;j < this->temp_provisioned_data_.node.length ();j++) - { - if (!ACE_OS::strcmp (resource.elementName.in () , - this->temp_provisioned_data_.node[j].name.in ())) - { - for (CORBA::ULong k =0; - k < this->temp_provisioned_data_.node[j].resource.length (); - k++) - { - if (!ACE_OS::strcmp (this->temp_provisioned_data_.node[j].resource[k].name.in (), - resource.resourceName.in ())) - return this->temp_provisioned_data_.node[j].resource[k];//resource found here, return - } - - // resource not found - throw ::Deployment::ResourceCommitmentFailure ().reason = CORBA::string_dup ("Resource Not Found\n"); - } - } - throw ::Deployment::ResourceCommitmentFailure ().reason = CORBA::string_dup ("Resource Not Found\n"); -} int CIAO::DomainDataManager::get_monitor_obj_ref () { @@ -772,29 +286,27 @@ int CIAO::DomainDataManager::get_monitor_obj_ref () naming_context->resolve (name); node_monitors_.push_back (Onl_Monitor::NM_Monitor::_narrow (object.in ())); } + return 0; + } -void CIAO::DomainDataManager::get_all_data (Onl_Monitor::AMI_NM_MonitorHandler_ptr handler) +void +CIAO::DomainDataManager::get_all_data (Onl_Monitor::AMI_NM_MonitorHandler_ptr + handler) { this->got_all_response_ = false; + this->mutex_.acquire (); this->response_count_ = 0; + this->mutex_.release (); - Profile_Code profiler ("Tout"); - - this->profile_ = new Profile_Code ("Tst"); this->profile_->start (); - - for (int i = 0;i < node_monitors_.size ();i++) { - profiler.start (); - + profile_nodes_[current_domain_.node[i].name.in ()]->start (); node_monitors_[i]->sendc_get_resource_data (handler); - - profiler.stop (); } } @@ -812,6 +324,8 @@ start_monitor_qos (Onl_Monitor::AMI_NM_MonitorHandler_ptr handler, { node_monitors_[i]->sendc_monitor_app_QoS (handler, plan); } + return 0; + } void |