Re: RFC: logical publication via inheritance root?
От | Jacob Champion |
---|---|
Тема | Re: RFC: logical publication via inheritance root? |
Дата | |
Msg-id | 13971415-416b-1e98-2fe5-ad394c6ddc2c@timescale.com обсуждение исходный текст |
Ответ на | Re: RFC: logical publication via inheritance root? (Jacob Champion <jchampion@timescale.com>) |
Ответы |
Re: RFC: logical publication via inheritance root?
|
Список | pgsql-hackers |
On 4/4/23 08:14, Jacob Champion wrote: > Yes, sorry -- after 062a84442, the architecture needs to change in a > way that I'm still working through. I've moved the patch to Waiting on > Author while I figure out the rebase. Okay -- that took longer than I wanted, but here's a rebased patchset that I'll call v2. Commit 062a84442 necessitated some rework of the new pg_get_publication_rels_to_sync() helper. It now takes a list of publications so that we can handle conflicts in the pubviaroot settings. This is more complicated than before -- unlike partitions, standard inheritance trees can selectively publish tables that aren't leaves. But I think I've finally settled on some semantics for it which are unsurprising. As part of that, I've pulled out a patch in 0001 which I hope is independently useful. Today, there appears to be no way to check which relid a table will be published through, short of creating a subscription just to see what happens. 0001 introduces pg_get_relation_publishing_info() to surface this information, which makes testing it easier and also makes it possible to inspect what's happening with more complicated publication setups. 0001 also moves the determination of publish_as_relid out of the pgoutput plugin and into a pg_publication helper function, because unless I've missed something crucial, it doesn't seem like an output plugin is really free to make that decision independently of the publication settings. The subscriber is not going to ask a plugin for the right tables to COPY during initial sync, so the plugin had better be using the same logic as the core. Many TODOs and upthread points of feedback are still pending, and I think that several of them are actually symptoms of one architectural problem with my patch: - The volatility classifications of pg_set_logical_root() and pg_get_publication_rels_to_sync() appear to conflict - A dump/restore cycle loses the new marker - Inheritance can be tampered with after the logical root has been set - There's currently no way to clear a logical root after setting it I wonder if pg_set_logical_root() might be better implemented as part of ALTER TABLE. Maybe with a relation option? If it all went through ALTER TABLE ONLY ... SET, then we wouldn't have to worry about a user modifying roots while reading pg_get_publication_rels_to_sync() in the same query. The permissions checks should be more consistent with less effort, and there's an existing way to set/clear the option that already plays well with pg_dump and pg_upgrade. The downsides I can see are the need to handle simultaneous changes to INHERIT and SET (since we'd be manipulating pg_inherits in both), as well as the fact that ALTER TABLE ... SET defaults to altering the entire table hierarchy, which may be bad UX for this case. --Jacob
Вложения
В списке pgsql-hackers по дате отправления: