From: sangorrin Date: Fri, 18 Apr 2008 08:50:18 +0000 (+0000) Subject: tested negotiation in slave and in master.. it seems to work good with the new struct... X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/commitdiff_plain/855a5416fbf9f5a3b6cd92a8b54001e4501af31d tested negotiation in slave and in master.. it seems to work good with the new structures too. And its much simpler and clear! wohooo!! TODO: do the scheduling analysis with the API that is already done but for the moment use a utilization analysis, then allow renegotiations and cancelling of contracts... finally implement modifications to the posix sporadic server... do testing, measures and the deliverable... (the spare capacity will have to wait i guess..) git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1123 35b4ef3e-fd22-0410-ab77-dab3279adceb --- diff --git a/src_frescan/frescan_bwres.c b/src_frescan/frescan_bwres.c index b85342c..875138f 100644 --- a/src_frescan/frescan_bwres.c +++ b/src_frescan/frescan_bwres.c @@ -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 } diff --git a/src_frescan/frescan_bwres_messages.c b/src_frescan/frescan_bwres_messages.c index 29d1d0d..df69e1f 100644 --- a/src_frescan/frescan_bwres_messages.c +++ b/src_frescan/frescan_bwres_messages.c @@ -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(¶ms, 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; -}*/ diff --git a/src_frescan/frescan_bwres_requests.c b/src_frescan/frescan_bwres_requests.c index b21db88..4ab7de7 100644 --- a/src_frescan/frescan_bwres_requests.c +++ b/src_frescan/frescan_bwres_requests.c @@ -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); diff --git a/src_frescan/frescan_bwres_threads.c b/src_frescan/frescan_bwres_threads.c index a083d3e..86eda2e 100644 --- a/src_frescan/frescan_bwres_threads.c +++ b/src_frescan/frescan_bwres_threads.c @@ -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); }