Skip to content

Commit 6179f09

Browse files
cursoragentlovasoa
andcommitted
Add logging to MssqlStream and SSRP instance resolution
Co-authored-by: contact <[email protected]>
1 parent f143ea0 commit 6179f09

File tree

2 files changed

+88
-3
lines changed

2 files changed

+88
-3
lines changed

sqlx-core/src/mssql/connection/ssrp.rs

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,47 @@ const SVR_RESP: u8 = 0x05;
99
const SSRP_TIMEOUT: Duration = Duration::from_secs(1);
1010

1111
pub(crate) async fn resolve_instance_port(server: &str, instance: &str) -> Result<u16, Error> {
12+
log::debug!(
13+
"resolving SQL Server instance port for '{}' on server '{}'",
14+
instance,
15+
server
16+
);
17+
1218
let mut request = Vec::with_capacity(1 + instance.len() + 1);
1319
request.push(CLNT_UCAST_INST);
1420
request.extend_from_slice(instance.as_bytes());
1521
request.push(0);
1622

1723
let socket = UdpSocket::bind("0.0.0.0:0").await.map_err(|e| {
24+
log::debug!("failed to bind UDP socket for SSRP: {}", e);
1825
err_protocol!("failed to bind UDP socket for SSRP: {}", e)
1926
})?;
2027

28+
log::debug!(
29+
"sending SSRP CLNT_UCAST_INST request to {}:{} for instance '{}'",
30+
server,
31+
SSRP_PORT,
32+
instance
33+
);
34+
2135
socket
2236
.send_to(&request, (server, SSRP_PORT))
2337
.await
2438
.map_err(|e| {
39+
log::debug!("failed to send SSRP request to {}:{}: {}", server, SSRP_PORT, e);
2540
err_protocol!("failed to send SSRP request to {}:{}: {}", server, SSRP_PORT, e)
2641
})?;
2742

2843
let mut buffer = [0u8; 1024];
2944
let bytes_read = timeout(SSRP_TIMEOUT, socket.recv(&mut buffer))
3045
.await
3146
.map_err(|_| {
47+
log::debug!(
48+
"SSRP request to {} for instance {} timed out after {:?}",
49+
server,
50+
instance,
51+
SSRP_TIMEOUT
52+
);
3253
err_protocol!(
3354
"SSRP request to {} for instance {} timed out after {:?}",
3455
server,
@@ -37,6 +58,12 @@ pub(crate) async fn resolve_instance_port(server: &str, instance: &str) -> Resul
3758
)
3859
})?
3960
.map_err(|e| {
61+
log::debug!(
62+
"failed to receive SSRP response from {} for instance {}: {}",
63+
server,
64+
instance,
65+
e
66+
);
4067
err_protocol!(
4168
"failed to receive SSRP response from {} for instance {}: {}",
4269
server,
@@ -45,14 +72,25 @@ pub(crate) async fn resolve_instance_port(server: &str, instance: &str) -> Resul
4572
)
4673
})?;
4774

75+
log::debug!(
76+
"received SSRP response from {} ({} bytes)",
77+
server,
78+
bytes_read
79+
);
80+
4881
if bytes_read < 3 {
82+
log::debug!("SSRP response too short: {} bytes", bytes_read);
4983
return Err(err_protocol!(
5084
"SSRP response too short: {} bytes",
5185
bytes_read
5286
));
5387
}
5488

5589
if buffer[0] != SVR_RESP {
90+
log::debug!(
91+
"invalid SSRP response type: expected 0x05, got 0x{:02x}",
92+
buffer[0]
93+
);
5694
return Err(err_protocol!(
5795
"invalid SSRP response type: expected 0x05, got 0x{:02x}",
5896
buffer[0]
@@ -61,6 +99,11 @@ pub(crate) async fn resolve_instance_port(server: &str, instance: &str) -> Resul
6199

62100
let response_size = u16::from_le_bytes([buffer[1], buffer[2]]) as usize;
63101
if response_size + 3 > bytes_read {
102+
log::debug!(
103+
"SSRP response size mismatch: expected {} bytes, got {}",
104+
response_size + 3,
105+
bytes_read
106+
);
64107
return Err(err_protocol!(
65108
"SSRP response size mismatch: expected {} bytes, got {}",
66109
response_size + 3,
@@ -69,13 +112,22 @@ pub(crate) async fn resolve_instance_port(server: &str, instance: &str) -> Resul
69112
}
70113

71114
let response_data = String::from_utf8(buffer[3..(3 + response_size)].to_vec())
72-
.map_err(|e| err_protocol!("SSRP response is not valid UTF-8: {}", e))?;
115+
.map_err(|e| {
116+
log::debug!("SSRP response is not valid UTF-8: {}", e);
117+
err_protocol!("SSRP response is not valid UTF-8: {}", e)
118+
})?;
119+
120+
log::debug!("SSRP response data: {}", response_data);
73121

74122
parse_ssrp_response(&response_data, instance)
75123
}
76124

77125
fn parse_ssrp_response(data: &str, instance_name: &str) -> Result<u16, Error> {
78126
let instances: Vec<&str> = data.split(";;").collect();
127+
log::debug!(
128+
"parsing SSRP response, found {} instance entries",
129+
instances.len()
130+
);
79131

80132
for instance_data in instances {
81133
if instance_data.is_empty() {
@@ -94,16 +146,42 @@ fn parse_ssrp_response(data: &str, instance_name: &str) -> Result<u16, Error> {
94146
}
95147

96148
if let Some(name) = properties.get("InstanceName") {
149+
log::debug!("found instance '{}' in SSRP response", name);
150+
97151
if name.eq_ignore_ascii_case(instance_name) {
152+
log::debug!(
153+
"instance '{}' matches requested instance '{}'",
154+
name,
155+
instance_name
156+
);
157+
98158
if let Some(tcp_port_str) = properties.get("tcp") {
99-
return tcp_port_str.parse::<u16>().map_err(|e| {
159+
let port = tcp_port_str.parse::<u16>().map_err(|e| {
160+
log::debug!(
161+
"invalid TCP port '{}' in SSRP response: {}",
162+
tcp_port_str,
163+
e
164+
);
100165
err_protocol!(
101166
"invalid TCP port '{}' in SSRP response: {}",
102167
tcp_port_str,
103168
e
104169
)
105-
});
170+
})?;
171+
172+
log::debug!(
173+
"resolved instance '{}' to port {}",
174+
instance_name,
175+
port
176+
);
177+
178+
return Ok(port);
106179
} else {
180+
log::debug!(
181+
"instance '{}' found but no TCP port available in properties: {:?}",
182+
instance_name,
183+
properties.keys().collect::<Vec<_>>()
184+
);
107185
return Err(err_protocol!(
108186
"instance '{}' found but no TCP port available",
109187
instance_name
@@ -113,6 +191,10 @@ fn parse_ssrp_response(data: &str, instance_name: &str) -> Result<u16, Error> {
113191
}
114192
}
115193

194+
log::debug!(
195+
"instance '{}' not found in SSRP response",
196+
instance_name
197+
);
116198
Err(err_protocol!(
117199
"instance '{}' not found in SSRP response",
118200
instance_name

sqlx-core/src/mssql/connection/stream.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ impl MssqlStream {
5757
options.port
5858
};
5959

60+
log::debug!("establishing TCP connection to {}:{}", options.host, port);
6061
let tcp_stream = TcpStream::connect((&*options.host, port)).await?;
62+
log::debug!("TCP connection established to {}:{}", options.host, port);
63+
6164
let wrapped_stream = TlsPreloginWrapper::new(tcp_stream);
6265
let inner = BufStream::new(MaybeTlsStream::Raw(wrapped_stream));
6366

0 commit comments

Comments
 (0)