132 lines
4.1 KiB
Diff
132 lines
4.1 KiB
Diff
commit 17a83481661e531669d6904920a9109424fa3339
|
|
Author: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
|
|
Date: Tue Jun 15 15:05:22 2021 +0200
|
|
|
|
Fixes of snapshot handling
|
|
|
|
PostgreSQL commit ef94805096229ee3573624465a76ca11d2bd8529 (and in
|
|
other branches) made some changes to snapshot handling in SPI. This
|
|
also included some fixes to the snapshot handling in logical
|
|
replication, for instance that a snapshot needs to be help around
|
|
AFTER trigger execution. These changes made pglogical 2 fail on some
|
|
assertions. This patch makes the corresponding fixes in pglogical 2.
|
|
|
|
diff --git a/pglogical_apply_heap.c b/pglogical_apply_heap.c
|
|
index 9882518..9888ace 100644
|
|
--- a/pglogical_apply_heap.c
|
|
+++ b/pglogical_apply_heap.c
|
|
@@ -250,6 +250,8 @@ init_apply_exec_state(PGLogicalRelation *rel)
|
|
{
|
|
ApplyExecState *aestate = palloc0(sizeof(ApplyExecState));
|
|
|
|
+ PushActiveSnapshot(GetTransactionSnapshot());
|
|
+
|
|
/* Initialize the executor state. */
|
|
aestate->estate = create_estate_for_relation(rel->rel, true);
|
|
aestate->resultRelInfo = aestate->estate->es_result_relation_info;
|
|
@@ -286,6 +288,8 @@ finish_apply_exec_state(ApplyExecState *aestate)
|
|
/* Free the memory. */
|
|
FreeExecutorState(aestate->estate);
|
|
pfree(aestate);
|
|
+
|
|
+ PopActiveSnapshot();
|
|
}
|
|
|
|
/*
|
|
@@ -313,9 +317,6 @@ pglogical_apply_heap_insert(PGLogicalRelation *rel, PGLogicalTupleData *newtup)
|
|
ExecSetSlotDescriptor(localslot, RelationGetDescr(rel->rel));
|
|
#endif
|
|
|
|
- /* Get snapshot */
|
|
- PushActiveSnapshot(GetTransactionSnapshot());
|
|
-
|
|
ExecOpenIndices(aestate->resultRelInfo
|
|
#if PG_VERSION_NUM >= 90500
|
|
, false
|
|
@@ -356,7 +357,6 @@ pglogical_apply_heap_insert(PGLogicalRelation *rel, PGLogicalTupleData *newtup)
|
|
if (aestate->slot == NULL) /* "do nothing" */
|
|
#endif
|
|
{
|
|
- PopActiveSnapshot();
|
|
finish_apply_exec_state(aestate);
|
|
return;
|
|
}
|
|
@@ -424,7 +424,6 @@ pglogical_apply_heap_insert(PGLogicalRelation *rel, PGLogicalTupleData *newtup)
|
|
if (aestate->slot == NULL) /* "do nothing" */
|
|
#endif
|
|
{
|
|
- PopActiveSnapshot();
|
|
finish_apply_exec_state(aestate);
|
|
return;
|
|
}
|
|
@@ -494,7 +493,6 @@ pglogical_apply_heap_insert(PGLogicalRelation *rel, PGLogicalTupleData *newtup)
|
|
#endif
|
|
}
|
|
|
|
- PopActiveSnapshot();
|
|
finish_apply_exec_state(aestate);
|
|
|
|
CommandCounterIncrement();
|
|
@@ -579,7 +577,6 @@ pglogical_apply_heap_update(PGLogicalRelation *rel, PGLogicalTupleData *oldtup,
|
|
if (aestate->slot == NULL) /* "do nothing" */
|
|
#endif
|
|
{
|
|
- PopActiveSnapshot();
|
|
finish_apply_exec_state(aestate);
|
|
return;
|
|
}
|
|
@@ -689,7 +686,6 @@ pglogical_apply_heap_update(PGLogicalRelation *rel, PGLogicalTupleData *oldtup,
|
|
}
|
|
|
|
/* Cleanup. */
|
|
- PopActiveSnapshot();
|
|
finish_apply_exec_state(aestate);
|
|
|
|
CommandCounterIncrement();
|
|
@@ -733,7 +729,6 @@ pglogical_apply_heap_delete(PGLogicalRelation *rel, PGLogicalTupleData *oldtup)
|
|
|
|
if (!dodelete) /* "do nothing" */
|
|
{
|
|
- PopActiveSnapshot();
|
|
finish_apply_exec_state(aestate);
|
|
pglogical_relation_close(rel, NoLock);
|
|
return;
|
|
@@ -760,7 +755,6 @@ pglogical_apply_heap_delete(PGLogicalRelation *rel, PGLogicalTupleData *oldtup)
|
|
}
|
|
|
|
/* Cleanup. */
|
|
- PopActiveSnapshot();
|
|
finish_apply_exec_state(aestate);
|
|
|
|
CommandCounterIncrement();
|
|
diff --git a/pglogical_output_plugin.c b/pglogical_output_plugin.c
|
|
index 11fa818..abbe00c 100644
|
|
--- a/pglogical_output_plugin.c
|
|
+++ b/pglogical_output_plugin.c
|
|
@@ -28,6 +28,7 @@
|
|
#include "utils/inval.h"
|
|
#include "utils/memutils.h"
|
|
#include "utils/rel.h"
|
|
+#include "utils/snapmgr.h"
|
|
#include "replication/origin.h"
|
|
|
|
#include "pglogical_output_plugin.h"
|
|
@@ -618,6 +619,8 @@ pglogical_change_filter(PGLogicalOutputData *data, Relation relation,
|
|
return false;
|
|
}
|
|
|
|
+ PushActiveSnapshot(GetTransactionSnapshot());
|
|
+
|
|
estate = create_estate_for_relation(relation, false);
|
|
econtext = prepare_per_tuple_econtext(estate, tupdesc);
|
|
|
|
@@ -643,6 +646,8 @@ pglogical_change_filter(PGLogicalOutputData *data, Relation relation,
|
|
|
|
ExecDropSingleTupleTableSlot(econtext->ecxt_scantuple);
|
|
FreeExecutorState(estate);
|
|
+
|
|
+ PopActiveSnapshot();
|
|
}
|
|
|
|
/* Make sure caller is aware of any attribute filter. */
|