X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/blobdiff_plain/15fdbd05d7021ea54ff1519a8086bc335cd4415e..e1cc80051455d1a561c136c8b04abc86c3d67d9a:/src_frescan/frescan_bwres_threads.c diff --git a/src_frescan/frescan_bwres_threads.c b/src_frescan/frescan_bwres_threads.c index cde05b0..e4efcc4 100644 --- a/src_frescan/frescan_bwres_threads.c +++ b/src_frescan/frescan_bwres_threads.c @@ -70,6 +70,7 @@ #include "frescan_bwres_messages.h" #include "frescan_bwres_requests.h" #include "frescan_bwres_analysis.h" +#include "frescan_bwres_mode_change.h" #include "frescan_config.h" #include "frescan_debug.h" #include "frescan_data.h" @@ -180,7 +181,7 @@ static void *frescan_manager_thread(void *arg) frescan_manager_repneg(req_data); break; default: - ERROR("request type not supported\n"); + FRESCAN_ERROR("request type not supported\n"); assert(0); } @@ -226,48 +227,70 @@ static void frescan_manager_neg(frescan_request_data_t *req_data) DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "negotiation request\n"); if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) { - // scheduling analysis + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "add contract to scenario\n"); + ret = frescan_sa_add_contract (&the_networks[req_data->net].scenario, - req_data->contract, req_data->ss, - req_data->request_node); + req_data->request_node, + req_data->contract); + assert(ret == 0); + + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "assign priorities\n"); + + ret = frsh_sa_assign_priorities + (&the_networks[req_data->net].scenario); assert(ret == 0); + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "perform sched analysis\n"); + ret = frescan_sa_sched_test (&the_networks[req_data->net].scenario, &accepted); assert(ret == 0); if (accepted) { - ret = frescan_sa_get_final_values - (&the_networks[req_data->net].scenario, - req_data->ss, - req_data->request_node, - &req_data->final_values); + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "schedulable! distribute spare capacity\n"); + + ret = frescan_sa_spare_capacity + (&the_networks[req_data->net].scenario); assert(ret == 0); + req_data->return_value = FRESCAN_REQ_ACCEPTED; + + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "perform the mode change protocol!\n"); + + ret = frescan_bwres_mode_change_protocol(req_data); + assert(ret == 0); } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "not schedulable!\n"); + ret = frescan_sa_remove_contract (&the_networks[req_data->net].scenario, req_data->ss, req_data->request_node); assert(ret == 0); - req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED; - } - // signal or reply the results - if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) { - DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n"); - ret = frescan_bwres_robjs_signal(req_data->robj); - assert(ret == 0); - } else { - DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, - "master external, sending reply\n"); + req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED; - req_data->type = FRESCAN_REP_NEG; - ret = frescan_messages_send_request(req_data); - assert(ret == 0); + if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "signal local request\n"); + ret = frescan_bwres_robjs_signal(req_data->robj); + assert(ret == 0); + } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "sending reply\n"); + req_data->type = FRESCAN_REP_NEG; + ret = frescan_messages_send_request(req_data); + assert(ret == 0); + } } } else { DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, @@ -284,8 +307,8 @@ static void frescan_manager_neg(frescan_request_data_t *req_data) static void frescan_manager_reneg(frescan_request_data_t *req_data) { int ret; - bool accepted; - frescan_contract_t old_contract; + bool is_schedulable; + frsh_contract_t old_contract; DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n"); @@ -299,19 +322,36 @@ static void frescan_manager_reneg(frescan_request_data_t *req_data) &old_contract); assert(ret == 0); + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "assign priorities\n"); + + ret = frsh_sa_assign_priorities + (&the_networks[req_data->net].scenario); + assert(ret == 0); + + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "perform sched analysis\n"); + ret = frescan_sa_sched_test (&the_networks[req_data->net].scenario, - &accepted); + &is_schedulable); assert(ret == 0); if (accepted) { - ret = frescan_sa_get_final_values - (&the_networks[req_data->net].scenario, - req_data->ss, - req_data->request_node, - &req_data->final_values); + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "schedulable! distribute spare capacity\n"); + + ret = frescan_sa_spare_capacity + (&the_networks[req_data->net].scenario); assert(ret == 0); + req_data->return_value = FRESCAN_REQ_ACCEPTED; + + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "perform the mode change protocol!\n"); + + ret = frescan_bwres_mode_change_protocol(req_data); + assert(ret == 0); } else { ret = frescan_sa_update_contract (&the_networks[req_data->net].scenario, @@ -328,13 +368,6 @@ static void frescan_manager_reneg(frescan_request_data_t *req_data) DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n"); ret = frescan_bwres_robjs_signal(req_data->robj); assert(ret == 0); - } else { - DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, - "master external, sending reply\n"); - - req_data->type = FRESCAN_REP_NEG; - ret = frescan_messages_send_request(req_data); - assert(ret == 0); } } else { DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, @@ -351,6 +384,7 @@ static void frescan_manager_reneg(frescan_request_data_t *req_data) static void frescan_manager_cancel(frescan_request_data_t *req_data) { int ret; + bool is_schedulable; DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n"); @@ -360,6 +394,33 @@ static void frescan_manager_cancel(frescan_request_data_t *req_data) req_data->ss, req_data->request_node); assert(ret == 0); + + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "assign priorities\n"); + + ret = frsh_sa_assign_priorities + (&the_networks[req_data->net].scenario); + assert(ret == 0); + + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "perform sched analysis\n"); + + ret = frescan_sa_sched_test + (&the_networks[req_data->net].scenario, + &is_schedulable); + assert(ret == 0); + + assert(is_schedulable == true); + + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "redistribute spare capacity\n"); + + ret = frescan_sa_spare_capacity + (&the_networks[req_data->net].scenario); + assert(ret == 0); + + ret = frescan_bwres_mode_change_protocol(req_data); + assert(ret == 0); } else { DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "send cancel request to master\n");