Hi,

At this time I do not have time to make the necessary changes for this
commitfest so I am voluntarily withdrawing this patch, but will
revisit at a future time.

Best,

David

On Wed, Oct 28, 2020 at 1:06 PM Rahila Syed <rahilasye...@gmail.com> wrote:
>
> Hi David,
>
> The feature seems useful to me.  The code will need to be refactored due to 
> changes in commit : b05fe7b442
>
> Please see the following comments.
> 1. Is there a specific reason behind having new relstate for truncate?
> The current state flow is INIT->DATATSYNC->SYNCWAIT->CATCHUP->SYNCDONE->READY.
> Can we accommodate the truncate in either INIT or DATASYNC?
>
> 2.   +                               StartTransactionCommand();
>       +                               rel = 
> table_open(MyLogicalRepWorker->relid, RowExclusiveLock);
>       +
>       +                               rels = lappend(rels, rel);
>       +                               relids = lappend_oid(relids, 
> MyLogicalRepWorker->relid);
>       +
>       +                               ExecuteTruncateGuts(rels, relids, NIL, 
> DROP_RESTRICT, false);
>       +                               CommitTransactionCommand();
>
> Truncate is being performed in a separate transaction as data copy, I think 
> that leaves a window
> open for concurrent transactions to modify the data after truncate and before 
> copy.
>
> 3. Regarding the truncate of the referenced table, I think one approach can 
> be to perform the following:
> i. lock the referencing and referenced tables against writes
> ii. drop the foriegn key constraints,
> iii.truncate
> iv. sync
> v. recreate the constraints
> vi. release lock.
> However, I am not sure of the implications of locking these tables on the 
> main apply process.
>
>
> Thank you,
>
>
> On Mon, Oct 12, 2020 at 11:31 PM David Christensen <da...@endpoint.com> wrote:
>>
>> > On Oct 11, 2020, at 10:00 PM, Amit Kapila <amit.kapil...@gmail.com> wrote:
>> >
>> > On Mon, Oct 12, 2020 at 3:44 AM David Christensen <da...@endpoint.com> 
>> > wrote:
>> >>
>> >>
>> >> On Oct 11, 2020, at 1:14 PM, Euler Taveira 
>> >> <euler.tave...@2ndquadrant.com> wrote:
>> >>
>> >> 
>> >> On Fri, 9 Oct 2020 at 15:54, David Christensen <da...@endpoint.com> wrote:
>> >>>
>> >>>
>> >>> Enclosed find a patch to add a “truncate” option to subscription 
>> >>> commands.
>> >>>
>> >>> When adding new tables to a subscription (either via `CREATE 
>> >>> SUBSCRIPTION` or `REFRESH PUBLICATION`), tables on the target which are 
>> >>> being newly subscribed will be truncated before the data copy step.  
>> >>> This saves explicit coordination of a manual `TRUNCATE` on the target 
>> >>> tables and allows the results of the initial data sync to be the same as 
>> >>> on the publisher at the time of sync.
>> >>>
>> >>> To preserve compatibility with existing behavior, the default value for 
>> >>> this parameter is `false`.
>> >>>
>> >>
>> >> Truncate will fail for tables whose foreign keys refer to it. If such a 
>> >> feature cannot handle foreign keys, the usefulness will be restricted.
>> >>
>> >>
>> >> This is true for existing “truncate” with FKs, so doesn’t seem to be any 
>> >> different to me.
>> >>
>> >
>> > What would happen if there are multiple tables and truncate on only
>> > one of them failed due to FK check? Does it give an error in such a
>> > case, if so will the other tables be truncated?
>>
>> Currently each SyncRep relation is sync’d separately in its own worker 
>> process; we are doing the truncate at the initialization step of this, so 
>> it’s inherently in its own transaction. I think if we are going to do any 
>> sort of validation on this, it would have to be at the point of the CREATE 
>> SUBSCRIPTION/REFRESH PUBLICATION where we have the relation list and can do 
>> sanity-checking there.
>>
>> Obviously if someone changes the schema at some point between when it does 
>> this and when relation syncs start there is a race condition, but the same 
>> issue would affect other data sync things, so I don’t care to solve that as 
>> part of this patch.
>>
>> >> Hypothetically if you checked all new tables and could verify if there 
>> >> were FK cycles only already in the new tables being added then “truncate 
>> >> cascade” would be fine. Arguably if they had existing tables that were 
>> >> part of an FK that wasn’t fully replicated they were already operating 
>> >> brokenly.
>> >>
>> >
>> > I think if both PK_table and FK_table are part of the same
>> > subscription then there should be a problem as both them first get
>> > truncated? If they are part of a different subscription (or if they
>> > are not subscribed due to whatever reason) then probably we need to
>> > deal such cases carefully.
>>
>> You mean “should not be a problem” here?  If so, I agree with that.  
>> Obviously if we determine this features is only useful with this support 
>> we’d have to chase the entire dependency graph and make sure that is all 
>> contained in the set of newly-subscribed tables (or at least FK referents).
>>
>> I have not considered tables that are part of more than one subscription (is 
>> that possible?); we presumably should error out if any table exists already 
>> in a separate subscription, as we’d want to avoid truncating tables already 
>> part of an existing subscription.
>>
>> While I’m happy to take a stab at fixing some of the FK/PK issues, it seems 
>> easy to go down a rabbit hole.  I’m not convinced that we couldn’t just 
>> detect FK issues and choose to not handle this case without decreasing the 
>> utility for at least some cases.  (Perhaps we could give a hint as to the 
>> issues detected to point someone in the right direction.)  Anyway, glad to 
>> keep discussing potential implications, etc.
>>
>> Best,
>>
>> David
>> --
>> David Christensen
>> Senior Software and Database Engineer
>> End Point Corporation
>> da...@endpoint.com
>> 785-727-1171
>>
>>
>>
>>


Reply via email to