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

Commit09dab31

Browse files
PostgresNode refactoring [PostgresNodePortManager and RO-properties]
PostgresNode uses PostgresNodePortManager to reserve/release port numberNew PostgresNode RO-properties are added: - name - host - port - ssh_key
1 parentafee4a5 commit09dab31

File tree

1 file changed

+141
-22
lines changed

1 file changed

+141
-22
lines changed

‎testgres/node.py

Lines changed: 141 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
fromqueueimportQueue
1111

1212
importtime
13+
importtyping
1314

1415
try:
1516
fromcollections.abcimportIterable
@@ -131,12 +132,47 @@ def __repr__(self):
131132
repr(self.process))
132133

133134

135+
classPostgresNodePortManager:
136+
defreserve_port(self)->int:
137+
raiseNotImplementedError("PostManager::reserve_port is not implemented.")
138+
139+
defrelease_port(self,number:int)->None:
140+
asserttype(number)==int# noqa: E721
141+
raiseNotImplementedError("PostManager::release_port is not implemented.")
142+
143+
144+
classPostgresNodePortManager__Global(PostgresNodePortManager):
145+
def__init__(self):
146+
pass
147+
148+
defreserve_port(self)->int:
149+
returnutils.reserve_port()
150+
151+
defrelease_port(self,number:int)->None:
152+
asserttype(number)==int# noqa: E721
153+
returnutils.release_port(number)
154+
155+
134156
classPostgresNode(object):
135157
# a max number of node start attempts
136158
_C_MAX_START_ATEMPTS=5
137159

138-
def__init__(self,name=None,base_dir=None,port=None,conn_params:ConnectionParams=ConnectionParams(),
139-
bin_dir=None,prefix=None,os_ops=None):
160+
_name:typing.Optional[str]
161+
_host:typing.Optional[str]
162+
_port:typing.Optional[int]
163+
_should_free_port:bool
164+
_os_ops:OsOperations
165+
_port_manager:PostgresNodePortManager
166+
167+
def__init__(self,
168+
name=None,
169+
base_dir=None,
170+
port:typing.Optional[int]=None,
171+
conn_params:ConnectionParams=ConnectionParams(),
172+
bin_dir=None,
173+
prefix=None,
174+
os_ops:typing.Optional[OsOperations]=None,
175+
port_manager:typing.Optional[PostgresNodePortManager]=None):
140176
"""
141177
PostgresNode constructor.
142178
@@ -145,34 +181,57 @@ def __init__(self, name=None, base_dir=None, port=None, conn_params: ConnectionP
145181
port: port to accept connections.
146182
base_dir: path to node's data directory.
147183
bin_dir: path to node's binary directory.
184+
os_ops: None or correct OS operation object.
185+
port_manager: None or correct port manager object.
148186
"""
187+
assertportisNoneortype(port)==int# noqa: E721
188+
assertos_opsisNoneorisinstance(os_ops,OsOperations)
189+
assertport_managerisNoneorisinstance(port_manager,PostgresNodePortManager)
149190

150191
# private
151192
ifos_opsisNone:
152-
os_ops=__class__._get_os_ops(conn_params)
193+
self._os_ops=__class__._get_os_ops(conn_params)
153194
else:
154195
assertconn_paramsisNone
196+
assertisinstance(os_ops,OsOperations)
197+
self._os_ops=os_ops
155198
pass
156199

157-
assertos_opsisnotNone
158-
assertisinstance(os_ops,OsOperations)
159-
self._os_ops=os_ops
200+
assertself._os_opsisnotNone
201+
assertisinstance(self._os_ops,OsOperations)
160202

161-
self._pg_version=PgVer(get_pg_version2(os_ops,bin_dir))
162-
self._should_free_port=portisNone
203+
self._pg_version=PgVer(get_pg_version2(self._os_ops,bin_dir))
163204
self._base_dir=base_dir
164205
self._bin_dir=bin_dir
165206
self._prefix=prefix
166207
self._logger=None
167208
self._master=None
168209

169210
# basic
170-
self.name=nameorgenerate_app_name()
211+
self._name=nameorgenerate_app_name()
212+
self._host=self._os_ops.host
171213

172-
self.host=os_ops.host
173-
self.port=portorutils.reserve_port()
214+
ifportisnotNone:
215+
asserttype(port)==int# noqa: E721
216+
assertport_managerisNone
217+
self._port=port
218+
self._should_free_port=False
219+
self._port_manager=None
220+
else:
221+
ifport_managerisnotNone:
222+
assertisinstance(port_manager,PostgresNodePortManager)
223+
self._port_manager=port_manager
224+
else:
225+
self._port_manager=__class__._get_port_manager(self._os_ops)
226+
227+
assertself._port_managerisnotNone
228+
assertisinstance(self._port_manager,PostgresNodePortManager)
229+
230+
self._port=self._port_manager.reserve_port()# raises
231+
asserttype(self._port)==int# noqa: E721
232+
self._should_free_port=True
174233

175-
self.ssh_key=os_ops.ssh_key
234+
asserttype(self._port)==int# noqa: E721
176235

177236
# defaults for __exit__()
178237
self.cleanup_on_good_exit=testgres_config.node_cleanup_on_good_exit
@@ -207,7 +266,11 @@ def __exit__(self, type, value, traceback):
207266

208267
def__repr__(self):
209268
return"{}(name='{}', port={}, base_dir='{}')".format(
210-
self.__class__.__name__,self.name,self.port,self.base_dir)
269+
self.__class__.__name__,
270+
self.name,
271+
str(self._port)ifself._portisnotNoneelse"None",
272+
self.base_dir
273+
)
211274

