Bug #24004 Cannot running MXJ as part of the JDBC driver on non-3306 ports when ...

Submitted: 6 Nov 2006 10:42 Modified: 22 Nov 2006 22:25
Reporter: Guangyu Liu Email Updates:
Status: Patch pending Impact on me:
None 
Category:Connector / MXJ Severity:S2 (Serious)
Version:5.0 OS:
Assigned to: CPU Architecture:Any

[6 Nov 2006 10:42] Guangyu Liu
Description:
I Cannot running MXJ as part of the JDBC driver on non-3306 ports when the port is running an mysql-nt Thread.

//*********test code begin

public void testJDBC() throws Exception{
        String mysqldir = "d:/mysqltest";
        String url = "jdbc:mysql://localhost:3336/mysql?" + 
            "socketFactory=com.mysql.management.driverlaunched.ServerLauncherSocketFactory" +
            "&server.basedir="+mysqldir+"&server.datadir="+mysqldir+"/data";
        Class.forName("com.mysql.jdbc.Driver");
        
        Connection conn = DriverManager.getConnection(url, "root", "");
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT VERSION()");
        rs.next();
        String version = rs.getString(1);
        rs.close();
        conn.close();
        System.out.println(version);
}
//*********test code end

This method in the test case cannot run twice! The errors trace is :
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.lang.RuntimeException
MESSAGE: Mysqld at D:\mysqltest is running on port 3306 not 3336

STACKTRACE:

java.lang.RuntimeException: Mysqld at D:\mysqltest is running on port 3306 not 3336
	at com.mysql.management.driverlaunched.ServerLauncherSocketFactory.ensureMysqlStarted(ServerLauncherSocketFactory.java:94)
	at com.mysql.management.driverlaunched.ServerLauncherSocketFactory.connect(ServerLauncherSocketFactory.java:58)
	at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:276)
	at com.mysql.jdbc.Connection.createNewIO(Connection.java:2666)
	at com.mysql.jdbc.Connection.<init>(Connection.java:1531)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at com.mysql.management.driverlaunched.ServerLauncherSocketFactoryTest.testJDBC(ServerLauncherSocketFactoryTest.java:213)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:154)
	at junit.framework.TestCase.runBare(TestCase.java:127)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

** END NESTED EXCEPTION **

Last packet sent to the server was 31 ms ago.
	at com.mysql.jdbc.Connection.createNewIO(Connection.java:2741)
	at com.mysql.jdbc.Connection.<init>(Connection.java:1531)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at com.mysql.management.driverlaunched.ServerLauncherSocketFactoryTest.testJDBC(ServerLauncherSocketFactoryTest.java:213)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:154)
	at junit.framework.TestCase.runBare(TestCase.java:127)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Because the mysql-nt.exe is running on port 3336, the message "Mysqld at D:\mysqltest is running on port 3306 not 3336" is obviously wrong.

The reason is in class "com.mysql.management.driverlaunched.ServerLauncherSocketFactory", the method is "ensureMysqlStarted":
//************
if (mysqld.isRunning()) {
            Object runningPort = mysqld.getServerOptions().get(
                    MysqldResourceI.PORT);
            if (!runningPort.equals(Integer.toString(port))) {
                String msg = "Mysqld at " + mysqld.getBaseDir()
                        + " is running on port " + runningPort + " not " + port;
                throw new RuntimeException(msg);
            }
            return;
}
//************
In the code before, if mysqld.isRunning() is true, the runningPort always is "3306". so always " throw new RuntimeException(msg)".

How to repeat:
Please use the test code in the description.

Suggested fix:
//************
if (mysqld.isRunning()) {
            Object runningPort = mysqld.getServerOptions().get(
                    MysqldResourceI.PORT);
            if (!runningPort.equals(Integer.toString(port))) {
                String msg = "Mysqld at " + mysqld.getBaseDir()
                        + " is running on port " + runningPort + " not " + port;
                throw new RuntimeException(msg);
            }
            return;
}
//************
Change to:
//************
if (mysqld.isRunning()) {
            return;
}
//************
Then I can run my test code. but I am not sure whether it's suitable.
[22 Nov 2006 19:12] Eric Herman
Verified. Bug is certainly present: first connection always works regardless of port. Additional connections are on non 3306 ports fail.
[22 Nov 2006 22:25] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/15739

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.053 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.