Skip to content

Commit 24537a7

Browse files
committed
Retain QUIT_SEND connection state
If the server goes away while reading a packet, don't go back into the READY state. This will just cause broken pipe errors down the line.
1 parent a66d73d commit 24537a7

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

ext/mysqlnd/mysqlnd_ps.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,9 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi
888888
COPY_CLIENT_ERROR(stmt->error_info, row_packet->error_info);
889889
}
890890
}
891-
SET_CONNECTION_STATE(&conn->state, CONN_READY);
891+
if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
892+
SET_CONNECTION_STATE(&conn->state, CONN_READY);
893+
}
892894
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
893895
} else if (row_packet->eof) {
894896
DBG_INF("EOF");

ext/mysqlnd/mysqlnd_result.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,9 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row_c)(MYSQLND_RES * result, voi
743743
COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info);
744744
DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
745745
}
746-
SET_CONNECTION_STATE(&conn->state, CONN_READY);
746+
if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
747+
SET_CONNECTION_STATE(&conn->state, CONN_READY);
748+
}
747749
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
748750
} else if (row_packet->eof) {
749751
/* Mark the connection as usable again */
@@ -881,7 +883,9 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void
881883
COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info);
882884
DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
883885
}
884-
SET_CONNECTION_STATE(&conn->state, CONN_READY);
886+
if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
887+
SET_CONNECTION_STATE(&conn->state, CONN_READY);
888+
}
885889
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
886890
} else if (row_packet->eof) {
887891
/* Mark the connection as usable again */

ext/mysqlnd/mysqlnd_wireprotocol.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
13701370
MYSQLND_VIO * vio,
13711371
MYSQLND_STATS * stats,
13721372
MYSQLND_ERROR_INFO * error_info,
1373+
MYSQLND_CONNECTION_STATE * connection_state,
13731374
MYSQLND_MEMORY_POOL * pool,
13741375
MYSQLND_ROW_BUFFER * buffer,
13751376
size_t * const data_size)
@@ -1405,6 +1406,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
14051406

14061407
if (UNEXPECTED(PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info)))) {
14071408
DBG_ERR("Empty row packet body");
1409+
SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
14081410
set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
14091411
} else {
14101412
while (header.size >= MYSQLND_MAX_PACKET_SIZE) {
@@ -1434,6 +1436,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
14341436

14351437
if (PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info))) {
14361438
DBG_ERR("Empty row packet body");
1439+
SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
14371440
set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
14381441
break;
14391442
}
@@ -1740,7 +1743,7 @@ php_mysqlnd_rowp_read(MYSQLND_CONN_DATA * conn, void * _packet)
17401743

17411744
DBG_ENTER("php_mysqlnd_rowp_read");
17421745

1743-
ret = php_mysqlnd_read_row_ex(pfc, vio, stats, error_info,
1746+
ret = php_mysqlnd_read_row_ex(pfc, vio, stats, error_info, &conn->state,
17441747
packet->result_set_memory_pool, &packet->row_buffer, &data_size);
17451748
if (FAIL == ret) {
17461749
goto end;

0 commit comments

Comments
 (0)