]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres.c
added the functions to renegotiate and cancel a contract. TODO: there is a bug when...
[frescor/fna.git] / src_frescan / frescan_bwres.c
index 33918f2032073877c972651ba097752283e96def..f45fb8a9f50d482568ad075ec78737d239d3ae18 100644 (file)
@@ -81,12 +81,11 @@ int frescan_bwres_init(frescan_network_t net)
  * 2.- enqueue the request
  * 3.- wait in the reply object for a reply
  * 4.- return the final values and free the request
- *
  */
 
 int frescan_bwres_negotiate(frescan_network_t net,
                             const frescan_contract_t *contract,
-                            frescan_ss_t *id,
+                            frescan_ss_t *ss,
                             bool *accepted)
 {
         int ret;
@@ -133,27 +132,146 @@ 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;
-                        *id = req_data->ss;
-                        server_params.prio = req_data->final_values.server_prio;
-                        ret = frescan_servers_update(net, &server_params, *id);
-                        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:
-                        ERROR("return_value unknown\n");
-                        return -1;
+        case FRESCAN_REQ_ACCEPTED:
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
+                *accepted = true;
+                *ss = req_data->ss;
+                server_params.prio = req_data->final_values.server_prio;
+                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:
+                ERROR("return_value unknown\n");
+                return -1;
         }
 
         frescan_requests_free(req);
         return 0;
 }
+
+/**
+ * frescan_bwres_renegotiate()
+ */
+
+int frescan_bwres_renegotiate(frescan_network_t net,
+                              const frescan_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");
+
+        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     = (frescan_contract_t *)contract;
+        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 renegotiation request\n");
+
+        ret = frescan_requests_enqueue(req);
+        if (ret != 0) return ret;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\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;
+
+        switch (req_data->return_value) {
+        case FRESCAN_REQ_ACCEPTED:
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "renegotiation OK\n");
+                *accepted = true;
+                server_params.values.budget = contract->min_values.budget;
+                server_params.values.period = contract->min_values.period;
+                server_params.prio = req_data->final_values.server_prio;
+                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:
+                ERROR("return_value unknown\n");
+                return -1;
+        }
+
+        frescan_requests_free(req);
+        return 0;
+}
+
+/**
+ * frescan_bwres_cancel()
+ */
+
+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;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing cancel request\n");
+
+        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;
+}