]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres.c
debugging messages
[frescor/fna.git] / src_frescan / frescan_bwres.c
index ebffa1a02469361c771f7c0e72a600e72db44fef..43546026dbea09835f1065b53f42b31b3be23274 100644 (file)
  *
  */
 
+#include "frsh.h"
 #include "frescan_bwres.h"
 #include "frescan_bwres_requests.h"
+#include "frescan_bwres_robjs.h"
 #include "frescan_bwres_messages.h"
 #include "frescan_bwres_threads.h"
 #include "frescan_bwres_analysis.h"
 int frescan_bwres_init(frescan_network_t net)
 {
         int ret;
-        frescan_server_params_t  server_params;  // TODO: improve this...
-        frescan_sa_init_params_t sa_init_params; // TODO: improve this...
-
-        sa_init_params.max_prio = 30;
-        sa_init_params.min_prio = 1;
-
-        ret = frescan_sa_init(&the_networks[net].scenario,
-                              &sa_init_params);
-        if (ret != 0) return ret;
+        frescan_node_t node;
+        frescan_ss_t neg_msg_ss_id;
+        frescan_server_params_t server_params;
+        frescan_bwres_sa_init_params_t init_params;
+        frsh_contract_t neg_msgs_contract;
+        frsh_rel_time_t neg_msgs_budget;
+        frsh_rel_time_t neg_msgs_period;
+
+        init_params.min_prio = FRESCAN_BWRES_SS_MIN_PRIO;
+        init_params.max_prio = FRESCAN_BWRES_SS_MAX_PRIO;
+
+        if (frescan_data[net].local_node == FRESCAN_BWRES_MASTER_NODE) {
+            ret = frescan_bwres_sa_init(&frescan_data[net].scenario,
+                                        &init_params);
+            if (ret != 0) return ret;
+
+            // Add contracts for the negotiation messages
+            ret = frsh_contract_init(&neg_msgs_contract);
+            if (ret != 0) return ret;
+
+            neg_msgs_budget = frsh_usec_to_rel_time(
+                                        (long)FRESCAN_FRAME_TX_TIME_US *
+                                              FRESCAN_BWRES_NEG_MSG_BUDGET);
+
+            neg_msgs_period = frsh_usec_to_rel_time(
+                                        (long)FRESCAN_BWRES_NEG_MSG_PERIOD);
+
+            ret = frsh_contract_set_basic_params(&neg_msgs_contract,
+                                                 &neg_msgs_budget,
+                                                 &neg_msgs_period,
+                                                 FRSH_WT_INDETERMINATE,
+                                                 FRSH_CT_REGULAR);
+            if (ret != 0) return ret;
+
+            ret = frsh_contract_set_preemption_level
+                            (&neg_msgs_contract, FRESCAN_BWRES_NEG_MSG_PRIO);
+            if (ret != 0) return ret;
+
+            for(node=0; node<FRESCAN_MX_NODES; node++) {
+                    ret = freelist_init(&frescan_data[net].scenario.
+                                                        ss_id_freelist[node],
+                                                        FRESCAN_MX_IDS);
+                    if (ret != 0) return ret;
+
+                    ret = freelist_alloc(&frescan_data[net].scenario.
+                                                        ss_id_freelist[node]);
+                    if (ret < 0) return -1;
+
+                    neg_msg_ss_id = (frescan_ss_t)ret;
+
+                    DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                          "manager node:%u b:(%d,%d) t:(%d,%d) p:%u ss:%u\n",
+                          node,
+                          neg_msgs_budget.tv_sec, neg_msgs_budget.tv_nsec,
+                          neg_msgs_period.tv_sec, neg_msgs_period.tv_nsec,
+                          FRESCAN_BWRES_NEG_MSG_PRIO,
+                          neg_msg_ss_id);
+
+                    ret = frescan_bwres_sa_add_contract
+                                    (&frescan_data[net].scenario,
+                                     neg_msg_ss_id,
+                                     node,
+                                     &neg_msgs_contract);
+                    if (ret != 0) return ret;
+            }
+        }
 
