On 14.07.2011 13:29, Alexander Korotkov wrote:
On Thu, Jul 14, 2011 at 12:56 PM, Heikki Linnakangas<
heikki.linnakan...@enterprisedb.com>  wrote:

First, notice that we're setting "ptr->parent = top". 'top' is the current
node we're processing, and ptr represents the node to the right of the
current node. The current node is *not* the parent of the node to the right.
I believe that line should be "ptr->parent = top->parent".

I think same.

Second, we're adding the entry for the right sibling to the end of the list
of nodes to visit. But when we process entries from the list, we exit
immediately when we see a leaf page. That means that the right sibling can
get queued up behind leaf pages, and thus never visited.

I think possible solution is to save right sibling immediatly after current
page . Thus, this code fragment should looks like this:


                if (top->parent&&  XLByteLT(top->parent->lsn,
GistPageGetOpaque(page)->nsn)&&
                        GistPageGetOpaque(page)->**rightlink !=
InvalidBlockNumber /* sanity check */ )
                {
                        /* page splited while we thinking of... */
                        ptr = (GISTInsertStack *) palloc0(sizeof(**
GISTInsertStack));
                        ptr->blkno = GistPageGetOpaque(page)->**rightlink;
                        ptr->childoffnum = InvalidOffsetNumber;
                        ptr->parent = top->parent;
                        ptr->next = top->next;
                        top->next = ptr;
                        if (tail == top);
                                tail = ptr;

                 }

Agreed, committed. Thanks for verifying my thinking.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to