Skip to content

Commit d7a9943

Browse files
committed
Add relation Id map
1 parent b7d599e commit d7a9943

File tree

6 files changed

+114
-21
lines changed

6 files changed

+114
-21
lines changed

contrib/mmts/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
MODULE_big = multimaster
2-
OBJS = multimaster.o raftable.o arbiter.o bytebuf.o bgwpool.o pglogical_output.o pglogical_proto.o pglogical_receiver.o pglogical_apply.o pglogical_hooks.o pglogical_config.o ddd.o bkb.o
2+
OBJS = multimaster.o raftable.o arbiter.o bytebuf.o bgwpool.o pglogical_output.o pglogical_proto.o pglogical_receiver.o pglogical_apply.o pglogical_hooks.o pglogical_config.o pglogical_relid_map.o ddd.o bkb.o
33

44
override CPPFLAGS += -I../raftable
55

contrib/mmts/multimaster.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
#include "pglogical_output/hooks.h"
99

1010
#define MTM_TUPLE_TRACE(fmt, ...)
11-
#if 1
11+
#if 0
1212
#define MTM_INFO(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__)
1313
#define MTM_TRACE(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__)
1414
#else
15-
#define MTM_INFO(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__)
15+
#define MTM_INFO(fmt, ...)
1616
#define MTM_TRACE(fmt, ...)
1717
#endif
1818

contrib/mmts/pglogical_apply.c

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "parser/parse_relation.h"
5050

5151
#include "multimaster.h"
52+
#include "pglogical_relid_map.h"
5253

5354
typedef struct TupleData
5455
{
@@ -451,19 +452,28 @@ read_rel(StringInfo s, LOCKMODE mode)
451452
int relnamelen;
452453
int nspnamelen;
453454
RangeVar* rv;
454-
Oid relid;
455-
456-
rv = makeNode(RangeVar);
457-
458-
nspnamelen = pq_getmsgbyte(s);
459-
rv->schemaname = (char *) pq_getmsgbytes(s, nspnamelen);
460-
461-
relnamelen = pq_getmsgbyte(s);
462-
rv->relname = (char *) pq_getmsgbytes(s, relnamelen);
463-
464-
relid = RangeVarGetRelidExtended(rv, mode, false, false, NULL, NULL);
465-
466-
return heap_open(relid, NoLock);
455+
Oid remote_relid = pq_getmsgint(s, 4);
456+
Oid local_relid;
457+
458+
local_relid = pglogical_relid_map_get(remote_relid);
459+
if (local_relid == InvalidOid) {
460+
rv = makeNode(RangeVar);
461+
462+
nspnamelen = pq_getmsgbyte(s);
463+
rv->schemaname = (char *) pq_getmsgbytes(s, nspnamelen);
464+
465+
relnamelen = pq_getmsgbyte(s);
466+
rv->relname = (char *) pq_getmsgbytes(s, relnamelen);
467+
468+
local_relid = RangeVarGetRelidExtended(rv, mode, false, false, NULL, NULL);
469+
pglogical_relid_map_put(remote_relid, local_relid);
470+
} else {
471+
nspnamelen = pq_getmsgbyte(s);
472+
s->cursor += nspnamelen;
473+
relnamelen = pq_getmsgbyte(s);
474+
s->cursor += relnamelen;
475+
}
476+
return heap_open(local_relid, NoLock);
467477
}
468478

469479
static void

contrib/mmts/pglogical_proto.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "utils/typcache.h"
3737

3838
#include "multimaster.h"
39+
#include "pglogical_relid_map.h"
3940

4041
static bool MtmIsFilteredTxn;
4142

@@ -71,13 +72,15 @@ pglogical_write_rel(StringInfo out, PGLogicalOutputData *data, Relation rel)
7172
uint8 nspnamelen;
7273
const char *relname;
7374
uint8 relnamelen;
74-
75+
Oid relid;
7576
if (MtmIsFilteredTxn) {
7677
return;
7778
}
7879

