if (!rs) {
char str[60];
forb_server_id_to_string(str, &app, sizeof(str));
- ul_logerr("No resource scheduler found for %s\n",
- str);
+ ul_logerr("No resource scheduler found for %d.%d and %s\n",
+ res_key.type, res_key.id, str);
}
{
struct fcb *fcb = o2fcb(obj);
struct res_mng *rm, *rm2;
+
rm = malloc(sizeof(*rm));
if (!rm) goto err;
memset(rm, 0, sizeof(*rm));
rm->resource.id = resid;
rm2 = fcb_resource_find(fcb, &rm->resource);
if (rm2) {
- ul_logerr("Resource manager %d.%d already regsitered\n",
- restype, resid);
- goto free_err;
+ if (forb_object_is_stale(rm2->rm)) {
+ ul_logmsg("Removing stale manager for resource %d.%d\n",
+ restype, resid);
+ forb_object_release(rm2->rm);
+ fcb_resource_delete(fcb, rm2);
+ /* TODO: Delete also all schedulers associated
+ * with this stale resource manager. */
+ free(rm);
+ rm = rm2;
+ } else {
+ ul_logerr("Resource manager %d.%d already registered\n",
+ restype, resid);
+ goto free_err;
+ }
}
rm->rm = forb_object_duplicate(rm_obj);
+
+ fcb_sched_init_root_field(rm);
+ ul_logmsg("Registering manager for resource %d.%d\n",
+ restype, resid);
fcb_resource_insert(fcb, rm);
return 0;
free_err:
struct res_sched *rs;
struct res_key resource;
forb_server_id server_id;
+ char server_id_str[40];
+ forb_get_server_id(rs_obj, &server_id);
+ forb_server_id_to_string(server_id_str, &server_id, sizeof(server_id_str));
+ ul_logmsg("Registering scheduler for resource %d.%d in app %s\n",
+ restype, resid, server_id_str);
resource.type = restype;
resource.id = resid;
if (!rm) {
goto err;
}
- forb_get_server_id(rs_obj, &server_id);
rs = fcb_sched_find(rm, &server_id);
if (rs) {
char *str = forb_object_to_string(rs_obj);
orb = forb_init(&argc, &argv, "fcb");
if (!orb) error(1, errno, "FORB initialization failed");
-
+ fcb_resource_init_root_field(&fcb_data);
fcb = forb_fres_contract_broker_new(orb, &impl, &fcb_data);