@@ -9,26 +9,47 @@ const SVR_RESP: u8 = 0x05;
99const SSRP_TIMEOUT : Duration = Duration :: from_secs ( 1 ) ;
1010
1111pub ( 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
77125fn 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
0 commit comments