On Thu, Jun 17, 2021 at 9:26 PM Mark Dilger
<mark.dil...@enterprisedb.com> wrote:
>
> > On Jun 17, 2021, at 6:40 AM, Amit Kapila <amit.kapil...@gmail.com> wrote:
> >
> > I think such a problem won't happen because we are using historic
> > snapshots in this context. We rely on that in a similar way in
> > reorderbuffer.c, see ReorderBufferProcessTXN.
>
> I think you are right, but that's the part I have trouble fully convincing 
> myself is safe.  We certainly have an historic snapshot when we call 
> RelationGetIndexList, but that has an early exit if the relation already has 
> fields set, and we don't know if those fields were set before or after the 
> historic snapshot was taken.  Within the context of the pluggable 
> infrastructure, I think we're safe.  The only caller of 
> RelationGetIdentityKeyBitmap() in core is logicalrep_write_attrs(), which is 
> only called by logicalrep_write_rel(), which is only called by 
> send_relation_and_attrs(), which is only called by maybe_send_schema(), which 
> is called by pgoutput_change() and pgoutput_truncate(), both being callbacks 
> in core's logical replication plugin.
>
> ReorderBufferProcessTXN calls SetupHistoricSnapshot before opening the 
> relation and then calling ReorderBufferApplyChange to invoke the plugin on 
> that opened relation, so the relation's fields could not have been setup 
> before the snapshot was taken.  Any other plugin would similarly get invoked 
> after that same logic, so they'd be fine, too.  The problem would only be if 
> somebody called RelationGetIdentityKeyBitmap() or one of its calling 
> functions from outside that infrastructure.  Is that worth worrying about?  
> The function comments for those mention having an historic snapshot, and the 
> Assert will catch if code doesn't have one, but I wonder how much of a trap 
> for the unwary that is, considering that somebody might open the relation and 
> lookup indexes for the relation before taking an historic snapshot and 
> calling these functions.
>

I think in such a case the caller must call InvalidateSystemCaches
before setting up a historic snapshot, otherwise, there could be other
problems as well.

> I thought it was cheap enough to check that the relation we open is an index, 
> because if it is not, we'll segfault when accessing fields of the 
> relation->rd_index struct.  I wouldn't necessarily advocate doing any really 
> expensive checks here, but a quick sanity check seemed worth the effort.
>

I am not telling you anything about the cost of these sanity checks. I
suggest you raise elog rather than return NULL because if this happens
there is definitely some problem and continuing won't be a good idea.

-- 
With Regards,
Amit Kapila.


Reply via email to