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

Commit6fb7a70

Browse files
committed
Merge branch 'master' into syncrep
2 parentsa1fcfac +0583873 commit6fb7a70

File tree

7 files changed

+414
-29
lines changed

7 files changed

+414
-29
lines changed

‎docs/source/testgres.rst

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,19 @@ testgres.standby
6767
..automodule::testgres.standby
6868
:members:
6969
:undoc-members:
70-
:show-inheritance:
70+
:show-inheritance:
71+
72+
testgres.pubsub
73+
---------------
74+
75+
..automodule::testgres.pubsub
76+
77+
..autoclass::testgres.node.Publication
78+
:members:
79+
80+
..automethod::__init__
81+
82+
..autoclass::testgres.node.Subscription
83+
:members:
84+
85+
..automethod::__init__

‎testgres/connection.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ class NodeConnection(object):
2727
Transaction wrapper returned by Node
2828
"""
2929

30-
def__init__(self,node,dbname=None,username=None,password=None):
30+
def__init__(self,
31+
node,
32+
dbname=None,
33+
username=None,
34+
password=None,
35+
autocommit=False):
3136

3237
# Set default arguments
3338
dbname=dbnameordefault_dbname()
@@ -42,6 +47,7 @@ def __init__(self, node, dbname=None, username=None, password=None):
4247
host=node.host,
4348
port=node.port)
4449

50+
self._connection.autocommit=autocommit
4551
self._cursor=self.connection.cursor()
4652

4753
@property

‎testgres/consts.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,6 @@
2929
MAX_REPLICATION_SLOTS=10
3030
MAX_WAL_SENDERS=10
3131
WAL_KEEP_SEGMENTS=20
32+
33+
# logical replication settings
34+
LOGICAL_REPL_MAX_CATCHUP_ATTEMPTS=60

‎testgres/node.py

Lines changed: 73 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,17 @@
5858
QueryException, \
5959
StartNodeException, \
6060
TimeoutException, \
61+
InitNodeException, \
6162
TestgresException, \
6263
BackupException
6364

6465
from .loggerimportTestgresLogger
6566

67+
from .pubsubimportPublication,Subscription
68+
6669
from .standbyimportFirst
6770

71+
6872
from .utilsimport \
6973
eprint, \
7074
get_bin_path, \
@@ -73,6 +77,7 @@
7377
reserve_port, \
7478
release_port, \
7579
execute_utility, \
80+
options_string, \
7681
clean_on_error
7782

7883
from .backupimportNodeBackup
@@ -303,24 +308,24 @@ def _create_recovery_conf(self, username, slot=None):
303308
master=self.master
304309
assertmasterisnotNone
305310

306-
conninfo=(
307-
u"application_name={} "
308-
u"port={} "
309-
u"user={} "
310-
).format(self.name,master.port,username)# yapf: disable
311+
conninfo={
312+
"application_name":self.name,
313+
"port":master.port,
314+
"user":username
315+
}# yapf: disable
311316

312317
# host is tricky
313318
try:
314319
importipaddress
315320
ipaddress.ip_address(master.host)
316-
conninfo+=u"hostaddr={}".format(master.host)
321+
conninfo["hostaddr"]=master.host
317322
exceptValueError:
318-
conninfo+=u"host={}".format(master.host)
323+
conninfo["host"]=master.host
319324

320325
line= (
321326
"primary_conninfo='{}'\n"
322327
"standby_mode=on\n"
323-
).format(conninfo)# yapf: disable
328+
).format(options_string(**conninfo))# yapf: disable
324329

325330
ifslot:
326331
# Connect to master for some additional actions
@@ -416,6 +421,7 @@ def default_conf(self,
416421
fsync=False,
417422
unix_sockets=True,
418423
allow_streaming=True,
424+
allow_logical=False,
419425
log_statement='all'):
420426
"""
421427
Apply default settings to this node.
@@ -424,6 +430,7 @@ def default_conf(self,
424430
fsync: should this node use fsync to keep data safe?
425431
unix_sockets: should we enable UNIX sockets?
426432
allow_streaming: should this node add a hba entry for replication?
433+
allow_logical: can this node be used as a logical replication publisher?
427434
log_statement: one of ('all', 'off', 'mod', 'ddl').
428435
429436
Returns:
@@ -500,6 +507,13 @@ def get_auth_method(t):
500507
WAL_KEEP_SEGMENTS,
501508
wal_level))# yapf: disable
502509

