Re: [PATCH 06/16] Add support for a generic wal reading facility dubbed XLogReader

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: [PATCH 06/16] Add support for a generic wal reading facility dubbed XLogReader
Дата
Msg-id 4FDF1651.7090102@enterprisedb.com
обсуждение исходный текст
Ответ на Re: [PATCH 06/16] Add support for a generic wal reading facility dubbed XLogReader  (Andres Freund <andres@2ndquadrant.com>)
Ответы Re: [PATCH 06/16] Add support for a generic wal reading facility dubbed XLogReader  (Andres Freund <andres@2ndquadrant.com>)
Список pgsql-hackers
On 15.06.2012 00:38, Andres Freund wrote:
> On Thursday, June 14, 2012 11:19:00 PM Heikki Linnakangas wrote:
>> On 13.06.2012 14:28, Andres Freund wrote:
>>> Features:
>>> - streaming reading/writing
>>> - filtering
>>> - reassembly of records
>>>
>>> Reusing the ReadRecord infrastructure in situations where the code that
>>> wants to do so is not tightly integrated into xlog.c is rather hard and
>>> would require changes to rather integral parts of the recovery code
>>> which doesn't seem to be a good idea.
>> It would be nice refactor ReadRecord and its subroutines out of xlog.c.
>> That file has grown over the years to be really huge, and separating the
>> code to read WAL sounds like it should be a pretty natural split. I
>> don't want to duplicate all the WAL reading code, so we really should
>> find a way to reuse that. I'd suggest rewriting ReadRecord into a thin
>> wrapper that just calls the new xlogreader code.
> I aggree that it is not very nice to duplicate it. But I also don't want to go
> the route of replacing ReadRecord with it for a while, we can replace
> ReadRecord later if we want. As long as it is in flux like it is right now I
> don't really see the point in investing energy in it.
> Also I am not that sure how a callback oriented API fits into the xlog.c
> workflow?

If the API doesn't fit the xlog.c workflow, I think that's a pretty good 
indication that the API is not good. The xlog.c workflow is basically:

while(!end-of-wal)
{  record = ReadRecord();  redo(recode);
}

There's some pretty complicated logic within the bowels of ReadRecord 
(see XLogPageRead(), for example), but it seems to me those parts 
actually fit the your callback API pretty well. The biggest change is 
that the xlog-reader thingie should return to the caller after each 
record, instead of calling a callback for each read record and only 
returning at end-of-wal.

Or we could put the code to call the redo-function into the callback, 
but there's some also some logic there to exit early if you reach the 
desired recovery point, for example, so the callback API would need to 
be extended to allow such early exit. I think a return-after-each-record 
API would be better, though.

>> Can this be used for writing WAL, as well as reading? If so, what do you
>> need the write support for?
> It currently can replace records which are not interesting (e.g. index changes
> in the case of logical rep). Filtered records are replaced with XLOG_NOOP
> records with correct length currently. In future the actual amount of data
> should really be reduced. I don't know yet know how to map LSNs of
> uncompressed/compressed stream onto each other...
> The filtered data is then passed to a writeout callback (in a streaming
> fashion).
>
> The whole writing out part is pretty ugly at the moment and I just bolted it
> ontop because it was convenient for the moment. I am not yet sure how the api
> for that should look....

Can we just leave that out for now?

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


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Gurjeet Singh
Дата:
Сообщение: Re: s/UNSPECIFIED/SIMPLE/ in foreign key code?
Следующее
От: Tom Lane
Дата:
Сообщение: Re: s/UNSPECIFIED/SIMPLE/ in foreign key code?