#include <forb/proto_inet.h>
#endif
+#define COMPILE_TIME_ASSERT(cond, msg) \
+ typedef char msg[(cond) ? 1 : -1]
+
+
UL_LOG_CUST(ulogd_fcb);
ul_log_domain_t ulogd_fcb = {UL_LOGL_MSG, "main"};
UL_LOGREG_SINGLE_DOMAIN_INIT_FUNCTION(init_ulogd_fcb, ulogd_fcb);
* Contract broker data
*/
struct fcb {
+ fres_contract_id_t contract_counter;
gavl_cust_root_field_t resources; /**< Registered resources */
gavl_cust_root_field_t contracts; /**< Contracts negotiated by this FCB */
};
if (fres_contract_id_is_empty(&c->id)) {
/* Normal negotiation request */
- forb_uuid_generate((forb_uuid_t *)&c->id);
+ COMPILE_TIME_ASSERT(sizeof(c->id) == sizeof(fcb->contract_counter),
+ wrong_size_of_contract_id);
+ c->id = ++fcb->contract_counter;
fc = fcb_contract_new(&c->id);
if (!fc)
return errno;
ul_logerr("Contract reservation error %d\n", ret);
ret = FRES_ERR_ADMISSION_TEST;
goto err_free;
- }
- ret = 0;
+ } else if (ret == 0)
+ ret = FRSH_NO_ERROR;
+ else if (ret == 1)
+ ret = FRSH_ERR_CONTRACT_REJECTED;
+ else
+ assert(false);
err_free:
forb_sequence_free_buf(&contracts, forb_no_destructor);
err:
if (criterion > best_criterion) {
ret = reserve_resource(resource);
- if (ret)
+ switch (ret) {
+ case FRSH_NO_ERROR:
+ best_criterion = criterion;
+ break;
+ case FRSH_ERR_CONTRACT_REJECTED:
+ break;
+ default:
goto err;
-
- /* negotiation succeeded */
- best_criterion = criterion;
+ }
}
} while (!all_combinations_tried);
struct fcb *fcb = o2fcb(_obj);
struct fcb_contract **fcb_contracts, *fc;
const fres_contract_ptr_seq* user_contracts = &transaction->contracts;
- int num = user_contracts->_length;
- int ret;
+ int i, ret, num = user_contracts->_length;
struct res_array res_array;
- fres_contract_ptr_seq res_contracts;
- int i, j;
struct res_key key;
struct resource *resource;
+ ul_logmsg("Negotiating transaction of %d contracts\n", num);
if (transaction_has_spare_capacity(transaction)) {
ret = FRES_ERR_SPARE_CAPACITY_NOT_SUPPORTED;
goto err;
ret = transaction_get_resources(fcb, fcb_contracts, num, &res_array);
- if (!forb_sequence_alloc_buf(&res_contracts, num)) {
- ret = errno;
- goto err_free_resources;
- }
-
gsa_cust_for_each(res_array, &res_array, resource) {
reservation_list_init_head(&resource->rl);
resource->rl.length = 0;
}
}
}
-/* gsa_cust_for_each(res_array, &res_array, resource) { */
-/* CORBA_Environment ev; */
-/* /\* Reserve contract *\/ */
-/* reservation_list2s */
-/* ret = fres_resource_manager_reserve_contracts(resource->mng, &res_contracts, &ev); */
-/* if (forb_exception_occurred(&ev)) { */
-/* ret = fres_forbex2err(&ev); */
-/* ul_logerr("FORB exception when reserving contracts\n"); */
-/* goto err_free_res_contracts; */
-/* } */
-/* if (ret < 0) { */
-/* ul_logerr("Contract reservation error %d\n", ret); */
-/* ret = FRES_ERR_ADMISSION_TEST; */
-/* goto err; */
-/* } */
-/* if (ret == 0) { /\* negotiation succeeded *\/ */
-/* } */
-/* } */
+ gsa_cust_for_each(res_array, &res_array, resource) {
+ ret = reserve_resource(resource);
+ if (ret) {
+ ul_logerr("Reservation failed\n");
+ goto err_cancel_reservation;
+ }
+ }
+ gsa_cust_for_each(res_array, &res_array, resource) {
+ ret = commit_resource(resource);
+ if (ret) {
+ ul_logerr("Commit failed\n");
+ goto err_cancel_reservation;
+ }
+ }
return 0;
+err_cancel_reservation:
+ gsa_cust_for_each(res_array, &res_array, resource) {
+ cancel_reservations(resource);
+ }
err_free_res_contracts:
forb_sequence_free_buf(&res_contracts, forb_no_destructor);
err_free_resources:
}
}
+ memset(&fcb_data, 0, sizeof(fcb_data));
fosa_clock_get_time(CLOCK_REALTIME, &start_time);
if (opt_daemon)