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

Commit 7d1a4f3

Browse files
committed
Merge branch 'PGPROEE10_MULTIMASTER_stable' into PGPROEE10_MULTIMASTER
2 parents 00b588c + c6659e1 commit 7d1a4f3

File tree

455 files changed

+10473
-8330
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

455 files changed

+10473
-8330
lines changed

configure

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2788,7 +2788,7 @@ fi
27882788

27892789

27902790

2791-
PGPRO_VERSION="$PACKAGE_VERSION.1"
2791+
PGPRO_VERSION="$PACKAGE_VERSION.3"
27922792
PGPRO_PACKAGE_NAME="PostgresPro"
27932793
PGPRO_EDITION="enterprise"
27942794
PGPRO_EDN="ent"

configure.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ PGAC_ARG_REQ(with, extra-version, [STRING], [append STRING to version],
3939
[PG_VERSION="$PACKAGE_VERSION$withval"],
4040
[PG_VERSION="$PACKAGE_VERSION"])
4141

42-
PGPRO_VERSION="$PACKAGE_VERSION.1"
42+
PGPRO_VERSION="$PACKAGE_VERSION.3"
4343
PGPRO_PACKAGE_NAME="PostgresPro"
4444
PGPRO_EDITION="enterprise"
4545
PGPRO_EDN="ent"

contrib/mchar/Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ OBJS = mchar_io.o mchar_proc.o mchar_op.o mchar_recode.o \
44
EXTENSION = mchar
55
DATA = mchar--1.0.sql
66
DOCS = README.mchar
7-
REGRESS = init mchar mvarchar mm like compat
7+
REGRESS = init mchar mvarchar like
8+
ifndef NO_LOCALE
9+
REGRESS += mm compat
10+
endif
811
PGFIELDDESC = "mchar - mchar type implementation"
912

1013
ifdef USE_PGXS

contrib/mchar/expected/mm.out

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,3 +803,44 @@ SELECT * FROM a, c WHERE mvarchar255 = mchar2;
803803

804804
DROP TABLE a;
805805
DROP TABLE c;
806+
select * from (values ('е'::mchar),('ё'),('еа'),('еб'),('ее'),('еж'),('ёа'),('ёб'),('ёё'),('ёж'),('ёе'),('её')) z order by 1;
807+
column1
808+
---------
809+
е
810+
еа
811+
еб
812+
ее
813+
её
814+
еж
815+
ё
816+
ёа
817+
ёб
818+
ёе
819+
ёё
820+
ёж
821+
(12 rows)
822+
823+
select mvarchar_icase_cmp('ё', 'е');
824+
mvarchar_icase_cmp
825+
--------------------
826+
1
827+
(1 row)
828+
829+
select mvarchar_icase_cmp('Ё', 'Е');
830+
mvarchar_icase_cmp
831+
--------------------
832+
1
833+
(1 row)
834+
835+
select mvarchar_icase_cmp('й', 'и');
836+
mvarchar_icase_cmp
837+
--------------------
838+
1
839+
(1 row)
840+
841+
select mvarchar_icase_cmp('Й', 'И');
842+
mvarchar_icase_cmp
843+
--------------------
844+
1
845+
(1 row)
846+

contrib/mchar/mchar_recode.c

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ createUObjs() {
3131
elog(ERROR,"ICU ucol_open returns %d (%s)", err, u_errorName(err));
3232
}
3333

34+
/* UCOL_PRIMARY doesn't distinguish И & Й, Е & Ё */
3435
ucol_setStrength( colCaseInsensitive, UCOL_SECONDARY );
3536
}
3637