-        server_params.budget = 5;
-        server_params.period.tv_sec = 1;
-        server_params.period.tv_nsec = 0;
-        server_params.prio = FRESCAN_BWRES_NEG_MESSAGES_PRIO;
+        server_params.budget = FRESCAN_BWRES_NEG_MSG_BUDGET;
+        server_params.period = frsh_rel_time_to_timespec(
+                                        frsh_usec_to_rel_time(
+                                        (long)FRESCAN_BWRES_NEG_MSG_PERIOD));
+        server_params.prio   = FRESCAN_BWRES_NEG_MSG_PRIO;
 
         ret = frescan_servers_create(net, &server_params,
-                                     &the_networks[net].neg_messages_ss_id);
+                                     &frescan_data[net].neg_messages_ss_id);
         if (ret != 0) return ret;
 
-        // TODO: we have to add this negotiation contracts to the sa table
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "neg_msg_ss_id: %u\n",
+              frescan_data[net].neg_messages_ss_id);
 
-        ret = frescan_bwres_robjs_init(FRESCAN_REPLY_OBJECTS_MX_CEILING);
+        ret = frescan_bwres_robjs_init(FRESCAN_BWRES_ROBJS_MX_CEILING);
         if (ret != 0) return ret;
 
-        ret = frescan_requests_init(FRESCAN_REQUESTS_MX_CEILING);
+        ret = frescan_bwres_requests_init(FRESCAN_BWRES_REQ_MX_CEILING);
         if (ret != 0) return ret;
 
         ret = frescan_messages_init(net);
@@ -123,55 +184,86 @@ int frescan_bwres_init(frescan_network_t net)
 }
 
 /**
- * frescan_bwres_negotiate()
+ * frescan_bwres_group_change_mode_sync()
  *
- * to negotiate a contract we follow the next steps:
- *
- * 1.- prepare a request
+ * 1.- allocate and prepare the GN request
  * 2.- enqueue the request
  * 3.- wait in the reply object for a reply
- * 4.- return the final values and free the request
+ *     (unless there are only cancellations)
+ * 4.- free the request
  */
 
