}
if(req_data->request_node != the_networks[net].local_node) {
- ret = frescan_requests_free(req);
+ ret = frescan_requests_free(req); // acceptor request
assert(ret == 0);
}
}
static void frescan_manager_reneg(frescan_request_data_t *req_data)
{
+ int ret;
+ bool accepted;
+ frescan_contract_t old_contract;
+
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n");
+
+ if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+ // scheduling analysis
+ ret = frescan_sa_update_contract
+ (&the_networks[req_data->net].scenario,
+ req_data->ss,
+ req_data->request_node,
+ req_data->contract,
+ &old_contract);
+ assert(ret == 0);
+
+ 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);
+ assert(ret == 0);
+ req_data->return_value = FRESCAN_REQ_ACCEPTED;
+ } else {
+ ret = frescan_sa_update_contract
+ (&the_networks[req_data->net].scenario,
+ req_data->ss,
+ req_data->request_node,
+ &old_contract,
+ NULL);
+ 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->type = FRESCAN_REP_NEG;
+ ret = frescan_messages_send_request(req_data);
+ assert(ret == 0);
+ }
+ } else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "send renegotiation request to master\n");
+ ret = frescan_messages_send_request(req_data);
+ assert(ret == 0);
+ }
}
/**
- * frescan_manager_neg
+ * frescan_manager_cancel
*/
static void frescan_manager_cancel(frescan_request_data_t *req_data)
{
+ int ret;
+
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n");
+
+ if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+ ret = frescan_sa_remove_contract
+ (&the_networks[req_data->net].scenario,
+ req_data->ss,
+ req_data->request_node);
+ assert(ret == 0);
+ } else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "send cancel request to master\n");
+ ret = frescan_messages_send_request(req_data);
+ assert(ret == 0);
+ }
+
+ if (req_data->request_node == the_networks[req_data->net].local_node) {
+ ret = frescan_bwres_robjs_signal(req_data->robj);
+ assert(ret == 0);
+ }
}
/**
- * frescan_manager_neg
+ * frescan_manager_repneg
*/
static void frescan_manager_repneg(frescan_request_data_t *req_data)