@@ -114,29 +115,49 @@ FillWhiteSpace( UChar *dst, int n ) {
114115
int
115116
UCharCaseCompare(UChar * a, int alen, UChar *b, int blen) {
116117
int len = Min(alen, blen);
117-
int res;
118+
int i, res;
118119

119120
createUObjs();
120121

121-
res = (int)ucol_strcoll( colCaseInsensitive,
122-
a, len,
123-
b, len);
124-
if ( res == 0 && alen != blen )
122+
/*
123+
* Preventing any influence of following characters to
124+
* current one, try
125+
* select * from (values ('е'::mchar),('ё'),('еа'),('еб'),('ее'),('еж'),
126+
* ('ёа'),('ёб'),('ёё'),('ёж'),('ёе'),('её')) z
127+
* order by 1;
128+
*/
129+
for (i=0; i<len; i++)
130+
{
131+
res = (int)ucol_strcoll(colCaseInsensitive,
132+
a + i, 1,
133+
b + i, 1);
134+
if (res)
135+
return res;
136+
}
137+
138+
if (alen != blen)
125139
return (alen > blen) ? 1 : - 1;
126-
return res;
140+
return 0;
127141
}
128142

129143
int
130144
UCharCompare(UChar * a, int alen, UChar *b, int blen) {
131145
int len = Min(alen, blen);
132-
int res;
146+
int i, res;
133147

134148
createUObjs();
135149

136-
res = (int)ucol_strcoll( colCaseSensitive,
137-
a, len,
138-
b, len);
139-
if ( res == 0 && alen != blen )
150+
/* see above */
151+
for (i=0; i<len; i++)
152+
{
153+
res = (int)ucol_strcoll(colCaseSensitive,
154+
a + i, 1,
155+
b + i, 1);
156+
if (res)
157+
return res;
158+
}
159+
160+
if (alen != blen)
140161
return (alen > blen) ? 1 : - 1;
141-
return res;
162+
return 0;
142163
}

contrib/mchar/sql/mm.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,8 @@ SELECT * FROM a, c WHERE mvarchar255 = mchar2;
183183
DROP TABLE a;
184184
DROP TABLE c;
185185

186+
select * from (values ('е'::mchar),('ё'),('еа'),('еб'),('ее'),('еж'),('ёа'),('ёб'),('ёё'),('ёж'),('ёе'),('её')) z order by 1;
187+
select mvarchar_icase_cmp('ё', 'е');
188+
select mvarchar_icase_cmp('Ё', 'Е');
189+
select mvarchar_icase_cmp('й', 'и');
190+
select mvarchar_icase_cmp('Й', 'И');

contrib/mmts/multimaster--1.0.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ CREATE FUNCTION mtm.make_table_local(relation regclass) RETURNS void
8484
AS 'MODULE_PATHNAME','mtm_make_table_local'
8585
LANGUAGE C;
8686

87-
CREATE FUNCTION mtm.broadcast_table(srcTable regclass, dstNodesMask bigint) RETURNS void
87+
CREATE FUNCTION mtm.broadcast_table(srcTable regclass) RETURNS void
8888
AS 'MODULE_PATHNAME','mtm_broadcast_table'
8989
LANGUAGE C;
9090

contrib/mmts/multimaster.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -602,8 +602,9 @@ csn_t MtmDistributedTransactionSnapshot(TransactionId xid, int nodeId, nodemask_
602602
MtmTransState* ts = (MtmTransState*)hash_search(MtmXid2State, &xid, HASH_FIND, NULL);
603603
if (ts != NULL) {
604604
*participantsMask = ts->participantsMask;
605-
/* If node is disables, then we are in a process of recovery of this node */
606-
snapshot = ts->snapshot;
605+
if (!ts->isLocal)
606+
snapshot = ts->snapshot;
607+
// /* If node is disables, then we are in a process of recovery of this node */
607608
// if (!ts->isLocal && BIT_CHECK(ts->participantsMask|Mtm->disabledNodeMask, nodeId-1)) {
608609
// snapshot = ts->snapshot;
609610
// Assert(ts->gtid.node == MtmNodeId || MtmIsRecoverySession);
@@ -4458,7 +4459,7 @@ Datum mtm_broadcast_table(PG_FUNCTION_ARGS)
44584459
{
44594460
MtmCopyRequest copy;
44604461
copy.sourceTable = PG_GETARG_OID(0);
4461-
copy.targetNodes = PG_GETARG_INT64(1);
4462+
copy.targetNodes = ~Mtm->disabledNodeMask;
44624463
LogLogicalMessage("B", (char*)&copy, sizeof(copy), true);
44634464
MtmTx.containsDML = true;
44644465
PG_RETURN_VOID();
@@ -5186,7 +5187,8 @@ static void MtmProcessUtility(PlannedStmt *pstmt,
51865187
case T_CreateSeqStmt:
51875188
{
51885189
CreateSeqStmt *stmt = (CreateSeqStmt *) parsetree;
5189-
AdjustCreateSequence(stmt->options);
5190+
if (!MtmVolksWagenMode)
5191+
AdjustCreateSequence(stmt->options);
51905192
}
51915193
break;
51925194

contrib/mmts/pglogical_receiver.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,7 @@ pglogical_receiver_main(Datum main_arg)
705705
continue;
706706

707707
OnError:
708+
ByteBufferReset(&buf);
708709
PQfinish(conn);
709710
MtmReleaseRecoverySlot(nodeId);
710711
MtmSleep(RECEIVER_SUSPEND_TIMEOUT);

contrib/mmts/state.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,15 @@ MtmSetClusterStatus(MtmNodeStatus status)
8888
*/
8989
if (status == MTM_ONLINE)
9090
{
91-
if (!Mtm->refereeGrant && MtmRefereeReadSaved() > 0)
91+
int saved_winner_node_id = MtmRefereeReadSaved();
92+
if (!Mtm->refereeGrant && saved_winner_node_id > 0)
9293
{
9394
/*
9495
* We booted after being with refereeGrant,
9596
* but now have ordinary majority.
9697
*/
9798
MtmPollStatusOfPreparedTransactions(true);
98-
MtmRefereeClearWinner();
99+
Mtm->refereeWinnerId = saved_winner_node_id;
99100
}
100101
}
101102

@@ -783,7 +784,7 @@ MtmRefereeClearWinner(void)
783784
CommitTransactionCommand();
784785
if (rc < 0)
785786
{
786-
MTM_ELOG(WARNING, "Failed to save referee decision, proceeding anyway");
787+
MTM_ELOG(WARNING, "Failed to clean referee decision");
787788
return false;
788789
}
789790
}

contrib/mmts/tests2/lib/test_helper.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,6 @@ def performFailure(self, failure, wait=0, node_wait_for_commit=-1, node_wait_for
9595
self.client.get_aggregates(clean=False)
9696
self.client.stop()
9797

98-
if node_wait_for_commit >= 0:
99-
self.awaitCommit(node_wait_for_commit)
100-
else:
101-
time.sleep(TEST_RECOVERY_TIME)
102-
10398
if node_wait_for_online != None:
10499
self.awaitOnline(node_wait_for_online)
105100
else:
@@ -109,6 +104,11 @@ def performFailure(self, failure, wait=0, node_wait_for_commit=-1, node_wait_for
109104
self.client.bgrun()
110105
time.sleep(3)
111106

107+
if node_wait_for_commit >= 0:
108+
self.awaitCommit(node_wait_for_commit)
109+
else:
110+
time.sleep(TEST_RECOVERY_TIME)
111+
112112
aggs = self.client.get_aggregates()
113113

114114
return (aggs_failure, aggs)

contrib/mmts/tests2/test_recovery.py

Lines changed: 13 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -11,60 +11,7 @@
1111

1212
from lib.bank_client import MtmClient
1313
from lib.failure_injector import *
14-
15-
TEST_WARMING_TIME = 5
16-
TEST_DURATION = 10
17-
TEST_RECOVERY_TIME = 30
18-
TEST_SETUP_TIME = 20
19-
TEST_STOP_DELAY = 5
20-
21-
class TestHelper(object):
22-
23-
def assertIsolation(self, aggs):
24-
isolated = True
25-
for conn_id, agg in enumerate(aggs):
26-
isolated = isolated and agg['sumtotal']['isolation'] == 0
27-
if not isolated:
28-
raise AssertionError('Isolation failure')
29-
30-
def assertCommits(self, aggs):
31-
commits = True
32-
for conn_id, agg in enumerate(aggs):
33-
commits = commits and 'commit' in agg['transfer']['finish']
34-
if not commits:
35-
print('No commits during aggregation interval')
36-
# time.sleep(100000)
37-
raise AssertionError('No commits during aggregation interval')
38-
39-
def assertNoCommits(self, aggs):
40-
commits = True
41-
for conn_id, agg in enumerate(aggs):
42-
commits = commits and 'commit' in agg['transfer']['finish']
43-
if commits:
44-
raise AssertionError('There are commits during aggregation interval')
45-
46-
def performFailure(self, failure):
47-
48-
time.sleep(TEST_WARMING_TIME)
49-
50-
print('Simulate failure at ',datetime.datetime.utcnow())
51-
52-
failure.start()
53-
54-
self.client.clean_aggregates()
55-
time.sleep(TEST_DURATION)
56-
aggs_failure = self.client.get_aggregates()
57-
58-
failure.stop()
59-
60-
print('Eliminate failure at ',datetime.datetime.utcnow())
61-
62-
self.client.clean_aggregates()
63-
time.sleep(TEST_RECOVERY_TIME)
64-
aggs = self.client.get_aggregates()
65-
66-
return (aggs_failure, aggs)
67-
14+
from lib.test_helper import *
6815

6916
class RecoveryTest(unittest.TestCase, TestHelper):
7017

@@ -124,7 +71,8 @@ def test_normal_operations(self):
12471
def test_node_partition(self):
12572
print('### test_node_partition ###')
12673

127-
aggs_failure, aggs = self.performFailure(SingleNodePartition('node3'))
74+
aggs_failure, aggs = self.performFailure(SingleNodePartition('node3'),
75+
node_wait_for_online="dbname=regression user=postgres host=127.0.0.1 port=15434", stop_load=True)
12876

12977
self.assertCommits(aggs_failure[:2])
13078
self.assertNoCommits(aggs_failure[2:])
@@ -148,7 +96,8 @@ def test_edge_partition(self):
14896
def test_node_restart(self):
14997
print('### test_node_restart ###')
15098

151-
aggs_failure, aggs = self.performFailure(RestartNode('node3'))
99+
aggs_failure, aggs = self.performFailure(RestartNode('node3'),
100+
node_wait_for_online="dbname=regression user=postgres host=127.0.0.1 port=15434", stop_load=True)
152101

153102
self.assertCommits(aggs_failure[:2])
154103
self.assertNoCommits(aggs_failure[2:])
@@ -160,7 +109,8 @@ def test_node_restart(self):
160109
def test_node_crash(self):
161110
print('### test_node_crash ###')
162111

163-
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node3'))
112+
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node3'),
113+
node_wait_for_online="dbname=regression user=postgres host=127.0.0.1 port=15434", stop_load=True)
164114

165115
self.assertCommits(aggs_failure[:2])
166116
self.assertNoCommits(aggs_failure[2:])
@@ -172,7 +122,8 @@ def test_node_crash(self):
172122
def test_node_bicrash(self):
173123
print('### test_node_bicrash ###')
174124

175-
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node3'))
125+
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node3'),
126+
node_wait_for_commit=2, stop_load=True)
176127

177128
self.assertCommits(aggs_failure[:2])
178129
self.assertNoCommits(aggs_failure[2:])
@@ -181,10 +132,11 @@ def test_node_bicrash(self):
181132
self.assertCommits(aggs)
182133
self.assertIsolation(aggs)
183134

184-
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node3'))
135+
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node1'),
136+
node_wait_for_commit=0, stop_load=True)
185137

186-
self.assertCommits(aggs_failure[:2])
187-
self.assertNoCommits(aggs_failure[2:])
138+
self.assertNoCommits(aggs_failure[0:1]) # [1]
139+
self.assertCommits(aggs_failure[1:]) # [2, 3]
188140
self.assertIsolation(aggs_failure)
189141

190142
self.assertCommits(aggs)

0 commit comments

Comments
 (0)