510+
ifallow_logical:
511+
ifnotpg_version_ge('10'):
512+
raiseInitNodeException(
513+
"Logical replication is only available for Postgres 10 "
514+
"and newer")
515+
conf.write(u"wal_level = logical\n")
516+
503517
# disable UNIX sockets if asked to
504518
ifnotunix_sockets:
505519
conf.write(u"unix_socket_directories = ''\n")
@@ -940,13 +954,14 @@ def poll_query_until(self,
940954
ifresisNone:
941955
raiseQueryException('Query returned None',query)
942956

943-
iflen(res)==0:
944-
raiseQueryException('Query returned 0 rows',query)
945-
946-
iflen(res[0])==0:
947-
raiseQueryException('Query returned 0 columns',query)
948-
949-
ifres[0][0]==expected:
957+
# result set is not empty
958+
iflen(res):
959+
iflen(res[0])==0:
960+
raiseQueryException('Query returned 0 columns',query)
961+
ifres[0][0]==expected:
962+
return# done
963+
# empty result set is considered as None
964+
elifexpectedisNone:
950965
return# done
951966

952967
exceptProgrammingErrorase:
@@ -985,13 +1000,11 @@ def execute(self,
9851000

9861001
withself.connect(dbname=dbname,
9871002
username=username,
988-
password=password)asnode_con:# yapf: disable
1003+
password=password,
1004+
autocommit=commit)asnode_con:# yapf: disable
9891005

9901006
res=node_con.execute(query)
9911007

992-
ifcommit:
993-
node_con.commit()
994-
9951008
returnres
9961009

9971010
defbackup(self,**kwargs):
@@ -1094,6 +1107,37 @@ def catchup(self, dbname=None, username=None):
10941107
exceptExceptionase:
10951108
raise_from(CatchUpException("Failed to catch up",poll_lsn),e)
10961109

1110+
defpublish(self,name,**kwargs):
1111+
"""
1112+
Create publication for logical replication
1113+
1114+
Args:
1115+
pubname: publication name
1116+
tables: tables names list
1117+
dbname: database name where objects or interest are located
1118+
username: replication username
1119+
"""
1120+
returnPublication(name=name,node=self,**kwargs)
1121+
1122+
defsubscribe(self,publication,name,dbname=None,username=None,
1123+
**params):
1124+
"""
1125+
Create subscription for logical replication
1126+
1127+
Args:
1128+
name: subscription name
1129+
publication: publication object obtained from publish()
1130+
dbname: database name
1131+
username: replication username
1132+
params: subscription parameters (see documentation on `CREATE SUBSCRIPTION
1133+
<https://www.postgresql.org/docs/current/static/sql-createsubscription.html>`_
1134+
for details)
1135+
"""
1136+
# yapf: disable
1137+
returnSubscription(name=name,node=self,publication=publication,
1138+
dbname=dbname,username=username,**params)
1139+
# yapf: enable
1140+
10971141
defpgbench(self,
10981142
dbname=None,
10991143
username=None,
@@ -1192,14 +1236,21 @@ def pgbench_run(self, dbname=None, username=None, options=[], **kwargs):
11921236

11931237
returnexecute_utility(_params,self.utils_log_file)
11941238

1195-
defconnect(self,dbname=None,username=None,password=None):
1239+
defconnect(self,
1240+
dbname=None,
1241+
username=None,
1242+
password=None,
1243+
autocommit=False):
11961244
"""
11971245
Connect to a database.
11981246
11991247
Args:
12001248
dbname: database name to connect to.
12011249
username: database user name.
12021250
password: user's password.
1251+
autocommit: commit each statement automatically. Also it should be
1252+
set to `True` for statements requiring to be run outside
1253+
a transaction? such as `VACUUM` or `CREATE DATABASE`.
12031254
12041255
Returns:
12051256
An instance of :class:`.NodeConnection`.
@@ -1208,4 +1259,5 @@ def connect(self, dbname=None, username=None, password=None):
12081259
returnNodeConnection(node=self,
12091260
dbname=dbname,
12101261
username=username,
1211-
password=password)# yapf: disable
1262+
password=password,
1263+
autocommit=autocommit)# yapf: disable

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp