static ThreadPoolDomain * domain_get_or_create (MonoDomain *domain) { ThreadPoolDomain *tpdomain = NULL; guint i; g_assert (domain); mono_mutex_lock (&threadpool->domains_lock); for (i = 0; i < threadpool->domains->len; ++i) { ThreadPoolDomain *tmp = g_ptr_array_index (threadpool->domains, i); if (tmp->domain == domain) { tpdomain = tmp; break; } } if (!tpdomain) { tpdomain = g_new0 (ThreadPoolDomain, 1); tpdomain->domain = domain; domain_add (tpdomain); } mono_mutex_unlock (&threadpool->domains_lock); return tpdomain; }
static void try_spare_migration(struct state *statelist, struct alert_info *info) { struct state *from; struct state *st; link_containers_with_subarrays(statelist); for (st = statelist; st; st = st->next) if (st->active < st->raid && st->spare == 0 && !st->err) { struct domainlist *domlist = NULL; int d; struct state *to = st; unsigned long long min_size; if (to->parent_devnm[0] && !to->parent) /* subarray monitored without parent container * we can't move spares here */ continue; if (to->parent) /* member of a container */ to = to->parent; if (get_min_spare_size_required(to, &min_size)) continue; if (to->metadata->ss->external) { /* We must make sure there is * no suitable spare in container already. * If there is we don't add more */ dev_t devid = container_choose_spare( to, to, NULL, min_size, st->active); if (devid > 0) continue; } for (d = 0; d < MAX_DISKS; d++) if (to->devid[d]) domainlist_add_dev(&domlist, to->devid[d], to->metadata->ss->name); if (to->spare_group) domain_add(&domlist, to->spare_group); /* * No spare migration if the destination * has no domain. Skip this array. */ if (!domlist) continue; for (from=statelist ; from ; from=from->next) { dev_t devid; if (!check_donor(from, to)) continue; if (from->metadata->ss->external) devid = container_choose_spare( from, to, domlist, min_size, 0); else devid = choose_spare(from, to, domlist, min_size); if (devid > 0 && move_spare(from->devname, to->devname, devid)) { alert("MoveSpare", to->devname, from->devname, info); break; } } domain_free(domlist); } }
/* * Create domain list from domain table */ int load_domains(domain_t** dest) { db_res_t* res = NULL; db_rec_t* rec; unsigned int flags; domain_t* d, *list; list = 0; if (db_exec(&res, load_domains_cmd) < 0) { ERR("Error while querying database\n"); return -1; } rec = db_first(res); while(rec) { /* Do not assume that the database server performs any constrain * checking (dbtext does not) and perform sanity checks here to * make sure that we only load good entried */ if (rec->fld[0].flags & DB_NULL || rec->fld[1].flags & DB_NULL || rec->fld[2].flags & DB_NULL) { ERR("Row with NULL column(s), skipping\n"); goto skip; } flags = rec->fld[2].v.int4; /* Skip entries that are disabled/scheduled for removal */ if (flags & SRDB_DISABLED) goto skip; /* Skip entries that are for serweb/ser-ctl only */ if (!(flags & SRDB_LOAD_SER)) goto skip; DBG("Processing entry (%.*s, %.*s, %u)\n", rec->fld[0].v.lstr.len, ZSW(rec->fld[0].v.lstr.s), rec->fld[1].v.lstr.len, ZSW(rec->fld[1].v.lstr.s), flags); d = domain_search(list, &rec->fld[0].v.lstr); if (d) { /* DID exists in the list, update it */ if (domain_add(d, &rec->fld[1].v.lstr, flags) < 0) goto error; } else { /* DID does not exist yet, create a new entry */ d = new_domain(&rec->fld[0].v.lstr, &rec->fld[1].v.lstr, flags); if (!d) goto error; d->next = list; list = d; } skip: rec = db_next(res); } db_res_free(res); if (load_domain_attrs) { d = list; while(d) { if (db_load_domain_attrs(d) < 0) goto error; d = d->next; } } *dest = list; return 0; error: if (res) db_res_free(res); free_domain_list(list); return 1; }