Re: cvs head initdb hangs on unixware

Tom Lane <tgl@sss.pgh.pa.us>

From: Tom Lane <tgl@sss.pgh.pa.us>
To: ohp@pyrenet.fr
Cc: Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>, Zdenek Kotala <Zdenek.Kotala@Sun.COM>, pgsql-hackers list <pgsql-hackers@postgresql.org>
Date: 2008-12-08T18:15:28Z
Lists: pgsql-hackers
ohp@pyrenet.fr 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