Skip to content

Commit c62c673

Browse files
committed
fixed a bug in the connection pool: we should copy over the "name" and "sockaddr" fields instead of passing pointers around.
1 parent 5dd0c57 commit c62c673

File tree

4 files changed

+32
-19
lines changed

4 files changed

+32
-19
lines changed

src/ngx_postgres_keepalive.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,19 @@ ngx_postgres_keepalive_get_peer_single(ngx_peer_connection_t *pc,
8585
c->read->log = pc->log;
8686
c->write->log = pc->log;
8787

88-
pgp->name = &item->name;
88+
pgp->name.data = item->name.data;
89+
pgp->name.len = item->name.len;
90+
91+
pgp->sockaddr = item->sockaddr;
92+
8993
pgp->pgconn = item->pgconn;
9094

9195
pc->connection = c;
9296
pc->cached = 1;
93-
pc->name = pgp->name;
94-
pc->sockaddr = &item->sockaddr;
97+
98+
pc->name = &pgp->name;
99+
100+
pc->sockaddr = &pgp->sockaddr;
95101
pc->socklen = item->socklen;
96102

97103
dd("returning NGX_DONE");
@@ -137,7 +143,9 @@ ngx_postgres_keepalive_get_peer_multi(ngx_peer_connection_t *pc,
137143
pc->connection = c;
138144
pc->cached = 1;
139145

140-
pgp->name = &item->name;
146+
/* we do not need to resume the peer name
147+
* because we already take the right value outside */
148+
141149
pgp->pgconn = item->pgconn;
142150

143151
dd("returning NGX_DONE");
@@ -221,13 +229,13 @@ ngx_postgres_keepalive_free_peer(ngx_peer_connection_t *pc,
221229
c->read->log = ngx_cycle->log;
222230
c->write->log = ngx_cycle->log;
223231

224-
if (pc->sockaddr != &item->sockaddr) {
225-
item->socklen = pc->socklen;
226-
ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
227-
}
232+
item->socklen = pc->socklen;
233+
ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
228234

229235
item->pgconn = pgp->pgconn;
230-
item->name = *pgp->name;
236+
237+
item->name.data = pgp->name.data;
238+
item->name.len = pgp->name.len;
231239
}
232240

233241
dd("returning");

src/ngx_postgres_processor.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ ngx_postgres_upstream_connect(ngx_http_request_t *r, ngx_connection_t *pgxc,
185185
dd("connection failed");
186186
ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,
187187
"postgres: connection failed: %s in upstream \"%V\"",
188-
PQerrorMessage(pgdt->pgconn), pgdt->name);
188+
PQerrorMessage(pgdt->pgconn), &pgdt->name);
189189

190190
dd("returning NGX_ERROR");
191191
return NGX_ERROR;
@@ -233,7 +233,7 @@ ngx_postgres_upstream_send_query(ngx_http_request_t *r, ngx_connection_t *pgxc,
233233
dd("sending query failed");
234234
ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,
235235
"postgres: sending query failed: %s in upstream \"%V\"",
236-
PQerrorMessage(pgdt->pgconn), pgdt->name);
236+
PQerrorMessage(pgdt->pgconn), &pgdt->name);
237237

238238
dd("returning NGX_ERROR");
239239
return NGX_ERROR;
@@ -283,7 +283,7 @@ ngx_postgres_upstream_get_result(ngx_http_request_t *r, ngx_connection_t *pgxc,
283283
dd("receiving result failed");
284284
ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,
285285
"postgres: receiving result failed: %s in upstream"
286-
" \"%V\"", PQerrorMessage(pgdt->pgconn), pgdt->name);
286+
" \"%V\"", PQerrorMessage(pgdt->pgconn), &pgdt->name);
287287

288288
dd("returning NGX_ERROR");
289289
return NGX_ERROR;
@@ -295,7 +295,7 @@ ngx_postgres_upstream_get_result(ngx_http_request_t *r, ngx_connection_t *pgxc,
295295
ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,
296296
"postgres: receiving result failed: %s: %s in upstream"
297297
" \"%V\"", PQresStatus(pgrc),
298-
PQerrorMessage(pgdt->pgconn), pgdt->name);
298+
PQerrorMessage(pgdt->pgconn), &pgdt->name);
299299

300300
PQclear(res);
301301

@@ -429,7 +429,7 @@ ngx_postgres_upstream_get_ack(ngx_http_request_t *r, ngx_connection_t *pgxc,
429429
dd("receiving ACK failed");
430430
ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,
431431
"postgres: receiving ACK failed: multiple queries(?),"
432-
" in upstream \"%V\"", pgdt->name);
432+
" in upstream \"%V\"", &pgdt->name);
433433

434434
PQclear(res);
435435

src/ngx_postgres_upstream.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,13 @@ ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)
280280

281281
peer = &peers->peer[pgscf->current++];
282282

283-
pgdt->name = &peer->name;
283+
pgdt->name.len = peer->name.len;
284+
pgdt->name.data = peer->name.data;
284285

285-
pc->name = &peer->name;
286-
pc->sockaddr = peer->sockaddr;
286+
pgdt->sockaddr = *peer->sockaddr;
287+
288+
pc->name = &pgdt->name;
289+
pc->sockaddr = &pgdt->sockaddr;
287290
pc->socklen = peer->socklen;
288291
pc->cached = 0;
289292

src/ngx_postgres_upstream.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ typedef struct {
5252
PGconn *pgconn;
5353
ngx_postgres_state_t state;
5454
ngx_str_t query;
55-
ngx_str_t *name;
56-
ngx_flag_t failed;
55+
ngx_str_t name;
56+
struct sockaddr sockaddr;
57+
unsigned failed;
5758
} ngx_postgres_upstream_peer_data_t;
5859

5960

@@ -69,4 +70,5 @@ void ngx_postgres_upstream_free_connection(ngx_log_t *,
6970
ngx_connection_t *, PGconn *,
7071
ngx_postgres_upstream_srv_conf_t *);
7172

73+
7274
#endif /* _NGX_HTTP_UPSTREAM_POSTGRES_H_ */

0 commit comments

Comments
 (0)