212275
@staticmethod
213276
def_get_os_ops(conn_params:ConnectionParams)->OsOperations:
@@ -221,12 +284,28 @@ def _get_os_ops(conn_params: ConnectionParams) -> OsOperations:
221284

222285
returnLocalOperations(conn_params)
223286

287+
@staticmethod
288+
def_get_port_manager(os_ops:OsOperations)->PostgresNodePortManager:
289+
assertos_opsisnotNone
290+
assertisinstance(os_ops,OsOperations)
291+
292+
# [2025-04-03] It is our old, incorrected behaviour
293+
returnPostgresNodePortManager__Global()
294+
224295
defclone_with_new_name_and_base_dir(self,name:str,base_dir:str):
225296
assertnameisNoneortype(name)==str# noqa: E721
226297
assertbase_dirisNoneortype(base_dir)==str# noqa: E721
227298

228299
assert__class__==PostgresNode
229300

301+
ifself._port_managerisNone:
302+
raiseInvalidOperationException("PostgresNode without PortManager can't be cloned.")
303+
304+
assertself._port_managerisnotNone
305+
assertisinstance(self._port_manager,PostgresNodePortManager)
306+
assertself._os_opsisnotNone
307+
assertisinstance(self._os_ops,OsOperations)
308+
230309
node=PostgresNode(
231310
name=name,
232311
base_dir=base_dir,
@@ -243,6 +322,34 @@ def os_ops(self) -> OsOperations:
243322
assertisinstance(self._os_ops,OsOperations)
244323
returnself._os_ops
245324

325+
@property
326+
defname(self)->str:
327+
ifself._nameisNone:
328+
raiseInvalidOperationException("PostgresNode name is not defined.")
329+
asserttype(self._name)==str# noqa: E721
330+
returnself._name
331+
332+
@property
333+
defhost(self)->str:
334+
ifself._hostisNone:
335+
raiseInvalidOperationException("PostgresNode host is not defined.")
336+
asserttype(self._host)==str# noqa: E721
337+
returnself._host
338+
339+
@property
340+
defport(self)->int:
341+
ifself._portisNone:
342+
raiseInvalidOperationException("PostgresNode port is not defined.")
343+
344+
asserttype(self._port)==int# noqa: E721
345+
returnself._port
346+
347+
@property
348+
defssh_key(self)->typing.Optional[str]:
349+
assertself._os_opsisnotNone
350+
assertisinstance(self._os_ops,OsOperations)
351+
returnself._os_ops.ssh_key
352+
246353
@property
247354
defpid(self):
248355
"""
@@ -993,6 +1100,11 @@ def start(self, params=[], wait=True):
9931100
ifself.is_started:
9941101
returnself
9951102

1103+
ifself._portisNone:
1104+
raiseInvalidOperationException("Can't start PostgresNode. Port is node defined.")
1105+
1106+
asserttype(self._port)==int# noqa: E721
1107+
9961108
_params= [self._get_bin_path("pg_ctl"),
9971109
"-D",self.data_dir,
9981110
"-l",self.pg_log_file,
@@ -1023,6 +1135,8 @@ def LOCAL__raise_cannot_start_node__std(from_exception):
10231135
LOCAL__raise_cannot_start_node__std(e)
10241136
else:
10251137
assertself._should_free_port
1138+
assertself._port_managerisnotNone
1139+
assertisinstance(self._port_manager,PostgresNodePortManager)
10261140
assert__class__._C_MAX_START_ATEMPTS>1
10271141

10281142
log_files0=self._collect_log_files()
@@ -1048,20 +1162,20 @@ def LOCAL__raise_cannot_start_node__std(from_exception):
10481162

10491163
log_files0=log_files1
10501164
logging.warning(
1051-
"Detected a conflict with using the port {0}. Trying another port after a {1}-second sleep...".format(self.port,timeout)
1165+
"Detected a conflict with using the port {0}. Trying another port after a {1}-second sleep...".format(self._port,timeout)
10521166
)
10531167
time.sleep(timeout)
10541168
timeout=min(2*timeout,5)
1055-
cur_port=self.port
1056-
new_port=utils.reserve_port()# can raise
1169+
cur_port=self._port
1170+
new_port=self._port_manager.reserve_port()# can raise
10571171
try:
10581172
options= {'port':new_port}
10591173
self.set_auto_conf(options)
10601174
except:# noqa: E722
1061-
utils.release_port(new_port)
1175+
self._port_manager.release_port(new_port)
10621176
raise
1063-
self.port=new_port
1064-
utils.release_port(cur_port)
1177+
self._port=new_port
1178+
self._port_manager.release_port(cur_port)
10651179
continue
10661180
break
10671181
self._maybe_start_logger()
@@ -1226,10 +1340,15 @@ def free_port(self):
12261340
"""
12271341

12281342
ifself._should_free_port:
1229-
port=self.port
1343+
asserttype(self._port)==int# noqa: E721
1344+
1345+
assertself._port_managerisnotNone
1346+
assertisinstance(self._port_manager,PostgresNodePortManager)
1347+
1348+
port=self._port
12301349
self._should_free_port=False
1231-
self.port=None
1232-
utils.release_port(port)
1350+
self._port=None
1351+
self._port_manager.release_port(port)
12331352

12341353
defcleanup(self,max_attempts=3,full=False):
12351354
"""

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp