2424 res = node2.start().execute('postgres', 'select 2')
2525 print(res)
2626
27-
2827Copyright (c) 2016, Postgres Professional
2928"""
3029
@@ -367,19 +366,17 @@ def __bool__(self):
367366
368367
369368class PostgresNode (object ):
370- def __init__ (self , name , port , base_dir = None , use_logging = False ):
369+ def __init__ (self , name , port = None , base_dir = None , use_logging = False ):
371370 global bound_ports
372371
373372 # check that port is not used
374373 if port in bound_ports :
375374 raise InitNodeException ('port {} is already in use' .format (port ))
376375
377- # mark port as used
378- bound_ports .add (port )
379-
380376 self .name = name
381377 self .host = '127.0.0.1'
382- self .port = port
378+ self .port = port or reserve_port ()
379+ self .should_free_port = port is None
383380 self .base_dir = base_dir or tempfile .mkdtemp ()
384381 self .use_logging = use_logging
385382 self .logger = None
@@ -397,7 +394,7 @@ def __exit__(self, type, value, traceback):
397394 # stop node if necessary
398395 self .cleanup ()
399396
400- # mark port as free
397+ # free port if necessary
401398 self .free_port ()
402399
403400 @property
@@ -470,7 +467,7 @@ def init(self, allow_streaming=False, fsync=False, initdb_params=[]):
470467 conf .write ("listen_addresses = '{}'\n " .format (self .host ))
471468
472469 if allow_streaming :
473- cur_ver = LooseVersion (get_pg_config (). get ( "VERSION_NUM" ) )
470+ cur_ver = LooseVersion (get_pg_config ()[ "VERSION_NUM" ] )
474471 min_ver = LooseVersion ('9.6.0' )
475472
476473 # select a proper wal_level for PostgreSQL
@@ -680,10 +677,11 @@ def reload(self, params={}):
680677
681678 def free_port (self ):
682679 """
683- Reclaim port used by this node
680+ Reclaim port owned by this node.
684681 """
685682
686- bound_ports .remove (self .port )
683+ if self .should_free_port :
684+ release_port (self .port )
687685
688686 def cleanup (self ):
689687 """
@@ -1007,11 +1005,30 @@ def get_bin_path(filename):
10071005 pg_config = get_pg_config ()
10081006
10091007 if pg_config and "BINDIR" in pg_config :
1010- return os .path .join (pg_config . get ( "BINDIR" ) , filename )
1008+ return os .path .join (pg_config [ "BINDIR" ] , filename )
10111009
10121010 return filename
10131011
10141012
1013+ def reserve_port ():
1014+ """
1015+ Generate a new port and add it to 'bound_ports'.
1016+ """
1017+
1018+ port = port_for .select_random (exclude_ports = bound_ports )
1019+ bound_ports .add (port )
1020+
1021+ return port
1022+
1023+
1024+ def release_port (port ):
1025+ """
1026+ Free port provided by reserve_port().
1027+ """
1028+
1029+ bound_ports .remove (port )
1030+
1031+
10151032def get_pg_config ():
10161033 """
10171034 Return output of pg_config.
@@ -1020,7 +1037,7 @@ def get_pg_config():
10201037 global pg_config_data
10211038
10221039 if not pg_config_data :
1023- pg_config_cmd = os .environ . get ( "PG_CONFIG" ) or "pg_config"
1040+ pg_config_cmd = os .environ [ "PG_CONFIG" ] or "pg_config"
10241041
10251042 out = six .StringIO (subprocess .check_output ([pg_config_cmd ],
10261043 universal_newlines = True ))
@@ -1030,7 +1047,7 @@ def get_pg_config():
10301047 pg_config_data [key .strip ()] = value .strip ()
10311048
10321049 # Fetch version of PostgreSQL and save it as VERSION_NUM
1033- version_parts = pg_config_data . get ( "VERSION" ) .split (" " )
1050+ version_parts = pg_config_data [ "VERSION" ] .split (" " )
10341051 pg_config_data ["VERSION_NUM" ] = version_parts [- 1 ]
10351052
10361053 return pg_config_data
@@ -1049,7 +1066,4 @@ def get_new_node(name, base_dir=None, use_logging=False):
10491066 An instance of PostgresNode.
10501067 """
10511068
1052- # generate a new unique port
1053- port = port_for .select_random (exclude_ports = bound_ports )
1054-
1055- return PostgresNode (name , port , base_dir , use_logging = use_logging )
1069+ return PostgresNode (name = name , base_dir = base_dir , use_logging = use_logging )
0 commit comments