From: | Zdenek Kotala <Zdenek(dot)Kotala(at)Sun(dot)COM> |
---|---|
To: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Proposal: Multiversion page api (inplace upgrade) |
Date: | 2008-06-11 14:11:59 |
Message-ID: | 484FDD2F.8090709@sun.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
1) Overview
This proposal is part of inplace upgrade project. PostgreSQL should be able to
read any page in old version. This is basic for all possible upgrade method.
2) Background
We have several macros for manipulating of the page structures but this list is
not complete and many parts of code access into this structures directly and
severals part does not use existing macros. The idea is to use only specified
API for manipulation/access of data structure on page. This API will recognize
page layout version and it process data correctly.
3) API
Proposed API is extended version of current macros which does not satisfy all
Page Header manipulation. I plan to use function in first implementation,
because it offers better type control and debugging capability, but some
functions could be converted into macros (or into inline functions) in final
solution (performance improving). All changes are related to bufpage.h and page.c.
4) Implementation
The main point of implementation is to have several version of PageHeader
structure (e.g. PageHeader_04, PageHeader_03 ...) and correct structure will be
handled in special branch (see examples).
Possible improvement is to use union which combine different PageHeader version
and because most PageHeader items are same for all Page Layout version, it will
reduce number of switches. But I'm afraid if union have same data layout as
separate structure on all supported platforms.
There are examples:
void PageSetFull(Page page)
{
switch ( PageGetPageLayoutVersion(page) )
{
case 4 : ((PageHeader_04) (page))->pd_flags |= PD_PAGE_FULL;
break;
default elog(PANIC, "PageSetFull is not supported on page layout version %i",
PageGetPageLayoutVersion(page));
}
}
LocationIndex PageGetLower(Page page)
{
switch ( PageGetPageLayoutVersion(page) )
{
case 4 : return ((PageHeader_04) (page))->pd_lower);
}
elog(PANIC, "Unsupported page layout in function PageGetLower.");
}
5) Issues
a) hash index has hardcoded PageHeader into meta page structure -> need
rewrite hash index implementation to be multiheader version friendly
b) All *ItemSize macros (+toast chunk size) depends on sizeof(PageHeader) ->
separate proposal will follow soon.
All comments are welcome.
Zdenek
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2008-06-11 14:15:41 | Re: B-tree "finish incomplete split" bug |
Previous Message | Merlin Moncure | 2008-06-11 14:03:51 | Re: math error or rounding problem Money type |