]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_threads.c
changes to use the FRSH FSA module to do the analysis and spare capacity. TODO: finis...
[frescor/fna.git] / src_frescan / frescan_bwres_threads.c
index cde05b008018cf2c428f1f90d48e94e62debbffb..e4efcc426df8049c1bb65b91345d6e60786ba79e 100644 (file)
@@ -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");