Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 6c1733d

Browse files
knizhnikkelvich
authored andcommitted
Add relation Id map
1 parent 5cce0cb commit 6c1733d

6 files changed

+114
-21
lines changed

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

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

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

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
}

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+
}

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)