On Mon, Apr 12, 2021 at 10:03 AM osumi.takami...@fujitsu.com
<osumi.takami...@fujitsu.com> wrote:
>
> > I checked the PG-DOC, found it says that “Replication of TRUNCATE
> > commands is supported”[1], so maybe TRUNCATE is not supported in
> > synchronous logical replication?
> >
> > If my understanding is right, maybe PG-DOC can be modified like this. Any
> > thought?
> > Replication of TRUNCATE commands is supported
> > ->
> > Replication of TRUNCATE commands is supported in asynchronous mode
> I'm not sure if this becomes the final solution,
>

I think unless the solution is not possible or extremely complicated
going via this route doesn't seem advisable.

> but if we take a measure to fix the doc, we have to be careful for the 
> description,
> because when we remove the primary keys of 'test' tables on the scenario in 
> [1], we don't have this issue.
> It means TRUNCATE in synchronous logical replication is not always blocked.
>

The problem happens only when we try to fetch IDENTITY_KEY attributes
because pgoutput uses RelationGetIndexAttrBitmap() to get that
information which locks the required indexes. Now, because TRUNCATE
has already acquired an exclusive lock on the index, it seems to
create a sort of deadlock where the actual Truncate operation waits
for logical replication of operation to complete and logical
replication waits for actual Truncate operation to finish.

Do we really need to use RelationGetIndexAttrBitmap() to build
IDENTITY_KEY attributes? During decoding, we don't even lock the main
relation, we just scan the system table and build that information
using a historic snapshot. Can't we do something similar here?

Adding Petr J. and Peter E. to know their views as this seems to be an
old problem (since the decoding of Truncate operation is introduced).

-- 
With Regards,
Amit Kapila.


Reply via email to