[EMAIL PROTECTED] writes: > the infinite loop occurs in fsm_search_avail when called for the 32nd > time.
... which is the first time that the initial test doesn't make it fall out immediately. Would you add a couple more printouts, along the line of nodeno = target; while (nodeno > 0) { + fprintf(stderr, "ascend at node %d value %d\n", + nodeno, fsmpage->fp_nodes[nodeno]); if (fsmpage->fp_nodes[nodeno] >= minvalue) break; /* * Move to the right, wrapping around on same level if necessary, * then climb up. */ nodeno = parentof(rightneighbor(nodeno)); } /* * We're now at a node with enough free space, somewhere in the middle of * the tree. Descend to the bottom, following a path with enough free * space, preferring to move left if there's a choice. */ while (nodeno < NonLeafNodesPerPage) { int leftnodeno = leftchild(nodeno); int rightnodeno = leftnodeno + 1; bool leftok = (leftnodeno < NodesPerPage) && (fsmpage->fp_nodes[leftnodeno] >= minvalue); bool rightok = (rightnodeno < NodesPerPage) && (fsmpage->fp_nodes[rightnodeno] >= minvalue); + fprintf(stderr, "descend at node %d value %d, leftnode %d value %d, rightnode %d value %d\n", + nodeno, fsmpage->fp_nodes[nodeno], + leftnodeno, fsmpage->fp_nodes[leftnodeno], + rightnodeno, fsmpage->fp_nodes[rightnodeno]); if (leftok) nodeno = leftnodeno; else if (rightok) nodeno = rightnodeno; else (I'm assuming we can print possibly-off-the-end array elements without dumping core; which is bogus in general but I expect we can get away with it for this purpose.) Also, we don't really need 94MB of log to convince us it's an infinite loop ;-) regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers