in squangle/mysql_client/Operation.cpp [1499:1540]
void FetchOperation::killRunningQuery() {
/*
* Send kill command to terminate the current operation on the DB
* Note that we use KILL <processlist_id> to kill the entire connection
* In the event the DB is behind a proxy this will kill the persistent
* connection the proxy is using, so ConnectionOptions::killQueryOnTimeout_
* should always be false when accessing the DB through a proxy
*
* Note that there is a risk of a race condition in the event that a proxy
* is used and a query from this client times out, then the query completes
* almost immediately after the timeout and a proxy gives the persistent
* connection to another client which begins a query on that connection
* before this client is able to send the KILL query on a separate
* proxy->db connection which then terminates the OTHER client's query
*/
auto thread_id = conn()->mysqlThreadId();
auto host = conn()->host();
auto port = conn()->port();
auto conn_op = client()
->beginConnection(*conn()->getKey())
->setConnectionOptions(conn()->getConnectionOptions());
conn_op->setCallback([thread_id, host, port](ConnectOperation& conn_op) {
if (conn_op.ok()) {
auto op = Connection::beginQuery(
conn_op.releaseConnection(), "KILL %d", thread_id);
op->setCallback([thread_id, host, port](
QueryOperation& /* unused */,
QueryResult* /* unused */,
QueryCallbackReason reason) {
if (reason == QueryCallbackReason::Failure) {
LOG(WARNING) << folly::format(
"Failed to kill query in thread {} on {}:{}",
thread_id,
host,
port);
}
});
op->run();
}
});
conn_op->run();
}