struct mddev_dev *conf_get_devs() { glob_t globbuf; struct conf_dev *cd; int flags = 0; static struct mddev_dev *dlist = NULL; unsigned int i; while (dlist) { struct mddev_dev *t = dlist; dlist = dlist->next; free(t->devname); free(t); } load_conffile(); if (cdevlist == NULL) { /* default to 'partitions' and 'containers' */ dlist = load_partitions(); append_dlist(&dlist, load_containers()); } for (cd=cdevlist; cd; cd=cd->next) { if (strcasecmp(cd->name, "partitions")==0) append_dlist(&dlist, load_partitions()); else if (strcasecmp(cd->name, "containers")==0) append_dlist(&dlist, load_containers()); else { glob(cd->name, flags, NULL, &globbuf); flags |= GLOB_APPEND; } } if (flags & GLOB_APPEND) { for (i=0; i<globbuf.gl_pathc; i++) { struct mddev_dev *t = xmalloc(sizeof(*t)); memset(t, 0, sizeof(*t)); t->devname = xstrdup(globbuf.gl_pathv[i]); t->next = dlist; dlist = t; /* printf("one dev is %s\n", t->devname);*/ } globfree(&globbuf); } return dlist; }
/* * Create partitions and return an OID of the partition that contain value */ Oid create_partitions(Oid relid, Datum value, Oid value_type, bool *crashed) { int ret; RangeEntry *ranges; Datum vals[2]; Oid oids[] = {OIDOID, value_type}; bool nulls[] = {false, false}; char *sql; bool found; int pos; PartRelationInfo *prel; RangeRelation *rangerel; FmgrInfo cmp_func; char *schema; *crashed = false; schema = get_extension_schema(); prel = get_pathman_relation_info(relid, NULL); rangerel = get_pathman_range_relation(relid, NULL); /* Comparison function */ cmp_func = *get_cmp_func(value_type, prel->atttype); vals[0] = ObjectIdGetDatum(relid); vals[1] = value; /* Perform PL procedure */ sql = psprintf("SELECT %s.append_partitions_on_demand_internal($1, $2)", schema); PG_TRY(); { ret = SPI_execute_with_args(sql, 2, oids, vals, nulls, false, 0); if (ret > 0) { /* Update relation info */ free_dsm_array(&rangerel->ranges); free_dsm_array(&prel->children); load_partitions(relid, GetCatalogSnapshot(relid)); } } PG_CATCH(); { elog(WARNING, "Attempt to create new partitions failed"); if (crashed != NULL) *crashed = true; return 0; } PG_END_TRY(); /* Repeat binary search */ ranges = dsm_array_get_pointer(&rangerel->ranges); pos = range_binary_search(rangerel, &cmp_func, value, &found); if (found) return ranges[pos].child_oid; return 0; }
mddev_dev_t conf_get_devs() { glob_t globbuf; struct conf_dev *cd; int flags = 0; static mddev_dev_t dlist = NULL; unsigned int i; while (dlist) { mddev_dev_t t = dlist; dlist = dlist->next; free(t->devname); free(t); } load_conffile(); if (cdevlist == NULL) /* default to 'partitions */ dlist = load_partitions(); for (cd=cdevlist; cd; cd=cd->next) { if (strcasecmp(cd->name, "partitions")==0 && dlist == NULL) dlist = load_partitions(); else { glob(cd->name, flags, NULL, &globbuf); flags |= GLOB_APPEND; } } if (flags & GLOB_APPEND) { for (i=0; i<globbuf.gl_pathc; i++) { mddev_dev_t t = malloc(sizeof(*t)); t->devname = strdup(globbuf.gl_pathv[i]); t->next = dlist; t->used = 0; dlist = t; /* printf("one dev is %s\n", t->devname);*/ } globfree(&globbuf); } return dlist; }