On 2013-01-19 23:42:02 -0500, Steve Singer wrote: > >5) Currently its only allowed to access catalog tables, its fairly > >trivial to extend this to additional tables if you can accept some > >(noticeable but not too big) overhead for modifications on those tables. > > > >I was thinking of making that an option for tables, that would be useful > >for replication solutions configuration tables. > > I think this will make the life of anyone developing a new replication > system easier. Slony has a lot of infrastructure for allowing slonik > scripts to wait for configuration changes to popogate everywhere before > making other configuration changes because you can get race conditions. If > I were designing a new replication system and I had this feature then I > would try to use it to come up with a simpler model of propagating > configuration changes.
I pushed support for this, turned out to be a rather moderate patch (after a cleanup patch that was required anyway): src/backend/access/common/reloptions.c | 10 ++++++++++ src/backend/utils/cache/relcache.c | 9 ++++++++- src/include/utils/rel.h | 9 +++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) With the (attached for convenience) patch applied you can do # ALTER TABLE replication_metadata SET (treat_as_catalog_table = true); to enable this. What I wonder about is: * does anybody have a better name for the reloption? * Currently this can be set mid-transaction but it will only provide access for in the next transaction but doesn't error out when setting it mid-transaction. I personally find that acceptable, other opinions? Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
>From b535ba12fad667725247281c43be2ef81f7e40d7 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Wed, 23 Jan 2013 13:02:34 +0100 Subject: [PATCH] wal_decoding: mergme: Support declaring normal tables as timetraveleable This is useful to be able to access tables used for replication metadata inside an output plugin. The storage option 'treat_as_catalog_table' is used for that purpose, so it can be enabled for a table with ALTER TABLE replication_metadata SET (treat_as_catalog_table = true); It is currently possible to change that option mid-transaction although timetravel access will only be possible in the next transaction. --- src/backend/access/common/reloptions.c | 10 ++++++++++ src/backend/utils/cache/relcache.c | 9 ++++++++- src/include/utils/rel.h | 9 +++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 456d746..f2d3c8b 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -62,6 +62,14 @@ static relopt_bool boolRelOpts[] = }, { { + "treat_as_catalog_table", + "Treat table as a catalog table for the purpose of logical replication", + RELOPT_KIND_HEAP + }, + false + }, + { + { "fastupdate", "Enables \"fast update\" feature for this GIN index", RELOPT_KIND_GIN @@ -1151,6 +1159,8 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind) offsetof(StdRdOptions, autovacuum) +offsetof(AutoVacOpts, analyze_scale_factor)}, {"security_barrier", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, security_barrier)}, + {"treat_as_catalog_table", RELOPT_TYPE_BOOL, + offsetof(StdRdOptions, treat_as_catalog_table)}, }; options = parseRelOptions(reloptions, validate, kind, &numoptions); diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 369a4d1..cc42ff4 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4718,12 +4718,19 @@ RelationIsDoingTimetravelInternal(Relation relation) Assert(wal_level >= WAL_LEVEL_LOGICAL); /* - * XXX: Doing this test instead of using IsSystemNamespace has the + * XXX: Doing this test instead of using IsSystemNamespace has the frak * advantage of classifying toast tables correctly. */ if (RelationGetRelid(relation) < FirstNormalObjectId) return true; + /* + * also log relevant data if we want the table to behave as a catalog + * table, although its not a system provided one. + */ + if (RelationIsTreatedAsCatalogTable(relation)) + return true; + return false; } diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index e07ef3f..a026612 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -219,6 +219,7 @@ typedef struct StdRdOptions int fillfactor; /* page fill factor in percent (0..100) */ AutoVacOpts autovacuum; /* autovacuum-related options */ bool security_barrier; /* for views */ + bool treat_as_catalog_table; /* treat as timetraveleable table */ } StdRdOptions; #define HEAP_MIN_FILLFACTOR 10 @@ -255,6 +256,14 @@ typedef struct StdRdOptions ((StdRdOptions *) (relation)->rd_options)->security_barrier : false) /* + * RelationIsTreatedAsCatalogTable + * Returns whether the relation is security view, or not + */ +#define RelationIsTreatedAsCatalogTable(relation) \ + ((relation)->rd_options ? \ + ((StdRdOptions *) (relation)->rd_options)->treat_as_catalog_table : false) + +/* * RelationIsValid * True iff relation descriptor is valid. */ -- 1.7.10.4
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers