Re: Questions on extending a relation

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "Qingqing Zhou" <zhouqq(at)cs(dot)toronto(dot)edu>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Questions on extending a relation
Date: 2005-06-27 14:44:41
Message-ID: 7026.1119883481@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

"Qingqing Zhou" <zhouqq(at)cs(dot)toronto(dot)edu> writes:
> 1. When we want a new page, we will do something like this:

> LockPage(relation, 0, ExclusiveLock);
> blockNum = smgrnblocks(reln->rd_smgr);
> /* Try to locate this blockNum in buffer pool, but definitely can't? */
> smgrextend(blockNum);
> LockPage(relation, 0, ExclusiveLock);

You should be using ReadBuffer with P_NEW, not calling smgr yourself.

> So if I have concurrently 10 backends reach here, we will have 10 new pages?

Yes. That's intentional --- otherwise they'd all block each other.

> 2. Suppose an insert on a relation with index is performed in this sequence:

> begin transation;
> extend relation for a new page A;
> insert a heap tuple T on page A;
> insert an index tuple I on another page B;
> page B get written out by bgwriter;
> System crashed.
> System recovered.

> At this time, page A is empty since we won't replay xlog.

Why wouldn't we replay xlog? Note in particular that the bgwriter is
not allowed to push page B to disk until the xlog entry describing the
index change has been flushed to disk. Since that will come after the
xlog entry about the heap change, both changes are necessarily on-disk
in the xlog, and both will be remade during replay.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Michael Fuhr 2005-06-27 14:52:58 Re: accessing postgres conf from stored procedure
Previous Message Tom Lane 2005-06-27 14:38:07 Re: GiST concurrency commited