Skip to content

Commit 977fb37

Browse files
authored
fix(query): defer MySQL session creation until the handshake completes (#18956)
* fix(query): build mysql tls config * z * z * z * z * z
1 parent b4f0fd3 commit 977fb37

File tree

8 files changed

+227
-182
lines changed

8 files changed

+227
-182
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ openraft = { version = "0.10.0", features = [
410410
"serde",
411411
"tracing-log",
412412
] }
413-
opensrv-mysql = { git = "https://github.com/databendlabs/opensrv.git", tag = "v0.9.0", features = ["tls"] }
413+
opensrv-mysql = { git = "https://github.com/databendlabs/opensrv.git", tag = "v0.10.0", features = ["tls"] }
414414
orc-rust = "0.6.0"
415415
ordered-float = { version = "5.0.0", default-features = false }
416416
ordq = "0.2.0"

src/query/service/src/servers/mysql/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ mod mysql_federated;
1616
mod mysql_handler;
1717
mod mysql_interactive_worker;
1818
mod mysql_session;
19-
#[allow(clippy::unused_io_amount)]
20-
mod reject_connection;
2119
mod tls;
2220
mod writers;
2321

src/query/service/src/servers/mysql/mysql_handler.rs

Lines changed: 4 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,18 @@ use databend_common_base::base::tokio::net::TcpStream;
2121
use databend_common_base::base::tokio::task::JoinHandle;
2222
use databend_common_base::runtime::Runtime;
2323
use databend_common_base::runtime::TrySpawn;
24-
use databend_common_catalog::session_type::SessionType;
2524
use databend_common_exception::ErrorCode;
2625
use databend_common_exception::Result;
2726
use futures::future::AbortHandle;
2827
use futures::future::AbortRegistration;
2928
use futures::future::Abortable;
3029
use futures::StreamExt;
3130
use log::error;
32-
use log::info;
33-
use log::warn;
34-
use opensrv_mysql::*;
3531
use rustls::ServerConfig;
36-
use socket2::SockRef;
3732
use socket2::TcpKeepalive;
3833
use tokio_stream::wrappers::TcpListenerStream;
3934

4035
use crate::servers::mysql::mysql_session::MySQLConnection;
41-
use crate::servers::mysql::reject_connection::RejectConnection;
4236
use crate::servers::mysql::tls::MySQLTlsConfig;
4337
use crate::servers::server::ListeningStream;
4438
use crate::servers::server::Server;
@@ -110,50 +104,13 @@ impl MySQLHandler {
110104
tls: Option<Arc<ServerConfig>>,
111105
) {
112106
executor.spawn(async move {
113-
match session_manager.create_session(SessionType::MySQL).await {
114-
Err(error) => {
115-
warn!("create session failed, {:?}", error);
116-
Self::reject_session(socket, error).await
117-
}
118-
Ok(session) => {
119-
info!("MySQL connection coming: {:?}", socket.peer_addr());
120-
121-
match session_manager.register_session(session) {
122-
Ok(session) => {
123-
// TcpStream must implement AsFd for socket2 0.5, wait https://github.com/tokio-rs/tokio/pull/5514
124-
if let Err(e) = SockRef::from(&socket).set_tcp_keepalive(&keepalive) {
125-
warn!("failed to set socket option keepalive {}", e);
126-
}
127-
128-
if let Err(error) = MySQLConnection::run_on_stream(session, socket, tls)
129-
{
130-
error!("Unexpected error occurred during query: {:?}", error);
131-
};
132-
}
133-
Err(error) => {
134-
warn!("fail to register session, {:?}", error);
135-
Self::reject_session(socket, error).await
136-
}
137-
}
138-
}
107+
if let Err(error) =
108+
MySQLConnection::run_on_stream(session_manager, socket, keepalive, tls).await
109+
{
110+
error!("Unexpected error occurred during query: {:?}", error);
139111
}
140112
});
141113
}
142-
143-
#[async_backtrace::framed]
144-
async fn reject_session(stream: TcpStream, error: ErrorCode) {
145-
let (kind, message) = match error.code() {
146-
41 => (ErrorKind::ER_TOO_MANY_USER_CONNECTIONS, error.message()),
147-
_ => (ErrorKind::ER_INTERNAL_ERROR, error.message()),
148-
};
149-
150-
if let Err(error) = RejectConnection::reject_mysql_connection(stream, kind, message).await {
151-
error!(
152-
"Unexpected error occurred during reject connection: {:?}",
153-
error
154-
);
155-
}
156-
}
157114
}
158115

159116
#[async_trait::async_trait]

src/query/service/src/servers/mysql/mysql_interactive_worker.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ use opensrv_mysql::QueryResultWriter;
4848
use opensrv_mysql::StatementMetaWriter;
4949
use rand::thread_rng;
5050
use rand::Rng as _;
51-
use rand::RngCore;
5251
use uuid::Uuid;
5352

5453
use crate::auth::CredentialType;
@@ -519,23 +518,12 @@ impl InteractiveWorker {
519518
session: Arc<Session>,
520519
version: BuildInfoRef,
521520
client_addr: String,
521+
salt: [u8; 20],
522522
) -> InteractiveWorker {
523-
let mut bs = vec![0u8; 20];
524-
let mut rng = rand::thread_rng();
525-
rng.fill_bytes(bs.as_mut());
526-
527-
let mut scramble: [u8; 20] = [0; 20];
528-
for i in 0..20 {
529-
scramble[i] = bs[i] & 0x7fu8;
530-
if scramble[i] == b'\0' || scramble[i] == b'$' {
531-
scramble[i] += 1;
532-
}
533-
}
534-
535523
InteractiveWorker {
536524
version: format!("{MYSQL_VERSION}-{}", version.commit_detail),
537525
base: InteractiveWorkerBase { session, version },
538-
salt: scramble,
526+
salt,
539527
client_addr,
540528
keep_alive_task_started: false,
541529
}

0 commit comments

Comments
 (0)