static int checkbtreenode(struct btree *btr, struct btreenode *x, void *kmin, void *kmax, int isroot) { int i; if (x == NULL) /* check that the two keys are in order */ if (btr->cmp(kmin, kmax) >= 0) return 0; else return 1; else { if (!isroot && (x->n < btr->t - 1 || x->n > 2 * btr->t - 1)) { printf("node, to few or to many: %d\n", x->n); bt_dumptree(btr); exit(1); } /* check subnodes */ if (x->n == 0 && !x->leaf) if (!checkbtreenode(btr, NODES(btr, x)[0], kmin, kmax, 0)) return 0; else return 1; else if (x->n == 0 && x->leaf && !isroot) { printf("leaf with no keys!!\n"); bt_dumptree(btr); if (!checkbtreenode(btr, NULL, kmin, kmax, 0)) return 0; else return 1; } if (!checkbtreenode(btr, NODES(btr, x)[0], kmin, KEYS(btr, x)[0], 0)) return 0; for (i = 1; i < x->n; i++) if (!checkbtreenode(btr, NODES(btr, x)[i], KEYS(btr, x)[i - 1], KEYS(btr, x)[i], 0)) return 0; if (!checkbtreenode(btr, NODES(btr, x)[i], KEYS(btr, x)[i - 1], kmax, 0)) return 0; } return 1; }
void ai_btree_dump(as_sindex_metadata *imd, char *fname, bool verbose) { FILE *fp = NULL; if (!(fp = fopen(fname, "w"))) { return; } fprintf(fp, "Namespace: %s set: %s\n", imd->ns_name, imd->set ? imd->set : "None"); for (int i = 0; i < imd->nprts; i++) { as_sindex_pmetadata *pimd = &imd->pimd[i]; fprintf(fp, "INDEX: name: %s:%d (%p)\n", imd->iname, i, (void *) pimd->ibtr); if (pimd->ibtr) { bt_dumptree(fp, pimd->ibtr, 1, verbose); } } fclose(fp); }
static void bt_internal_dump(struct btree *btr) { bt_dumptree(btr, btr->ktype, REDIS_BTREE); }