]> rtime.felk.cvut.cz Git - frescor/fna.git/commitdiff
tested negotiation in slave and in master.. it seems to work good with the new struct...
authorsangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Fri, 18 Apr 2008 08:50:18 +0000 (08:50 +0000)
committersangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Fri, 18 Apr 2008 08:50:18 +0000 (08:50 +0000)
git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1123 35b4ef3e-fd22-0410-ab77-dab3279adceb

src_frescan/frescan_bwres.c
src_frescan/frescan_bwres_messages.c
src_frescan/frescan_bwres_requests.c
src_frescan/frescan_bwres_threads.c

index b85342ceb6118f773f7b58794e7cc1349ff96c0c..875138f1324bd0ddeeb8a166d3c811b4b36e97f0 100644 (file)
@@ -82,6 +82,7 @@ int frescan_bwres_negotiate(frescan_network_t net,
         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 a negotiation request\n");
 
@@ -100,6 +101,14 @@ int frescan_bwres_negotiate(frescan_network_t net,
         ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
         if (ret != 0) return ret;
 
+        // NOTE: we preallocate a server for the negotiation process
+        server_params.values.budget = contract->min_values.budget;
+        server_params.values.period = contract->min_values.period;
+        server_params.prio          = contract->prio;
+
+        ret = frescan_servers_create(net, &server_params, &req_data->ss);
+        if (ret != 0) return ret;
+
         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue the negotiation request\n");
 
         ret = frescan_requests_enqueue(req);
@@ -122,11 +131,15 @@ int frescan_bwres_negotiate(frescan_network_t net,
 
                 case FRESCAN_REQ_NOT_ACCEPTED:
                         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
+                        ret = frescan_servers_destroy(net, req_data->ss);
+                        if (ret != 0) return ret;
                         ret = -1;
                         break;
 
                 case FRESCAN_REQ_ERROR:
                         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation ERROR\n");
+                        ret = frescan_servers_destroy(net, req_data->ss);
+                        if (ret != 0) return ret;
                         ret = -1;
                         break;
 
@@ -135,9 +148,7 @@ int frescan_bwres_negotiate(frescan_network_t net,
                         return -1;
         }
 
-        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "free the request\n");
-
         frescan_requests_free(req);
 
-        return ret;
+        return ret; // TODO: distinguish errors and failed negotiations
 }
index 29d1d0dd1b51b336348be5fe1048fbea56c097eb..df69e1f5267d17cebb0e391a56c18b8ac6421794 100644 (file)
@@ -271,15 +271,19 @@ int frescan_messages_send_request(const frescan_request_data_t *req_data)
         switch(req_data->type) {
                 case FRESCAN_REQ_NEG:
                         size = frescan_request_to_neg_message(req_data, msg);
+                        send_params[req_data->net].to = FRESCAN_NEG_MASTER_NODE;
                         break;
                 case FRESCAN_REQ_RENEG:
                         size = frescan_request_to_reneg_message(req_data, msg);
+                        send_params[req_data->net].to = FRESCAN_NEG_MASTER_NODE;
                         break;
                 case FRESCAN_REQ_CANCEL:
                         size = frescan_request_to_cancel_message(req_data, msg);
+                        send_params[req_data->net].to = FRESCAN_NEG_MASTER_NODE;
                         break;
                 case FRESCAN_REP_NEG:
                         size = frescan_request_to_repneg_message(req_data, msg);
+                        send_params[req_data->net].to = req_data->request_node;
                         break;
                 default:
                         ERROR("request type not supported\n");
@@ -351,193 +355,3 @@ int frescan_messages_recv_request(frescan_network_t    net,
                         return -1;
         }
 }
-
-/*
-
-int frescan_message_parse(frescan_network_t net,
-                          const uint8_t *msg,
-                          size_t size,
-                          frescan_node_t from)
-{
-        int ret;
-        frescan_msg_type_t type;
-        size_t num;
-        uint8_t *tmp;
-        frescan_contract_t contract;
-        frescan_request_id_t request_id;
-        frescan_robj_id_t reply;
-        uint8_t reply_msg[200];
-        int accepted;
-        frescan_neg_return_info_t *neg_return_info;
-        int bytes_to_send;
-        frescan_send_params_t params;
-        frescan_server_params_t server_params;
-
-        params.net = net;
-        params.channel = FRESCAN_NEG_CHANNEL;
-        params.flags = FRESCAN_SS | FRESCAN_ASYNC;
-        params.ss = the_networks[net].neg_messages_ss_id;
-        params.to  = from;
-
-        tmp = (uint8_t *)msg;
-        type = (frescan_msg_type_t)*msg;
-        tmp++;
-
-        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-              "parsing message, type:%u, size:%u\n", type, size);
-
-        switch (type) {
-                case FRESCAN_MSG_TYPE_NEG:
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "FRESCAN_MSG_TYPE_NEG\n");
-
-                        num = 2;
-                        memcpy(&request_id, tmp, num);
-                        tmp = tmp + num;
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "request id: %d (2 bytes)\n", request_id);
-
-                        num = sizeof(frescan_contract_t);
-                        memcpy(&contract, tmp, num);
-                        tmp = tmp + num;
-
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "contract (%d bytes)\n", num);
-
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "min_budget:%u max_period:(%u,%u)\n",
-                              contract.min_values.budget,
-                              contract.min_values.period.tv_sec,
-                              contract.min_values.period.tv_nsec);
-
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "max_budget:%u min_period:(%u,%u)\n",
-                              contract.max_values.budget,
-                              contract.max_values.period.tv_sec,
-                              contract.max_values.period.tv_nsec);
-
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "prio:%u\n", contract.prio);
-
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "TODO: sched test and add contract to table\n");
-//                         accepted = 1;
-//                         server_params.values.budget = contract.min_values.budget;
-//                         server_params.values.period = contract.min_values.period;
-//                         server_params.prio = contract.prio;
-                        FRESCAN_ACQUIRE_LOCK(&the_networks[net].lock);
-                        accepted = 1;
-                        FRESCAN_RELEASE_LOCK(&the_networks[net].lock);
-
-                        server_params.values.budget = 69;
-                        server_params.values.period.tv_sec = 33;
-                        server_params.values.period.tv_nsec = 666;
-                        server_params.prio = 2;
-
-                        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
-                              "accepted:%u send results, net:%u to:%u ss:%u\n",
-                              accepted, params.net, params.to, params.ss);
-
-                        bytes_to_send = frescan_repneg_message_create
-                                                (reply_msg,
-                                                request_id,
-                                                accepted,
-                                                &server_params);
-
-                        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
-                                "bytes_to_send:%u\n", bytes_to_send);
-
-                        if (bytes_to_send <= 0) {
-                                ERROR("creating reply_msg to neg\n");
-                                return -1;
-                        }
-
-                        ret = frescan_send(&params, reply_msg, bytes_to_send);
-                        if (ret != 0) {
-                                ERROR("error while sending neg request to master\n");
-                                return ret;
-                        }
-                        break;
-
-                case FRESCAN_MSG_TYPE_REP_NEG:
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "FRESCAN_MSG_TYPE_REP_NEG\n");
-
-                        num = 2;
-                        memcpy(&request_id, tmp, num);
-                        tmp = tmp + num;
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "request id: %d (2 bytes)\n", request_id);
-
-                        ret = frescan_request_get_return_info
-                                        (request_id,
-                                        (void *)&neg_return_info);
-                        if (ret != 0) {
-                                ERROR("error getting final_values_ref\n");
-                                return ret;
-                        }
-
-                        accepted = (int)*tmp;
-                        tmp++;
-
-                        if (accepted) {
-                                DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                                      "contract accepted:%d\n", accepted);
-                                neg_return_info->error = 0;
-
-                                num = sizeof(frescan_budget_period_t);
-                                memcpy(&server_params.values, tmp, num);
-                                tmp = tmp + num;
-
-                                DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                                      "final budget:%u period:(%u,%u)\n",
-                                      server_params.values.budget,
-                                      server_params.values.period.tv_sec,
-                                      server_params.values.period.tv_nsec);
-
-                                num = 1;
-                                memcpy(&server_params.prio, tmp, num);
-                                tmp = tmp + num;
-
-                                DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                                      "server prio:%u\n", server_params.prio);
-
-                                DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                                      "create sporadic server with results\n");
-
-                                ret = frescan_servers_create(net,
-                                                &server_params,
-                                                &neg_return_info->id);
-                                if (ret != 0) {
-                                        ERROR("error creating server\n");
-                                        return ret;
-                                }
-                        } else {
-                                DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                                      "contract not accepted:%d\n", accepted);
-                                neg_return_info->error = -1;
-                        }
-
-                        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
-                              "signal the request id with the results\n");
-
-                        ret = frescan_request_get_reply(request_id, &reply);
-                        if (ret != 0) {
-                                ERROR("error getting reply object\n");
-                                return ret;
-                        }
-
-                        ret = frescan_replyobject_signal(reply);
-                        if (ret != 0) {
-                                ERROR("error while sending neg request to master\n");
-                                return ret;
-                        }
-                        break;
-
-                default:
-                        ERROR("type not known %u\n", type);
-                        return -1;
-        }
-
-        return 0;
-}*/
index b21db8826afecfff329e97fd30729b3208100cda..4ab7de7b229a93be06caa6a33e1635b5c00c95d3 100644 (file)
@@ -83,6 +83,8 @@ int frescan_requests_alloc(frescan_request_id_t *req)
 {
         int err, pos;
 
+        DEBUG(FRESCAN_REQUESTS_ENABLE_DEBUG, "alloc\n");
+
         if (is_initialized == false) return -1;
 
         err = fosa_mutex_lock(&requests_mutex);
@@ -115,6 +117,8 @@ int frescan_requests_free(frescan_request_id_t req)
 {
         int err;
 
+        DEBUG(FRESCAN_REQUESTS_ENABLE_DEBUG, "free\n");
+
         if (is_initialized == false) return -1;
 
         err = fosa_mutex_lock(&requests_mutex);
index a083d3eb060c776e461eacbc002b2244a8ae6600..86eda2e28ad147ca817a20306dba30447fde2305 100644 (file)
@@ -176,6 +176,7 @@ static void frescan_manager_neg(frescan_request_data_t *req_data)
 
         if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
 
+                // NOTE: req_data->ss is an INPUT parameter
                 accepted = true; // TODO: sched analysis
                 ret = 0;  // TODO: sched analysis
 
@@ -188,17 +189,20 @@ static void frescan_manager_neg(frescan_request_data_t *req_data)
                 }
 
                 if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
-                        DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "local\n");
+                        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, "external\n");
-                        req_data->type = FRESCAN_REP_NEG;
+                        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,
+                      "send negotiation request to master\n");
                 ret = frescan_messages_send_request(req_data);
                 assert(ret == 0);
         }
@@ -228,5 +232,16 @@ static void frescan_manager_cancel(frescan_request_data_t *req_data)
 
 static void frescan_manager_repneg(frescan_request_data_t *req_data)
 {
+        int ret;
+        frescan_request_data_t *neg_req_data;
+
         DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "reply to neg request\n");
+
+        ret = frescan_requests_get_data(req_data->req, &neg_req_data);
+        assert(ret == 0);
+
+        neg_req_data->return_value = req_data->return_value;
+
+        ret = frescan_bwres_robjs_signal(neg_req_data->robj);
+        assert(ret == 0);
 }