1
- from typing import Tuple
2
- import psycopg2
3
- import psutil
4
1
import os
5
2
import signal
6
3
import time
7
4
8
- SHUTDOWN_TIMEOUT = 5
9
-
10
- PGCAT_HOST = "127.0.0.1"
11
- PGCAT_PORT = "6432"
12
-
13
-
14
- def pgcat_start ():
15
- pg_cat_send_signal (signal .SIGTERM )
16
- os .system ("./target/debug/pgcat .circleci/pgcat.toml &" )
17
- time .sleep (2 )
18
-
19
-
20
- def pg_cat_send_signal (signal : signal .Signals ):
21
- try :
22
- for proc in psutil .process_iter (["pid" , "name" ]):
23
- if "pgcat" == proc .name ():
24
- os .kill (proc .pid , signal )
25
- except Exception as e :
26
- # The process can be gone when we send this signal
27
- print (e )
28
-
29
- if signal == signal .SIGTERM :
30
- # Returns 0 if pgcat process exists
31
- time .sleep (2 )
32
- if not os .system ('pgrep pgcat' ):
33
- raise Exception ("pgcat not closed after SIGTERM" )
34
-
35
-
36
- def connect_db (
37
- autocommit : bool = True ,
38
- admin : bool = False ,
39
- ) -> Tuple [psycopg2 .extensions .connection , psycopg2 .extensions .cursor ]:
40
-
41
- if admin :
42
- user = "admin_user"
43
- password = "admin_pass"
44
- db = "pgcat"
45
- else :
46
- user = "sharding_user"
47
- password = "sharding_user"
48
- db = "sharded_db"
49
-
50
- conn = psycopg2 .connect (
51
- f"postgres://{ user } :{ password } @{ PGCAT_HOST } :{ PGCAT_PORT } /{ db } ?application_name=testing_pgcat" ,
52
- connect_timeout = 2 ,
53
- )
54
- conn .autocommit = autocommit
55
- cur = conn .cursor ()
56
-
57
- return (conn , cur )
58
-
5
+ import psycopg2
59
6
60
- def cleanup_conn (conn : psycopg2 .extensions .connection , cur : psycopg2 .extensions .cursor ):
61
- cur .close ()
62
- conn .close ()
7
+ import utils
63
8
9
+ SHUTDOWN_TIMEOUT = 5
64
10
65
11
def test_normal_db_access ():
66
- pgcat_start ()
67
- conn , cur = connect_db (autocommit = False )
12
+ utils . pgcat_start ()
13
+ conn , cur = utils . connect_db (autocommit = False )
68
14
cur .execute ("SELECT 1" )
69
15
res = cur .fetchall ()
70
16
print (res )
71
- cleanup_conn (conn , cur )
17
+ utils . cleanup_conn (conn , cur )
72
18
73
19
74
20
def test_admin_db_access ():
75
- conn , cur = connect_db (admin = True )
21
+ conn , cur = utils . connect_db (admin = True )
76
22
77
23
cur .execute ("SHOW POOLS" )
78
24
res = cur .fetchall ()
79
25
print (res )
80
- cleanup_conn (conn , cur )
26
+ utils . cleanup_conn (conn , cur )
81
27
82
28
83
29
def test_shutdown_logic ():
@@ -86,17 +32,17 @@ def test_shutdown_logic():
86
32
# NO ACTIVE QUERIES SIGINT HANDLING
87
33
88
34
# Start pgcat
89
- pgcat_start ()
35
+ utils . pgcat_start ()
90
36
91
37
# Create client connection and send query (not in transaction)
92
- conn , cur = connect_db ()
38
+ conn , cur = utils . connect_db ()
93
39
94
40
cur .execute ("BEGIN;" )
95
41
cur .execute ("SELECT 1;" )
96
42
cur .execute ("COMMIT;" )
97
43
98
44
# Send sigint to pgcat
99
- pg_cat_send_signal (signal .SIGINT )
45
+ utils . pg_cat_send_signal (signal .SIGINT )
100
46
time .sleep (1 )
101
47
102
48
# Check that any new queries fail after sigint since server should close with no active transactions
@@ -108,18 +54,18 @@ def test_shutdown_logic():
108
54
# Fail if query execution succeeded
109
55
raise Exception ("Server not closed after sigint" )
110
56
111
- cleanup_conn (conn , cur )
112
- pg_cat_send_signal (signal .SIGTERM )
57
+ utils . cleanup_conn (conn , cur )
58
+ utils . pg_cat_send_signal (signal .SIGTERM )
113
59
114
60
# - - - - - - - - - - - - - - - - - -
115
61
# NO ACTIVE QUERIES ADMIN SHUTDOWN COMMAND
116
62
117
63
# Start pgcat
118
- pgcat_start ()
64
+ utils . pgcat_start ()
119
65
120
66
# Create client connection and begin transaction
121
- conn , cur = connect_db ()
122
- admin_conn , admin_cur = connect_db (admin = True )
67
+ conn , cur = utils . connect_db ()
68
+ admin_conn , admin_cur = utils . connect_db (admin = True )
123
69
124
70
cur .execute ("BEGIN;" )
125
71
cur .execute ("SELECT 1;" )
@@ -138,24 +84,24 @@ def test_shutdown_logic():
138
84
# Fail if query execution succeeded
139
85
raise Exception ("Server not closed after sigint" )
140
86
141
- cleanup_conn (conn , cur )
142
- cleanup_conn (admin_conn , admin_cur )
143
- pg_cat_send_signal (signal .SIGTERM )
87
+ utils . cleanup_conn (conn , cur )
88
+ utils . cleanup_conn (admin_conn , admin_cur )
89
+ utils . pg_cat_send_signal (signal .SIGTERM )
144
90
145
91
# - - - - - - - - - - - - - - - - - -
146
92
# HANDLE TRANSACTION WITH SIGINT
147
93
148
94
# Start pgcat
149
- pgcat_start ()
95
+ utils . pgcat_start ()
150
96
151
97
# Create client connection and begin transaction
152
- conn , cur = connect_db ()
98
+ conn , cur = utils . connect_db ()
153
99
154
100
cur .execute ("BEGIN;" )
155
101
cur .execute ("SELECT 1;" )
156
102
157
103
# Send sigint to pgcat while still in transaction
158
- pg_cat_send_signal (signal .SIGINT )
104
+ utils . pg_cat_send_signal (signal .SIGINT )
159
105
time .sleep (1 )
160
106
161
107
# Check that any new queries succeed after sigint since server should still allow transaction to complete
@@ -165,18 +111,18 @@ def test_shutdown_logic():
165
111
# Fail if query fails since server closed
166
112
raise Exception ("Server closed while in transaction" , e .pgerror )
167
113
168
- cleanup_conn (conn , cur )
169
- pg_cat_send_signal (signal .SIGTERM )
114
+ utils . cleanup_conn (conn , cur )
115
+ utils . pg_cat_send_signal (signal .SIGTERM )
170
116
171
117
# - - - - - - - - - - - - - - - - - -
172
118
# HANDLE TRANSACTION WITH ADMIN SHUTDOWN COMMAND
173
119
174
120
# Start pgcat
175
- pgcat_start ()
121
+ utils . pgcat_start ()
176
122
177
123
# Create client connection and begin transaction
178
- conn , cur = connect_db ()
179
- admin_conn , admin_cur = connect_db (admin = True )
124
+ conn , cur = utils . connect_db ()
125
+ admin_conn , admin_cur = utils . connect_db (admin = True )
180
126
181
127
cur .execute ("BEGIN;" )
182
128
cur .execute ("SELECT 1;" )
@@ -194,30 +140,30 @@ def test_shutdown_logic():
194
140
# Fail if query fails since server closed
195
141
raise Exception ("Server closed while in transaction" , e .pgerror )
196
142
197
- cleanup_conn (conn , cur )
198
- cleanup_conn (admin_conn , admin_cur )
199
- pg_cat_send_signal (signal .SIGTERM )
143
+ utils . cleanup_conn (conn , cur )
144
+ utils . cleanup_conn (admin_conn , admin_cur )
145
+ utils . pg_cat_send_signal (signal .SIGTERM )
200
146
201
147
# - - - - - - - - - - - - - - - - - -
202
148
# NO NEW NON-ADMIN CONNECTIONS DURING SHUTDOWN
203
149
# Start pgcat
204
- pgcat_start ()
150
+ utils . pgcat_start ()
205
151
206
152
# Create client connection and begin transaction
207
- transaction_conn , transaction_cur = connect_db ()
153
+ transaction_conn , transaction_cur = utils . connect_db ()
208
154
209
155
transaction_cur .execute ("BEGIN;" )
210
156
transaction_cur .execute ("SELECT 1;" )
211
157
212
158
# Send sigint to pgcat while still in transaction
213
- pg_cat_send_signal (signal .SIGINT )
159
+ utils . pg_cat_send_signal (signal .SIGINT )
214
160
time .sleep (1 )
215
161
216
162
start = time .perf_counter ()
217
163
try :
218
- conn , cur = connect_db ()
164
+ conn , cur = utils . connect_db ()
219
165
cur .execute ("SELECT 1;" )
220
- cleanup_conn (conn , cur )
166
+ utils . cleanup_conn (conn , cur )
221
167
except psycopg2 .OperationalError as e :
222
168
time_taken = time .perf_counter () - start
223
169
if time_taken > 0.1 :
@@ -227,74 +173,74 @@ def test_shutdown_logic():
227
173
else :
228
174
raise Exception ("Able connect to database during shutdown" )
229
175
230
- cleanup_conn (transaction_conn , transaction_cur )
231
- pg_cat_send_signal (signal .SIGTERM )
176
+ utils . cleanup_conn (transaction_conn , transaction_cur )
177
+ utils . pg_cat_send_signal (signal .SIGTERM )
232
178
233
179
# - - - - - - - - - - - - - - - - - -
234
180
# ALLOW NEW ADMIN CONNECTIONS DURING SHUTDOWN
235
181
# Start pgcat
236
- pgcat_start ()
182
+ utils . pgcat_start ()
237
183
238
184
# Create client connection and begin transaction
239
- transaction_conn , transaction_cur = connect_db ()
185
+ transaction_conn , transaction_cur = utils . connect_db ()
240
186
241
187
transaction_cur .execute ("BEGIN;" )
242
188
transaction_cur .execute ("SELECT 1;" )
243
189
244
190
# Send sigint to pgcat while still in transaction
245
- pg_cat_send_signal (signal .SIGINT )
191
+ utils . pg_cat_send_signal (signal .SIGINT )
246
192
time .sleep (1 )
247
193
248
194
try :
249
- conn , cur = connect_db (admin = True )
195
+ conn , cur = utils . connect_db (admin = True )
250
196
cur .execute ("SHOW DATABASES;" )
251
- cleanup_conn (conn , cur )
197
+ utils . cleanup_conn (conn , cur )
252
198
except psycopg2 .OperationalError as e :
253
199
raise Exception (e )
254
200
255
- cleanup_conn (transaction_conn , transaction_cur )
256
- pg_cat_send_signal (signal .SIGTERM )
201
+ utils . cleanup_conn (transaction_conn , transaction_cur )
202
+ utils . pg_cat_send_signal (signal .SIGTERM )
257
203
258
204
# - - - - - - - - - - - - - - - - - -
259
205
# ADMIN CONNECTIONS CONTINUING TO WORK AFTER SHUTDOWN
260
206
# Start pgcat
261
- pgcat_start ()
207
+ utils . pgcat_start ()
262
208
263
209
# Create client connection and begin transaction
264
- transaction_conn , transaction_cur = connect_db ()
210
+ transaction_conn , transaction_cur = utils . connect_db ()
265
211
transaction_cur .execute ("BEGIN;" )
266
212
transaction_cur .execute ("SELECT 1;" )
267
213
268
- admin_conn , admin_cur = connect_db (admin = True )
214
+ admin_conn , admin_cur = utils . connect_db (admin = True )
269
215
admin_cur .execute ("SHOW DATABASES;" )
270
216
271
217
# Send sigint to pgcat while still in transaction
272
- pg_cat_send_signal (signal .SIGINT )
218
+ utils . pg_cat_send_signal (signal .SIGINT )
273
219
time .sleep (1 )
274
220
275
221
try :
276
222
admin_cur .execute ("SHOW DATABASES;" )
277
223
except psycopg2 .OperationalError as e :
278
224
raise Exception ("Could not execute admin command:" , e )
279
225
280
- cleanup_conn (transaction_conn , transaction_cur )
281
- cleanup_conn (admin_conn , admin_cur )
282
- pg_cat_send_signal (signal .SIGTERM )
226
+ utils . cleanup_conn (transaction_conn , transaction_cur )
227
+ utils . cleanup_conn (admin_conn , admin_cur )
228
+ utils . pg_cat_send_signal (signal .SIGTERM )
283
229
284
230
# - - - - - - - - - - - - - - - - - -
285
231
# HANDLE SHUTDOWN TIMEOUT WITH SIGINT
286
232
287
233
# Start pgcat
288
- pgcat_start ()
234
+ utils . pgcat_start ()
289
235
290
236
# Create client connection and begin transaction, which should prevent server shutdown unless shutdown timeout is reached
291
- conn , cur = connect_db ()
237
+ conn , cur = utils . connect_db ()
292
238
293
239
cur .execute ("BEGIN;" )
294
240
cur .execute ("SELECT 1;" )
295
241
296
242
# Send sigint to pgcat while still in transaction
297
- pg_cat_send_signal (signal .SIGINT )
243
+ utils . pg_cat_send_signal (signal .SIGINT )
298
244
299
245
# pgcat shutdown timeout is set to SHUTDOWN_TIMEOUT seconds, so we sleep for SHUTDOWN_TIMEOUT + 1 seconds
300
246
time .sleep (SHUTDOWN_TIMEOUT + 1 )
@@ -308,12 +254,5 @@ def test_shutdown_logic():
308
254
# Fail if query execution succeeded
309
255
raise Exception ("Server not closed after sigint and expected timeout" )
310
256
311
- cleanup_conn (conn , cur )
312
- pg_cat_send_signal (signal .SIGTERM )
313
-
314
- # - - - - - - - - - - - - - - - - - -
315
-
316
-
317
- test_normal_db_access ()
318
- test_admin_db_access ()
319
- test_shutdown_logic ()
257
+ utils .cleanup_conn (conn , cur )
258
+ utils .pg_cat_send_signal (signal .SIGTERM )
0 commit comments