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
togeneric wal work. As I can see, in case of exception there isn't ane needing to extra cleanup. Also, it would allow
touse 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/