@@ -115,16 +115,44 @@ in {
115
115
initialScript = pkgs . writeText "init-sql-script" ''
116
116
create extension pg_net;
117
117
118
- alter system set pg_net.batch_size to 32000;
119
-
120
- select net.worker_restart();
121
-
122
118
create view pg_net_stats as
123
119
select
124
120
count(*) filter (where error_msg is null) as request_successes,
125
121
count(*) filter (where error_msg is not null) as request_failures,
126
122
(select error_msg from net._http_response where error_msg is not null order by id desc limit 1) as last_failure_error
127
123
from net._http_response;
124
+
125
+ create or replace procedure repro_timeouts(number_of_requests int default 10000, url text default 'http://server/post') as '' $'' $
126
+ declare
127
+ last_id bigint;
128
+ first_time timestamptz;
129
+ second_time timestamptz;
130
+ time_taken interval;
131
+ begin
132
+ delete from net._http_response;
133
+
134
+ with do_requests as (
135
+ select
136
+ net.http_post(url, jsonb_build_object('id', x, 'message', 'payload ' || x), headers:=jsonb_build_object('Content-Type', 'application/json')) as id
137
+ from generate_series (1, number_of_requests) x
138
+ )
139
+ select id, clock_timestamp() into last_id, first_time from do_requests offset number_of_requests - 1;
140
+
141
+ commit;
142
+
143
+ raise notice 'Waiting until % requests complete', number_of_requests;
144
+
145
+ perform net._await_response(last_id);
146
+
147
+ select clock_timestamp() into second_time;
148
+
149
+ select age(second_time, first_time) into time_taken;
150
+
151
+ raise notice 'Stats: %', (select to_json(x) from pg_net_stats x limit 1);
152
+
153
+ raise notice 'Time taken: %', time_taken;
154
+ end;
155
+ '' $'' $ language plpgsql;
128
156
'' ;
129
157
} ;
130
158
@@ -136,22 +164,40 @@ in {
136
164
pkgs . vegeta
137
165
(
138
166
pkgs . writeShellScriptBin "vegeta-bench" ''
167
+ set -euo pipefail
168
+
139
169
# rate=0 means maximum rate subject to max-workers
140
170
echo "GET http://server/pathological?status=200" | vegeta attack -rate=0 -duration=1s -max-workers=1 | tee results.bin | vegeta report
141
171
''
142
172
)
143
173
(
144
174
pkgs . writeShellScriptBin "vegeta-bench-max-requests" ''
175
+ set -euo pipefail
176
+
145
177
# rate=0 means maximum rate subject to max-workers
146
178
echo "GET http://server/pathological?status=200" | vegeta attack -rate=0 -duration=10s -max-workers=50 | tee results.bin | vegeta report
147
179
''
148
180
)
149
181
(
150
- pkgs . writeShellScriptBin "net-bench" ''
182
+ pkgs . writeShellScriptBin "psql-net-bench" ''
183
+ set -euo pipefail
184
+
185
+ psql -U postgres -c "TRUNCATE net._http_response; TRUNCATE net.http_request_queue;"
186
+ psql -U postgres -c "alter system set pg_net.batch_size to 32000;" # this just a high number
187
+ psql -U postgres -c "select net.worker_restart();"
151
188
psql -U postgres -c "truncate net._http_response;"
152
189
psql -U postgres -c "select net.http_get('http://server/pathological?status=200') from generate_series(1, 400);" > /dev/null
153
190
sleep 2
154
191
psql -U postgres -c "select * from pg_net_stats;"
192
+ psql -U postgres -c "alter system reset pg_net.batch_size;"
193
+ psql -U postgres -c "select net.worker_restart();"
194
+ ''
195
+ )
196
+ (
197
+ pkgs . writeShellScriptBin "psql-reproduce-timeouts" ''
198
+ set -euo pipefail
199
+
200
+ psql -U postgres -c "call repro_timeouts();"
155
201
''
156
202
)
157
203
] ;
0 commit comments