]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_threads.c
added the functions to renegotiate and cancel a contract. TODO: there is a bug when...
[frescor/fna.git] / src_frescan / frescan_bwres_threads.c
index 3216a1b2779c40fbbeb0cd2d79e5342537bff1fe..ef750b8b7beb1dfe0cbe3dbc7e22eba9b2d32212 100644 (file)
@@ -135,7 +135,7 @@ static void *frescan_manager_thread(void *arg)
                 }
 
                 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);
                 }
         }
@@ -233,20 +233,98 @@ 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;
+
         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)