Skip to content

Commit

Permalink
Send client process ID to server on Java 9+ (#1595)
Browse files Browse the repository at this point in the history
  • Loading branch information
David Engel committed Jun 11, 2021
1 parent fb15da6 commit 574b1e1
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
Expand Up @@ -1216,6 +1216,21 @@ final SQLCollation getDatabaseCollation() {
.getLogger("com.microsoft.sqlserver.jdbc.Connection");
private static String loggingClassName = "com.microsoft.sqlserver.jdbc.SQLServerConnection:";

/** Client process ID sent during login */
private static int pid = 0;

static {
long pidLong = 0;
try {
pidLong = ProcessHandle.current().pid();
} catch (NoClassDefFoundError e) { // ProcessHandle is Java 9+
if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) {
loggerExternal.finer(loggingClassName + " NoClassDefFoundError for ProcessHandle. ProcessId will be 0.");
}
}
pid = (pidLong > Integer.MAX_VALUE) ? 0 : (int)pidLong;
}

/**
* There are three ways to get a failover partner connection string, from the failover map, the connecting server
* returned the following variable only stores the serverReturned failver information.
Expand Down Expand Up @@ -5370,7 +5385,7 @@ final boolean complete(LogonCommand logonCommand, TDSReader tdsReader) throws SQ
tdsWriter.writeInt(tdsVersion);
tdsWriter.writeInt(requestedPacketSize);
tdsWriter.writeBytes(interfaceLibVersionBytes); // writeBytes() is little endian
tdsWriter.writeInt(0); // Client process ID (0 = ??)
tdsWriter.writeInt(pid); // Client process ID
tdsWriter.writeInt(0); // Primary server connection ID

tdsWriter.writeByte((byte) (// OptionFlags1:
Expand Down
@@ -0,0 +1,55 @@
/*
* Microsoft JDBC Driver for SQL Server Copyright(c) Microsoft Corporation All rights reserved. This program is made
* available under the terms of the MIT License. See the LICENSE file in the project root for more information.
*/
package com.microsoft.sqlserver.jdbc.connection;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.jupiter.api.Test;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;

import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import com.microsoft.sqlserver.testframework.AbstractTest;

/*
* This test is for validating that client process ID gets registered with the server when available to the driver.
*/
@RunWith(JUnitPlatform.class)
public class ClientProcessIdTest extends AbstractTest {

private static int pid = 0;

static {
long pidLong = 0;
try {
pidLong = ProcessHandle.current().pid();
} catch (NoClassDefFoundError e) { // ProcessHandle is Java 9+
}
pid = (pidLong > Integer.MAX_VALUE) ? 0 : (int)pidLong;
}

@Test
public void testClientProcessId() throws SQLException {
SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL(connectionString);
String sqlSelect = "select host_process_id from sys.dm_exec_sessions where session_id = @@SPID";

try (Connection con = ds.getConnection(); Statement stmt = con.createStatement()) {
try (ResultSet rs = stmt.executeQuery(sqlSelect)) {
if (rs.next()) {
assertEquals(rs.getInt(1), pid);
} else {
assertTrue(false, "Expected row of data was not found.");
}
}
}
}
}

0 comments on commit 574b1e1

Please sign in to comment.