[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15109047#comment-15109047 ] Kevin Liew commented on CALCITE-1052: - We upgraded our test servers to Phoenix 4.7.0 on Calcite 1.5 and we can no longer reproduce this bug using the 4.7.0 thin client, though we will have to upgrade our driver to use the latest Avatica protocol. Thanks > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: phoenix-root-server.log, test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ('One','1'); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.INTEGER_TABLE VALUES ('Two',2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15102160#comment-15102160 ] Kevin Liew commented on CALCITE-1052: - I did some reading and it looks like these errors are due to our driver using JSON whereas newer versions of Phoenix use protocol buffers for communication https://issues.apache.org/jira/browse/CALCITE-840 https://issues.apache.org/jira/browse/PHOENIX-2359 > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: phoenix-root-server.log, test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ('One','1'); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.INTEGER_TABLE VALUES ('Two',2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 =
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15102167#comment-15102167 ] Josh Elser commented on CALCITE-1052: - bq. I did some reading and it looks like these errors are due to our driver using JSON whereas newer versions of Phoenix use protocol buffers for communication No, you would never have gotten into that code if you sent JSON and the server was expecting protobuf. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: phoenix-root-server.log, test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ('One','1'); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.INTEGER_TABLE VALUES ('Two',2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15102402#comment-15102402 ] Kevin Liew commented on CALCITE-1052: - We get that error when using the 4.6.0 release thin-client against the 4.7.0 snapshot in the Docker image you emailed to me. You may have been testing the 4.7.0 thin-client against the 4.7.0 server, which gives a different error. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: phoenix-root-server.log, test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ('One','1'); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.INTEGER_TABLE VALUES ('Two',2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15102464#comment-15102464 ] Josh Elser commented on CALCITE-1052: - Alright, I still can't reproduce what you say you're seeing, so have a look at what I did. Docker image: https://github.com/joshelser/docker-phoenix Client repo: https://github.com/joshelser/phoenix-queryserver-jdbc-client {{docker run -P -it joshelser/apache-phoenix}} then, follow the instructions on the Github page for the client repo using the URL for the QueryServer (whose port should get mapped out of the docker container). For some reason, I had to explicitly set the SERIALIZATION to be protobuf in the URL (the {{;serialization=PROTOBUF}} bit). I thought the thin driver should be defaulting to that already but perhaps I'm mistaken. Let me know if this works for you. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: phoenix-root-server.log, test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ('One','1'); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.INTEGER_TABLE VALUES ('Two',2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15098450#comment-15098450 ] Josh Elser commented on CALCITE-1052: - [~kliew], I'm not having any success with your docker container so far. It seems to hang before ever starting PQS. Can you drop me an email? (see the addr on my JIRA acct). > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15098643#comment-15098643 ] Kevin Liew commented on CALCITE-1052: - Hi Josh. I have found that the docker container will hang when there is less than about 4GB of RAM or otherwise insufficient resources to start the hadoop services. I'll email you. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15096781#comment-15096781 ] Kevin Liew commented on CALCITE-1052: - We generate unique connection IDs as well. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { > System.out.println(column1); > } > } > } > > //conn.close(); > }
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15096770#comment-15096770 ] Kevin Liew commented on CALCITE-1052: - This bug only appears when using Avatica's 'prepare' and 'fetch'. Your script will call 'prepareAndExecute'. I used parameter statements to call prepare and fetch. I will package and upload my Eclipse projects and test server environment shortly. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15096962#comment-15096962 ] Josh Elser commented on CALCITE-1052: - No, I take it back. Even then, a unique connection ID on the client should have disallowed this. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { > System.out.println(column1); > } >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15096822#comment-15096822 ] Josh Elser commented on CALCITE-1052: - Ahh, good catch. I will experiment some more while you package things up. Thanks. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { > System.out.println(column1); > } > } > } >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15096936#comment-15096936 ] Josh Elser commented on CALCITE-1052: - Actually, you may just be running into CALCITE-912. I'm trying to refresh myself on how this previously worked. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { > System.out.println(column1); >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15097127#comment-15097127 ] Kevin Liew commented on CALCITE-1052: - What adaptations did you make? We are consistently seeing this bug whenever we run concurrent continuous integration tests. It may be a server configuration issue but the Docker image replicates our environment. I haven't had success manually upgrading Phoenix before. I get errors when I try to connect to the queryserver after replacing the jars. ie. {code:java}java.lang.IllegalArgumentException: Cannot find parser for at org.apache.calcite.avatica.remote.ProtobufTranslationImpl.getParserForRequest(ProtobufTranslationImpl.java:170) {code} > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Components: avatica >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > Attachments: test.zip > > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt =
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15094627#comment-15094627 ] Josh Elser commented on CALCITE-1052: - bq. We are able to reproduce this issue while running the two JDBC applications on separate machines That is.. very interesting. Let me look into this. I thought the current use of our connectionId and statementId should prevent this from happening. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15095176#comment-15095176 ] Josh Elser commented on CALCITE-1052: - bq. I'll try updating Phoenix and Calcite to their most recent snapshots and re-running to check for a regression Just updated Phoenix and Calcite and am still not seeing this. bq. If you can create a test case which shows this actually happening, that would extremely helpful I should also say that anything I can run to reproduce this would work. It does not have to be within the confines of a unit test. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > >
[jira] [Commented] (CALCITE-1052) Phoenix queryserver sends result set in response to the wrong request when there are concurrent requests
[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15095098#comment-15095098 ] Josh Elser commented on CALCITE-1052: - I've hacked together a little script locally based on what you said here: {noformat} ==> create_integer_table.sql <== drop table if exists integer_table; create table integer_table (id integer not null primary key, column1 integer); UPSERT INTO INTEGER_TABLE VALUES(1, 1); UPSERT INTO INTEGER_TABLE VALUES(2, 2); UPSERT INTO INTEGER_TABLE VALUES(3, 3); ==> create_string_table.sql <== drop table if exists varchar_table; create table varchar_table (id integer not null primary key, column1 varchar(50)); UPSERT INTO VARCHAR_TABLE VALUES(1, 'str_1'); UPSERT INTO VARCHAR_TABLE VALUES(2, 'str_2'); UPSERT INTO VARCHAR_TABLE VALUES(3, 'str_3'); {noformat} I inserted 50k records this way (upserts 4 through 4 omitted for obv reasons). I then ran two loops querying for records in the tables via sqlline-thin.py: {noformat} ==> query_integer.sql <== SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; ... ==> query_string.sql <== SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; ... {noformat} {noformat} while true; do /usr/local/lib/phoenix/bin/sqlline-thin.py ~/query_string.sql; done {noformat} {noformat} while true; do /usr/local/lib/phoenix/bin/sqlline-thin.py ~/query_integer.sql; done {noformat} Given what you described, [~kliew], I should expected to see "5000" showing up while querying VARCHAR_TABLE and "str_5000" while querying INTEGER_TABLE (or some errors casting "str_5000" into an integer). However, I did not see this. I'll try updating Phoenix and Calcite to their most recent snapshots and re-running to check for a regression, but I am not anticipating seeing what you describe. If you can create a test case which shows this actually happening, that would extremely helpful. Right now, I can only assume that for your own driver, you did not create unique connectionIDs. I'm still baffled about seeing this with the JDBC driver as you said though. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug >Reporter: Kevin Liew >Assignee: Josh Elser >Priority: Critical > Labels: phoenix, queryserver > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765;); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); >