v1-0001-worker.c-refactor-code-to-look-up-local-tuple.patch
application/octet-stream
Filename: v1-0001-worker.c-refactor-code-to-look-up-local-tuple.patch
Type: application/octet-stream
Part: 1
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v1-0001
Subject: worker.c: refactor code to look up local tuple
| File | + | − |
|---|---|---|
| src/backend/replication/logical/worker.c | 41 | 37 |
From 6fafe4b91233deba66dd81e7048fbefd52f52077 Mon Sep 17 00:00:00 2001
From: amitlan <amitlangote09@gmail.com>
Date: Fri, 27 Mar 2020 20:54:30 +0900
Subject: [PATCH v14 1/3] worker.c: refactor code to look up local tuple
---
src/backend/replication/logical/worker.c | 78 +++++++++++++++++---------------
1 file changed, 41 insertions(+), 37 deletions(-)
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index fa38117..51c0278 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -122,6 +122,10 @@ static void apply_handle_update_internal(ResultRelInfo *relinfo,
static void apply_handle_delete_internal(ResultRelInfo *relinfo, EState *estate,
TupleTableSlot *remoteslot,
LogicalRepRelation *remoterel);
+static bool FindReplTupleInLocalRel(EState *estate, Relation localrel,
+ LogicalRepRelation *remoterel,
+ TupleTableSlot *remoteslot,
+ TupleTableSlot **localslot);
/*
* Should this worker apply changes for given relation.
@@ -788,33 +792,17 @@ apply_handle_update_internal(ResultRelInfo *relinfo,
LogicalRepRelMapEntry *relmapentry)
{
Relation localrel = relinfo->ri_RelationDesc;
- Oid idxoid;
EPQState epqstate;
TupleTableSlot *localslot;
bool found;
MemoryContext oldctx;
- localslot = table_slot_create(localrel, &estate->es_tupleTable);
EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1);
-
ExecOpenIndices(relinfo, false);
- /*
- * Try to find tuple using either replica identity index, primary key or
- * if needed, sequential scan.
- */
- idxoid = GetRelationIdentityOrPK(localrel);
- Assert(OidIsValid(idxoid) ||
- (relmapentry->remoterel.replident == REPLICA_IDENTITY_FULL));
-
- if (OidIsValid(idxoid))
- found = RelationFindReplTupleByIndex(localrel, idxoid,
- LockTupleExclusive,
- remoteslot, localslot);
- else
- found = RelationFindReplTupleSeq(localrel, LockTupleExclusive,
- remoteslot, localslot);
-
+ found = FindReplTupleInLocalRel(estate, localrel,
+ &relmapentry->remoterel,
+ remoteslot, &localslot);
ExecClearTuple(remoteslot);
/*
@@ -922,31 +910,15 @@ apply_handle_delete_internal(ResultRelInfo *relinfo, EState *estate,
LogicalRepRelation *remoterel)
{
Relation localrel = relinfo->ri_RelationDesc;
- Oid idxoid;
EPQState epqstate;
TupleTableSlot *localslot;
bool found;
- localslot = table_slot_create(localrel, &estate->es_tupleTable);
EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1);
-
ExecOpenIndices(relinfo, false);
- /*
- * Try to find tuple using either replica identity index, primary key or
- * if needed, sequential scan.
- */
- idxoid = GetRelationIdentityOrPK(localrel);
- Assert(OidIsValid(idxoid) ||
- (remoterel->replident == REPLICA_IDENTITY_FULL));
-
- if (OidIsValid(idxoid))
- found = RelationFindReplTupleByIndex(localrel, idxoid,
- LockTupleExclusive,
- remoteslot, localslot);
- else
- found = RelationFindReplTupleSeq(localrel, LockTupleExclusive,
- remoteslot, localslot);
+ found = FindReplTupleInLocalRel(estate, localrel, remoterel,
+ remoteslot, &localslot);
/* If found delete it. */
if (found)
@@ -971,6 +943,38 @@ apply_handle_delete_internal(ResultRelInfo *relinfo, EState *estate,
}
/*
+ * Try to find a tuple received from the publication side (one in 'remoteslot')
+ * in the corresponding local relation using either replica identity index,
+ * primary key or if needed, sequential scan.
+ *
+ * Local tuple, if found, is returned in '*localslot'.
+ */
+static bool
+FindReplTupleInLocalRel(EState *estate, Relation localrel,
+ LogicalRepRelation *remoterel,
+ TupleTableSlot *remoteslot,
+ TupleTableSlot **localslot)
+{
+ Oid idxoid;
+ bool found;
+
+ idxoid = GetRelationIdentityOrPK(localrel);
+ Assert(OidIsValid(idxoid) ||
+ (remoterel->replident == REPLICA_IDENTITY_FULL));
+
+ *localslot = table_slot_create(localrel, &estate->es_tupleTable);
+ if (OidIsValid(idxoid))
+ found = RelationFindReplTupleByIndex(localrel, idxoid,
+ LockTupleExclusive,
+ remoteslot, *localslot);
+ else
+ found = RelationFindReplTupleSeq(localrel, LockTupleExclusive,
+ remoteslot, *localslot);
+
+ return found;
+}
+
+/*
* Handle TRUNCATE message.
*
* TODO: FDW support
--
1.8.3.1