-int frescan_bwres_negotiate(frescan_network_t net,
-                            const frsh_contract_t *contract,
-                            frescan_ss_t *ss,
-                            bool *accepted)
+int frescan_bwres_group_change_mode_sync
+                (frescan_network_t            net,
+                 const frsh_contracts_group_t *contracts_to_neg,
+                 const frsh_contracts_group_t *contracts_to_reneg,
+                 const frescan_ss_group_t     *ss_to_reneg,
+                 const frescan_ss_group_t     *ss_to_cancel,
+                 frescan_ss_group_t           *ss_new,
+                 bool                         *accepted)
 {
         int ret;
-        frescan_request_id_t   req;
-        frescan_request_data_t *req_data;
-        frescan_server_params_t server_params;
+        frescan_bwres_request_id_t req;
+        frescan_bwres_request_data_t *req_data;
 
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing a negotiation request\n");
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing a GN request\n");
 
-        ret = frescan_requests_alloc(&req);
+        ret = frescan_bwres_requests_alloc(&req);
         if (ret != 0) return ret;
 
-        ret = frescan_requests_get_data(req, &req_data);
+        ret = frescan_bwres_requests_get_data(req, &req_data);
         if (ret != 0) return ret;
 
-        req_data->type         = FRESCAN_REQ_NEG;
-        req_data->req          = req;
-        req_data->contract     = (frsh_contract_t *)contract;
-        req_data->request_node = the_networks[net].local_node;
         req_data->net          = net;
+        req_data->type         = FRESCAN_BWRES_REQ_GN;
+        req_data->req          = req;
+        req_data->request_node = frescan_data[net].local_node;
+
+        if (contracts_to_neg == NULL) {
+                req_data->contracts_to_neg = &req_data->contracts_to_neg_data;
+                req_data->contracts_to_neg->size = 0;
+        } else {
+                req_data->contracts_to_neg =
+                                (frsh_contracts_group_t *)contracts_to_neg;
+        }
 
-        ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
-        if (ret != 0) return ret;
+        if (contracts_to_reneg == NULL) {
+                req_data->contracts_to_reneg = &req_data->
+                                                       contracts_to_reneg_data;
+                req_data->contracts_to_reneg->size = 0;
+        } else {
+                req_data->contracts_to_reneg = (frsh_contracts_group_t *)
+                                contracts_to_reneg;
+        }
 
-        // NOTE: we preallocate a server for the negotiation process
-        server_params.budget = 0;
-        server_params.period.tv_sec = 0;
-        server_params.period.tv_nsec = 0;
-        server_params.prio   = 0;
+        if (ss_to_reneg == NULL) {
+                req_data->ss_to_reneg = &req_data->ss_to_reneg_data;
+                req_data->ss_to_reneg->size = 0;
+        } else {
+                req_data->ss_to_reneg = (frescan_ss_group_t *)ss_to_reneg;
+        }
+
+        if (ss_to_cancel == NULL) {
+                req_data->ss_to_cancel = &req_data->ss_to_cancel_data;
+                req_data->ss_to_cancel->size = 0;
+        } else {
+                req_data->ss_to_cancel = (frescan_ss_group_t *)ss_to_cancel;
 
-        ret = frescan_servers_create(net, &server_params, &req_data->ss);
+        }
+
+        if (ss_new == NULL) {
+                req_data->ss_new = &req_data->ss_new_data;
+                req_data->ss_new->size = 0;
+        } else {
+                req_data->ss_new = ss_new;
+        }
+
+        ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
         if (ret != 0) return ret;
 
         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue the negotiation request\n");
 
-        ret = frescan_requests_enqueue(req);
+        ret = frescan_bwres_requests_enqueue(req);
         if (ret != 0) return ret;
 
         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n");
@@ -183,98 +275,76 @@ int frescan_bwres_negotiate(frescan_network_t net,
         if (ret != 0) return ret;
 
         switch (req_data->return_value) {
-        case FRESCAN_REQ_ACCEPTED:
-                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
-                *accepted = true;
-                *ss = req_data->ss;
-                server_params = req_data->final_values;
-                ret = frescan_servers_update(net, &server_params, *ss);
-                if (ret != 0) return ret;
-                break;
-
-        case FRESCAN_REQ_NOT_ACCEPTED:
-                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
-                *accepted = false;
-                ret = frescan_servers_destroy(net, req_data->ss);
-                if (ret != 0) return ret;
-                break;
-
-        default:
-                FRESCAN_ERROR("return_value unknown\n");
-                return -1;
+                case FRESCAN_BWRES_REQ_ACCEPTED:
+                        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
+                        *accepted = true;
+                        break;
+
+                case FRESCAN_BWRES_REQ_NOT_ACCEPTED:
+                        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
+                        *accepted = false;
+                        break;
+
+                default:
+                        FRESCAN_ERROR("return_value unknown\n");
+                        return -1;
         }
 
-        frescan_requests_free(req);
+        ret = frescan_bwres_requests_free(req);
+        if (ret != 0) return ret;
+
         return 0;
 }
 
 /**
- * frescan_bwres_renegotiate()
+ * frescan_bwres_negotiate()
  */
 
-int frescan_bwres_renegotiate(frescan_network_t net,
-                              const frsh_contract_t *contract,
-                              frescan_ss_t ss,
-                              bool *accepted)
+int frescan_bwres_negotiate(frescan_network_t net,
+                            const frsh_contract_t *contract,
+                            frescan_ss_t *ss,
+                            bool *accepted)
 {
         int ret;
-        frescan_request_id_t   req;
-        frescan_request_data_t *req_data;
-        frescan_server_params_t server_params;
-
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing renegotiation request\n");
+        frsh_contracts_group_t contracts_to_neg;
+        frescan_ss_group_t ss_new;
 
-        ret = frescan_requests_alloc(&req);
-        if (ret != 0) return ret;
-
-        ret = frescan_requests_get_data(req, &req_data);
-        if (ret != 0) return ret;
-
-        req_data->type         = FRESCAN_REQ_RENEG;
-        req_data->req          = req;
-        req_data->contract     = (frsh_contract_t *)contract;
-        req_data->request_node = the_networks[net].local_node;
-        req_data->net          = net;
-        req_data->ss           = ss;
+        contracts_to_neg.size = 1;
+        contracts_to_neg.contracts[0] = *contract;
 
-        ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
+        ret = frescan_bwres_group_change_mode_sync
+                        (net, &contracts_to_neg, NULL, NULL,
+                         NULL, &ss_new, accepted);
         if (ret != 0) return ret;
 
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue renegotiation request\n");
+        if (*accepted) {
+                *ss = ss_new.ss[0];
+        }
 
-        ret = frescan_requests_enqueue(req);
-        if (ret != 0) return ret;
+        return 0;
+}
 
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n");
+/**
+ * frescan_bwres_renegotiate()
+ */
 
-        ret = frescan_bwres_robjs_wait(req_data->robj);
-        if (ret != 0) return ret;
+int frescan_bwres_renegotiate(frescan_network_t net,
+                              const frsh_contract_t *contract,
+                              frescan_ss_t ss,
+                              bool *accepted)
+{
+        frsh_contracts_group_t contracts_to_reneg;
+        frescan_ss_group_t ss_to_reneg;
 
-        ret = frescan_bwres_robjs_free(req_data->robj);
-        if (ret != 0) return ret;
+        contracts_to_reneg.size = 1;
+        contracts_to_reneg.contracts[0] = *contract;
 
-        switch (req_data->return_value) {
-        case FRESCAN_REQ_ACCEPTED:
-                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "renegotiation OK\n");
-                *accepted = true;
-                server_params = req_data->final_values;
-                ret = frescan_servers_update(net, &server_params, ss);
-                if (ret != 0) return ret;
-                break;
-
-        case FRESCAN_REQ_NOT_ACCEPTED:
-                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
-                *accepted = false;
-                if (ret != 0) return ret;
-                break;
-
-        default:
-                FRESCAN_ERROR("return_value unknown\n");
-                return -1;
-        }
+        ss_to_reneg.size = 1;
+        ss_to_reneg.ss[0] = ss;
 
-        frescan_requests_free(req);
-        return 0;
+        return frescan_bwres_group_change_mode_sync
+                (net, NULL, &contracts_to_reneg, &ss_to_reneg,
+                 NULL, NULL, accepted);
 }
 
 /**
@@ -284,43 +354,11 @@ int frescan_bwres_renegotiate(frescan_network_t net,
 int frescan_bwres_cancel(frescan_network_t net,
                          frescan_ss_t      ss)
 {
-        int ret;
-        frescan_request_id_t   req;
-        frescan_request_data_t *req_data;
+        frescan_ss_group_t ss_to_cancel;
 
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing cancel request\n");
+        ss_to_cancel.size = 1;
+        ss_to_cancel.ss[0] = ss;
 
-        ret = frescan_requests_alloc(&req);
-        if (ret != 0) return ret;
-
-        ret = frescan_requests_get_data(req, &req_data);
-        if (ret != 0) return ret;
-
-        req_data->type         = FRESCAN_REQ_CANCEL;
-        req_data->req          = req;
-        req_data->request_node = the_networks[net].local_node;
-        req_data->net          = net;
-        req_data->ss           = ss;
-
-        ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
-        if (ret != 0) return ret;
-
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue cancel request\n");
-
-        ret = frescan_requests_enqueue(req);
-        if (ret != 0) return ret;
-
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a signal\n");
-
-        ret = frescan_bwres_robjs_wait(req_data->robj);
-        if (ret != 0) return ret;
-
-        ret = frescan_bwres_robjs_free(req_data->robj);
-        if (ret != 0) return ret;
-
-        ret = frescan_servers_destroy(net, ss);
-        if (ret != 0) return ret;
-
-        frescan_requests_free(req);
-        return 0;
+        return frescan_bwres_group_change_mode_sync
+                        (net, NULL, NULL, NULL, &ss_to_cancel, NULL, NULL);
 }