]> granicus.if.org Git - postgresql/commitdiff
Check interrupts during logical decoding more frequently.
authorAndres Freund <andres@anarazel.de>
Sun, 29 Jun 2014 15:08:04 +0000 (17:08 +0200)
committerAndres Freund <andres@anarazel.de>
Mon, 30 Jun 2014 10:02:15 +0000 (12:02 +0200)
When reading large amounts of preexisting WAL during logical decoding
using the SQL interface we possibly could fail to check interrupts in
due time. Similarly the same could happen on systems with a very high
WAL volume while creating a new logical replication slot, independent
of the used interface.

Previously these checks where only performed in xlogreader's read_page
callbacks, while waiting for new WAL to be produced. That's not
sufficient though, if there's never a need to wait.  Walsender's send
loop already contains a interrupt check.

Backpatch to 9.4 where the logical decoding feature was introduced.

src/backend/replication/logical/logical.c
src/backend/replication/logical/logicalfuncs.c

index 9eb5cd5ee4dca95673049eee6e3e4ed3463050c3..49f9c7d3a57459113eea1578327c2ee7732cf793 100644 (file)
@@ -451,11 +451,6 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx)
                XLogRecord *record;
                char       *err = NULL;
 
-               /*
-                * If the caller requires that interrupts be checked, the read_page
-                * callback should do so, as those will often wait.
-                */
-
                /* the read_page callback waits for new WAL */
                record = XLogReadRecord(ctx->reader, startptr, &err);
                if (err)
@@ -470,6 +465,8 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx)
                /* only continue till we found a consistent spot */
                if (DecodingContextReady(ctx))
                        break;
+
+               CHECK_FOR_INTERRUPTS();
        }
 
        ctx->slot->data.confirmed_flush = ctx->reader->EndRecPtr;
index 2da6bb10b22de2fee8019ab549afa4faeb50356d..a3a58e6a49cad81f63bb9686f8e3d37bc917ec87 100644 (file)
@@ -438,6 +438,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin
                        if (upto_nchanges != 0 &&
                                upto_nchanges <= p->returned_rows)
                                break;
+                       CHECK_FOR_INTERRUPTS();
                }
        }
        PG_CATCH();