79-
pq_sendbyte(out, 'R'); /* sending RELATION */
80-
80+
relid = RelationGetRelid(rel);
81+
pq_sendbyte(out, 'R'); /* sending RELATION */
82+
pq_sendint(out, relid, sizeof relid); /* use Oid as relation identifier */
83+
8184
nspname = get_namespace_name(rel->rd_rel->relnamespace);
8285
if (nspname == NULL)
8386
elog(ERROR, "cache lookup failed for namespace %u",
@@ -86,10 +89,10 @@ pglogical_write_rel(StringInfo out, PGLogicalOutputData *data, Relation rel)
8689

8790
relname = NameStr(rel->rd_rel->relname);
8891
relnamelen = strlen(relname) + 1;
89-
92+
9093
pq_sendbyte(out, nspnamelen); /* schema name length */
9194
pq_sendbytes(out, nspname, nspnamelen);
92-
95+
9396
pq_sendbyte(out, relnamelen); /* table name length */
9497
pq_sendbytes(out, relname, relnamelen);
9598
}

contrib/mmts/pglogical_relid_map.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* pglogical_relid_map.c
4+
* Logical Replication map of local Oids to to remote
5+
*
6+
* Copyright (c) 2012-2015, PostgreSQL Global Development Group
7+
*
8+
* IDENTIFICATION
9+
* pglogical_relid_map.c
10+
*
11+
*-------------------------------------------------------------------------
12+
*/
13+
#include "postgres.h"
14+
#include "utils/hsearch.h"
15+
#include "pglogical_relid_map.h"
16+
17+
static HTAB *relid_map;
18+
19+
static void
20+
pglogical_relid_map_init(void)
21+
{
22+
HASHCTL ctl;
23+
int hash_flags = HASH_ELEM;
24+
25+
Assert(relid_map == NULL);
26+
27+
MemSet(&ctl, 0, sizeof(ctl));
28+
ctl.keysize = sizeof(Oid);
29+
ctl.entrysize = sizeof(PGLRelidMapEntry);
30+
31+
#if PG_VERSION_NUM >= 90500
32+
hash_flags |= HASH_BLOBS;
33+
#else
34+
ctl.hash = tag_hash;
35+
hash_flags |= HASH_FUNCTION;
36+
#endif
37+
38+
relid_map = hash_create("pglogical_relid_map", PGL_INIT_RELID_MAP_SIZE, &ctl, hash_flags);
39+
40+
Assert(relid_map != NULL);
41+
}
42+
43+
Oid pglogical_relid_map_get(Oid relid)
44+
{
45+
if (relid_map != NULL) {
46+
PGLRelidMapEntry* entry = (PGLRelidMapEntry*)hash_search(relid_map, &relid, HASH_FIND, NULL);
47+
return entry ? entry->local_relid : InvalidOid;
48+
}
49+
return InvalidOid;
50+
}
51+
52+
bool pglogical_relid_map_put(Oid remote_relid, Oid local_relid)
53+
{
54+
bool found;
55+
PGLRelidMapEntry* entry;
56+
if (relid_map == NULL) {
57+
pglogical_relid_map_init();
58+
}
59+
entry = hash_search(relid_map, &remote_relid, HASH_ENTER, &found);
60+
if (found) {
61+
Assert(entry->local_relid == local_relid);
62+
return false;
63+
}
64+
entry->local_relid = local_relid;
65+
return true;
66+
}

contrib/mmts/pglogical_relid_map.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef PGLOGICAL_RELID_MAP
2+
#define PGLOGICAL_RELID_MAP
3+
4+
#define PGL_INIT_RELID_MAP_SIZE 256
5+
6+
typedef struct PGLRelidMapEntry {
7+
Oid remote_relid;
8+
Oid local_relid;
9+
} PGLRelidMapEntry;
10+
11+
extern Oid pglogical_relid_map_get(Oid relid);
12+
extern bool pglogical_relid_map_put(Oid remote_relid, Oid local_relid);
13+
14+
#endif

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy