Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6c1733d

Browse files
knizhnikkelvich
authored andcommitted
Add relation Id map
1 parent5cce0cb commit6c1733d

File tree

6 files changed

+114
-21
lines changed

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.opglogical_relid_map.oddd.o bkb.o
33

44
overrideCPPFLAGS += -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
#defineMTM_TUPLE_TRACE(fmt, ...)
11-
#if1
11+
#if0
1212
#defineMTM_INFO(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__)
1313
#defineMTM_TRACE(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__)
1414
#else
15-
#defineMTM_INFO(fmt, ...)fprintf(stderr, fmt, ## __VA_ARGS__)
15+
#defineMTM_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
typedefstructTupleData
5455
{
@@ -451,19 +452,28 @@ read_rel(StringInfo s, LOCKMODE mode)
451452
intrelnamelen;
452453
intnspnamelen;
453454
RangeVar*rv;
454-
Oidrelid;
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-
returnheap_open(relid,NoLock);
455+
Oidremote_relid=pq_getmsgint(s,4);
456+
Oidlocal_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+
returnheap_open(local_relid,NoLock);
467477
}
468478

469479
staticvoid

‎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
staticboolMtmIsFilteredTxn;
4142

@@ -71,13 +72,15 @@ pglogical_write_rel(StringInfo out, PGLogicalOutputData *data, Relation rel)
7172
uint8nspnamelen;
7273
constchar*relname;
7374
uint8relnamelen;
74-
75+
Oidrelid;
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,sizeofrelid);/* 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+
staticHTAB*relid_map;
18+
19+
staticvoid
20+
pglogical_relid_map_init(void)
21+
{
22+
HASHCTLctl;
23+
inthash_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+
#ifPG_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+
Oidpglogical_relid_map_get(Oidrelid)
44+
{
45+
if (relid_map!=NULL) {
46+
PGLRelidMapEntry*entry= (PGLRelidMapEntry*)hash_search(relid_map,&relid,HASH_FIND,NULL);
47+
returnentry ?entry->local_relid :InvalidOid;
48+
}
49+
returnInvalidOid;
50+
}
51+
52+
boolpglogical_relid_map_put(Oidremote_relid,Oidlocal_relid)
53+
{
54+
boolfound;
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+
#ifndefPGLOGICAL_RELID_MAP
2+
#definePGLOGICAL_RELID_MAP
3+
4+
#definePGL_INIT_RELID_MAP_SIZE 256
5+
6+
typedefstructPGLRelidMapEntry {
7+
Oidremote_relid;
8+
Oidlocal_relid;
9+
}PGLRelidMapEntry;
10+
11+
externOidpglogical_relid_map_get(Oidrelid);
12+
externboolpglogical_relid_map_put(Oidremote_relid,Oidlocal_relid);
13+
14+
#endif

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp