Add TNIR conn option and tests

This commit is contained in:
v-kaywon 2017-06-07 13:53:04 -07:00
parent 45d87b7a96
commit 208cc4a078
5 changed files with 142 additions and 0 deletions

View file

@ -57,6 +57,7 @@ const char TraceFile[] = "TraceFile";
const char TraceOn[] = "TraceOn";
const char TrustServerCertificate[] = "TrustServerCertificate";
const char TransactionIsolation[] = "TransactionIsolation";
const char TransparentNetworkIPResolution[] = "TransparentNetworkIPResolution";
const char WSID[] = "WSID";
}
@ -338,6 +339,15 @@ const connection_option PDO_CONN_OPTS[] = {
CONN_ATTR_BOOL,
pdo_bool_conn_str_func::func
},
{
PDOConnOptionNames::TransparentNetworkIPResolution,
sizeof(PDOConnOptionNames::TransparentNetworkIPResolution),
SQLSRV_CONN_OPTION_TRANSPARANT_NETWORK_IP_RESOLUTION,
ODBCConnOptions::TransparentNetworkIPResolution,
sizeof(ODBCConnOptions::TransparentNetworkIPResolution),
CONN_ATTR_STRING,
conn_str_append_func::func
},
{
PDOConnOptionNames::WSID,
sizeof( PDOConnOptionNames::WSID ),

View file

@ -1100,6 +1100,7 @@ const char TraceFile[] = "TraceFile";
const char TraceOn[] = "TraceOn";
const char TrustServerCertificate[] = "TrustServerCertificate";
const char TransactionIsolation[] = "TransactionIsolation";
const char TransparentNetworkIPResolution[] = "TransparentNetworkIPResolution";
const char WSID[] = "WSID";
const char UID[] = "UID";
const char PWD[] = "PWD";
@ -1128,6 +1129,7 @@ enum SQLSRV_CONN_OPTIONS {
SQLSRV_CONN_OPTION_APPLICATION_INTENT,
SQLSRV_CONN_OPTION_MULTI_SUBNET_FAILOVER,
SQLSRV_CONN_OPTION_AUTHENTICATION,
SQLSRV_CONN_OPTION_TRANSPARANT_NETWORK_IP_RESOLUTION,
#ifdef _WIN32
SQLSRV_CONN_OPTION_CONN_RETRY_COUNT,
SQLSRV_CONN_OPTION_CONN_RETRY_INTERVAL,

View file

@ -205,6 +205,7 @@ const char TraceFile[] = "TraceFile";
const char TraceOn[] = "TraceOn";
const char TrustServerCertificate[] = "TrustServerCertificate";
const char TransactionIsolation[] = "TransactionIsolation";
const char TransparentNetworkIPResolution[] = "TransparentNetworkIPResolution";
const char UID[] = "UID";
const char WSID[] = "WSID";
@ -420,6 +421,15 @@ const connection_option SS_CONN_OPTS[] = {
CONN_ATTR_BOOL,
bool_conn_str_func::func
},
{
SSConnOptionNames::TransparentNetworkIPResolution,
sizeof(SSConnOptionNames::TransparentNetworkIPResolution),
SQLSRV_CONN_OPTION_TRANSPARANT_NETWORK_IP_RESOLUTION,
ODBCConnOptions::TransparentNetworkIPResolution,
sizeof(ODBCConnOptions::TransparentNetworkIPResolution),
CONN_ATTR_STRING,
conn_str_append_func::func
},
{
SSConnOptionNames::WSID,
sizeof( SSConnOptionNames::WSID ),

View file

@ -0,0 +1,60 @@
--TEST--
Test the TNIR keyword with enabled and disabled options and the MultiSubnetFailover keyword with true and false options
--SKIPIF--
--FILE--
<?php
// The way SYN packets are sent from the host is different depending on the combination of the TNIR and MultiSubnetFailover values
// TNIR Enabled, MSF Disabled: One IP is attempted, followed by all IPs in parallel
// TNIR Enabled, MSF Enabled: All IPs are attempted in parallel
// TNIR Disabled, MSF Disabled: All IPs are attempted one after another
// TNIR Disabled, MSF Enabled: All IPs are attempted in parallel
// TNIR is enabled by default
// MultiSubnetFailover is disabled by default
require_once("MsSetup.inc");
$GLOBALS['uid'] = $uid;
$GLOBALS['pwd'] = $pwd;
$GLOBALS['server'] = $server;
function test_tnir( $TNIRValue, $MSFValue ) {
$MSFValueStr = ($MSFValue) ? 'true' : 'false';
$connectionString = "sqlsrv:Server=$GLOBALS[server]; TransparentNetworkIPResolution=$TNIRValue; MultiSubnetFailover=$MSFValueStr";
try {
$start = microtime(true);
$conn = new PDO($connectionString, $GLOBALS['uid'], $GLOBALS['pwd'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
echo "Connection successful with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n";
$connect_time = round(microtime(true) - $start, 2);
echo "Time to connect is $connect_time sec.\n\n";
$conn = NULL;
}
catch(PDOException $e) {
echo "Connection failed with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n";
print_r($e->errorInfo);
}
}
test_tnir("Enabled", false); // case temd (TNIR enabled; MultiSubnetFailover disabled)
test_tnir("Enabled", true); // case teme
test_tnir("Disabled", false); // case tdmd
test_tnir("Disabled", true); // case tdme
// Interpreting output
// If the first resolved IP address can be connected, then the time to connect for all these cases is similar
// else if the second resolved IP address can be connected, then temd ~= tdmd > teme ~= tdme
// else tdmd > temd > teme ~= tdme
// note: the first test takes a bit longer since time is needed for the DNS to resolve the IP addresses of the server host name
?>
--EXPECTREGEX--
Connection successful with TNIR Enabled and MultiSubnetFailover false\.
Time to connect is [0-9]+\.[0-9]+ sec\.
Connection successful with TNIR Enabled and MultiSubnetFailover true\.
Time to connect is [0-9]+\.[0-9]+ sec\.
Connection successful with TNIR Disabled and MultiSubnetFailover false\.
Time to connect is [0-9]+\.[0-9]+ sec\.
Connection successful with TNIR Disabled and MultiSubnetFailover true\.
Time to connect is [0-9]+\.[0-9]+ sec\.

View file

@ -0,0 +1,60 @@
--TEST--
Test the TNIR keyword with enabled and disabled options and the MultiSubnetFailover keyword with true and false options
--SKIPIF--
--FILE--
<?php
// The way SYN packets are sent from the host is different depending on the combination of the TNIR and MultiSubnetFailover values
// TNIR Enabled, MSF Disabled: One IP is attempted, followed by all IPs in parallel
// TNIR Enabled, MSF Enabled: All IPs are attempted in parallel
// TNIR Disabled, MSF Disabled: All IPs are attempted one after another
// TNIR Disabled, MSF Enabled: All IPs are attempted in parallel
// TNIR is enabled by default
// MultiSubnetFailover is disabled by default
require_once("MsSetup.inc");
$GLOBALS['uid'] = $uid;
$GLOBALS['pwd'] = $pwd;
$GLOBALS['server'] = $server;
function test_tnir( $TNIRValue, $MSFValue ) {
$connectionInfo = ["UID" => $GLOBALS['uid'], "PWD" => $GLOBALS['pwd'], "TransparentNetworkIPResolution" => $TNIRValue, "MultiSubnetFailover" => $MSFValue];
$MSFValueStr = ($MSFValue) ? 'true' : 'false';
$start = microtime(true);
$conn = sqlsrv_connect($GLOBALS['server'], $connectionInfo);
if ($conn === false) {
echo "Connection failed with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n";
print_r(sqlsrv_errors());
}
else {
echo "Connection successful with TNIR $TNIRValue and MultiSubnetFailover $MSFValueStr.\n";
$connect_time = round(microtime(true) - $start, 2);
echo "Time to connect is $connect_time sec.\n\n";
}
sqlsrv_close($conn);
}
test_tnir("Enabled", false); // case temd (TNIR enabled; MultiSubnetFailover disabled)
test_tnir("Enabled", true); // case teme
test_tnir("Disabled", false); // case tdmd
test_tnir("Disabled", true); // case tdme
// Interpreting output
// If the first resolved IP address can be connected, then the time to connect for all these cases is similar
// else if the second resolved IP address can be connected, then temd ~= tdmd > teme ~= tdme
// else tdmd > temd > teme ~= tdme
// note: the first test takes a bit longer since time is needed for the DNS to resolve the IP addresses of the server host name
?>
--EXPECTREGEX--
Connection successful with TNIR Enabled and MultiSubnetFailover false\.
Time to connect is [0-9]+\.[0-9]+ sec\.
Connection successful with TNIR Enabled and MultiSubnetFailover true\.
Time to connect is [0-9]+\.[0-9]+ sec\.
Connection successful with TNIR Disabled and MultiSubnetFailover false\.
Time to connect is [0-9]+\.[0-9]+ sec\.
Connection successful with TNIR Disabled and MultiSubnetFailover true\.
Time to connect is [0-9]+\.[0-9]+ sec\.