]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
fcb: Handle transaction cancelation - not tested
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 25 Jun 2010 14:18:34 +0000 (16:18 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 25 Jun 2010 14:18:34 +0000 (16:18 +0200)
fres/cbroker/fcb.c

index 5d7018d3ae5778bbc2c5b8154eb49ace61a5dc2a..40b17ebad8ebc2f8812a808b8247dbaaa7dc469a 100644 (file)
@@ -1254,12 +1254,37 @@ negotiate_transaction(fres_contract_broker _obj,
                ret = errno;
                goto err_cancel_reservation;
        }
+       enum { NONE, CANCELATION, NEGOTIATION } op = NONE;
        for (i = 0; i < num; i++) {
-               tran_contract_insert_at(ft, fcb_contracts[i], i);
-               fcb_contracts[i]->transaction = ft;
+               fc =  fcb_contracts[i];
+               if (fc->requested_contract &&
+                   fres_contract_get_num_blocks(fc->requested_contract) == 0) {
+                       assert(i == 0 || op == CANCELATION);
+                       op = CANCELATION;
+                       /* TODO: Review and test transaction cancelation!!! */
+                       fcb_contract_delete(fcb, fc);
+                       /* Note: requested_contract is also pointed by
+                        * contracts parameter and will be freed by FORB. */
+                       fc->requested_contract = NULL;
+                       fcb_contract_destroy(fc);
+               } else {
+                       assert(i == 0 || op == NEGOTIATION);
+                       op = NEGOTIATION;
+                       tran_contract_insert_at(ft, fc, i);
+                       fc->transaction = ft;
+               }
+       }
+       switch (op) {
+       case NEGOTIATION:
+               fcb_transaction_insert(fcb, ft);
+               break;
+       case CANCELATION:
+               fcb_transaction_delete(fcb, ft);
+               fcb_transaction_destroy(ft);
+               break;
+       default:
+               assert(false);
        }
-       fcb_transaction_insert(fcb, ft);
-       
        res_array_delete_all(&res_array);
        return 0;
 err_cancel_reservation: