@@ -1064,6 +1064,123 @@ def test_the_same_port(self):
10641064
10651065self .assertIn ("Cannot start node" ,str (ctx .exception ))
10661066
1067+ class tagPortManagerProxy :
1068+ sm_prev_testgres_reserve_port = None
1069+ sm_prev_testgres_release_port = None
1070+
1071+ sm_DummyPortNumber = None
1072+ sm_DummyPortMaxUsage = None
1073+
1074+ sm_DummyPortCurrentUsage = None
1075+ sm_DummyPortTotalUsage = None
1076+
1077+ def __init__ (self ,dummyPortNumber ,dummyPortMaxUsage ):
1078+ assert type (dummyPortNumber )== int # noqa: E721
1079+ assert type (dummyPortMaxUsage )== int # noqa: E721
1080+ assert dummyPortNumber >= 0
1081+ assert dummyPortMaxUsage >= 0
1082+
1083+ assert __class__ .sm_prev_testgres_reserve_port is None
1084+ assert __class__ .sm_prev_testgres_release_port is None
1085+ assert testgres .utils .reserve_port == testgres .utils .internal__reserve_port
1086+ assert testgres .utils .release_port == testgres .utils .internal__release_port
1087+
1088+ __class__ .sm_prev_testgres_reserve_port = testgres .utils .reserve_port
1089+ __class__ .sm_prev_testgres_release_port = testgres .utils .release_port
1090+
1091+ testgres .utils .reserve_port = __class__ ._proxy__reserve_port
1092+ testgres .utils .release_port = __class__ ._proxy__release_port
1093+
1094+ assert testgres .utils .reserve_port == __class__ ._proxy__reserve_port
1095+ assert testgres .utils .release_port == __class__ ._proxy__release_port
1096+
1097+ __class__ .sm_DummyPortNumber = dummyPortNumber
1098+ __class__ .sm_DummyPortMaxUsage = dummyPortMaxUsage
1099+
1100+ __class__ .sm_DummyPortCurrentUsage = 0
1101+ __class__ .sm_DummyPortTotalUsage = 0
1102+
1103+ def __enter__ (self ):
1104+ return self
1105+
1106+ def __exit__ (self ,type ,value ,traceback ):
1107+ assert __class__ .sm_DummyPortCurrentUsage == 0
1108+
1109+ assert __class__ .sm_prev_testgres_reserve_port is not None
1110+ assert __class__ .sm_prev_testgres_release_port is not None
1111+
1112+ assert testgres .utils .reserve_port == __class__ ._proxy__reserve_port
1113+ assert testgres .utils .release_port == __class__ ._proxy__release_port
1114+
1115+ testgres .utils .reserve_port = __class__ .sm_prev_testgres_reserve_port
1116+ testgres .utils .release_port = __class__ .sm_prev_testgres_release_port
1117+
1118+ __class__ .sm_prev_testgres_reserve_port = None
1119+ __class__ .sm_prev_testgres_release_port = None
1120+
1121+ def _proxy__reserve_port ():
1122+ assert type (__class__ .sm_DummyPortMaxUsage )== int # noqa: E721
1123+ assert type (__class__ .sm_DummyPortTotalUsage )== int # noqa: E721
1124+ assert type (__class__ .sm_DummyPortCurrentUsage )== int # noqa: E721
1125+ assert __class__ .sm_DummyPortTotalUsage >= 0
1126+ assert __class__ .sm_DummyPortCurrentUsage >= 0
1127+
1128+ assert __class__ .sm_DummyPortTotalUsage <= __class__ .sm_DummyPortMaxUsage
1129+ assert __class__ .sm_DummyPortCurrentUsage <= __class__ .sm_DummyPortTotalUsage
1130+
1131+ assert __class__ .sm_prev_testgres_reserve_port is not None
1132+
1133+ if __class__ .sm_DummyPortTotalUsage == __class__ .sm_DummyPortMaxUsage :
1134+ return __class__ .sm_prev_testgres_reserve_port ()
1135+
1136+ __class__ .sm_DummyPortTotalUsage += 1
1137+ __class__ .sm_DummyPortCurrentUsage += 1
1138+ return __class__ .sm_DummyPortNumber
1139+
1140+ def _proxy__release_port (dummyPortNumber ):
1141+ assert type (dummyPortNumber )== int # noqa: E721
1142+
1143+ assert type (__class__ .sm_DummyPortMaxUsage )== int # noqa: E721
1144+ assert type (__class__ .sm_DummyPortTotalUsage )== int # noqa: E721
1145+ assert type (__class__ .sm_DummyPortCurrentUsage )== int # noqa: E721
1146+ assert __class__ .sm_DummyPortTotalUsage >= 0
1147+ assert __class__ .sm_DummyPortCurrentUsage >= 0
1148+
1149+ assert __class__ .sm_DummyPortTotalUsage <= __class__ .sm_DummyPortMaxUsage
1150+ assert __class__ .sm_DummyPortCurrentUsage <= __class__ .sm_DummyPortTotalUsage
1151+
1152+ assert __class__ .sm_prev_testgres_release_port is not None
1153+
1154+ if __class__ .sm_DummyPortCurrentUsage > 0 and dummyPortNumber == __class__ .sm_DummyPortNumber :
1155+ assert __class__ .sm_DummyPortTotalUsage > 0
1156+ __class__ .sm_DummyPortCurrentUsage -= 1
1157+ return
1158+
1159+ return __class__ .sm_prev_testgres_release_port (dummyPortNumber )
1160+
1161+ def test_port_rereserve_during_node_start (self ):
1162+ C_COUNT_OF_BAD_PORT_USAGE = 3
1163+
1164+ with get_new_node ()as node1 :
1165+ node1 .init ().start ()
1166+ self .assertTrue (node1 ._should_free_port )
1167+ self .assertEqual (type (node1 .port ),int )# noqa: E721
1168+ node1 .safe_psql ("SELECT 1;" )
1169+
1170+ with __class__ .tagPortManagerProxy (node1 .port ,C_COUNT_OF_BAD_PORT_USAGE ):
1171+ assert __class__ .tagPortManagerProxy .sm_DummyPortNumber == node1 .port
1172+ with get_new_node ()as node2 :
1173+ self .assertTrue (node2 ._should_free_port )
1174+ self .assertEqual (node2 .port ,node1 .port )
1175+
1176+ node2 .init ().start ()
1177+
1178+ self .assertNotEqual (node2 .port ,node1 .port )
1179+ self .assertEqual (__class__ .tagPortManagerProxy .sm_DummyPortCurrentUsage ,0 )
1180+ self .assertEqual (__class__ .tagPortManagerProxy .sm_DummyPortTotalUsage ,C_COUNT_OF_BAD_PORT_USAGE )
1181+
1182+ node2 .safe_psql ("SELECT 1;" )
1183+
10671184def test_simple_with_bin_dir (self ):
10681185with get_new_node ()as node :
10691186node .init ().start ()