Re: WIP: Access method extendability

Teodor Sigaev <teodor@sigaev.ru>

From: Teodor Sigaev <teodor@sigaev.ru>
To: Alexander Korotkov <a.korotkov@postgrespro.ru>
Cc: Petr Jelinek <petr@2ndquadrant.com>, Alvaro Herrera <alvherre@2ndquadrant.com>, David Steele <david@pgmasters.net>, Michael Paquier <michael.paquier@gmail.com>, Jim Nasby <Jim.Nasby@bluetreble.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2016-03-30T13:21:24Z
Lists: pgsql-hackers
GenericXLogStart(Relation relation)
{
...
     if (genericXlogStatus != GXLOG_NOT_STARTED)
         ereport(ERROR,
                 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                  errmsg("GenericXLogStart: generic xlog is already started")));


Hmm, seems, generic wal whiil be in incorrect state if exception occurs between 
GenericXLogStart() and GenericXLogFinish() calls because static variable 
genericXlogStatus will contain GXLOG_LOGGED/GXLOG_UNLOGGED status.

Suppose, it could be solved by different ways
- remove all static variable, so, GenericXLogStart() will return an struct
   (object) which incapsulated all data needed to generic wal work. As I can
   see, in case of exception there isn't ane needing to extra cleanup. Also,
   it would allow to use generic wal for two or more relations at the same time,
   although I don't know any useful example for such feature.
- add callback via RegisterResourceReleaseCallback() which will cleanup state
   of genericXlogStatus variable

-- 
Teodor Sigaev                                   E-mail: teodor@sigaev.ru
                                                    WWW: http://www.sigaev.ru/


Commits

  1. Support CREATE ACCESS METHOD

  2. Restructure index access method API to hide most of it at the C level.