You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafodion.apache.org by "Alice Chen (JIRA)" <ji...@apache.org> on 2015/07/22 20:19:18 UTC
[jira] [Created] (TRAFODION-980) LP Bug: 1418215 - JDBC stmt.cancel
does not work and a error msg logged in dcs master log
Alice Chen created TRAFODION-980:
------------------------------------
Summary: LP Bug: 1418215 - JDBC stmt.cancel does not work and a error msg logged in dcs master log
Key: TRAFODION-980
URL: https://issues.apache.org/jira/browse/TRAFODION-980
Project: Apache Trafodion
Issue Type: Bug
Components: client-jdbc-t4
Reporter: Aruna Sadashiva
Assignee: Zbigniew Omanski
Priority: Critical
Fix For: 1.1 (pre-incubation)
JDBC stmt.cancel is not behaving as expected. I first noticed this in DBVisualizer. Cancel used to work from DBViz, but it does not work anymore, so tried it from a java test program.
When stmt.cancel is issued, the cancel thread gets this exception:
Got SQLException in queryThread.....
org.trafodion.jdbc.t4.HPT4Exception: The message id: problem_with_server_read
at org.trafodion.jdbc.t4.HPT4Messages.createSQLException(HPT4Messages.java:304)
at org.trafodion.jdbc.t4.InputOutput.doIO(InputOutput.java:371)
at org.trafodion.jdbc.t4.T4_Dcs_Cancel.cancel(T4_Dcs_Cancel.java:83)
at org.trafodion.jdbc.t4.InterfaceConnection.cancel(InterfaceConnection.java:478)
at org.trafodion.jdbc.t4.InterfaceStatement.cancel(InterfaceStatement.java:1044)
at org.trafodion.jdbc.t4.TrafT4Statement.cancel(TrafT4Statement.java:104)
at qc1$cancelThread.run(qc1.java:139)
SQLMessage The message id: problem_with_server_read
SQLState HY000
Error Code -1
After this the test does not exit and I can see the query stats using GET STATISTICS FOR QID <qid> command. The query seems to continue executing in sql.
The query thread gets this exception after the query completes:
Got SQLException in queryThread.....
org.trafodion.jdbc.t4.HPT4Exception: The message id: invalid_cursor_state
at org.trafodion.jdbc.t4.HPT4Messages.createSQLException(HPT4Messages.java:304)
at org.trafodion.jdbc.t4.TrafT4ResultSet.getType(TrafT4ResultSet.java:2368)
at org.trafodion.jdbc.t4.TrafT4ResultSet.setFetchOutputs(TrafT4ResultSet.java:4596)
at org.trafodion.jdbc.t4.InterfaceResultSet.setExecute2FetchOutputs(InterfaceResultSet.java:729)
at org.trafodion.jdbc.t4.InterfaceResultSet.fetch(InterfaceResultSet.java:796)
at org.trafodion.jdbc.t4.TrafT4ResultSet.next(TrafT4ResultSet.java:2869)
at qc1$queryThread.run(qc1.java:76)
SQLMessage The message id: invalid_cursor_state
SQLState HY000
Error Code -1
And this message is logged in the dcs master log:
2015-02-04 20:32:38,737 ERROR org.trafodion.dcs.master.listener.ListenerService: IOException: /16.235.158.28:36460: Wrong signature in read Header : 959447040
Below is the cancel test code:
import java.sql.*;
import java.math.*;
import java.util.*;
import java.io.*;
public class qc1
{
public static boolean is25 = false;
public static void main(String[] args)
{
Connection conn = null;
CallableStatement cs = null;
Properties props = null;
String cat = null;
String sch = null;
String IN1 = null;
String IN2 = null;
String defsch = null;
String url = null;
Statement stmt = null;
String ISTBL = "SITBL";
String colName = null;
try
{
//Class.forName("org.trafodion.jdbc.t2.T2Driver");
//conn = DriverManager.getConnection("jdbc:t2jdbc:", "usr", "pwd");
conn = Utils.getUserConnection();
System.out.println("Connection established....");
//String query1 = "select count(*) from g_arkcasedb.branch a, g_arkcasedb.customer b, g_arkcasedb.employee c, g_arkcasedb.orders d, g_arkcasedb.parts e, g_arkcasedb.region f, g_arkcasedb.supplier g, g_arkcasedb.odetail h, g_arkcasedb.fromsup i";
String query1 = "select count(*) from g_arkcasedb.branch a, g_arkcasedb.customer b, g_arkcasedb.employee c, g_arkcasedb.orders d, g_arkcasedb.parts e, g_arkcasedb.region f, g_arkcasedb.supplier g, g_arkcasedb.odetail h";
PreparedStatement pStmt = conn.prepareStatement(query1);
System.out.println("Calling queryThread.....");
queryThread qt = new queryThread(pStmt);
qt.start();
Thread.currentThread().sleep(5000);
System.out.println("Calling cancelThread.....");
cancelThread ct = new cancelThread(pStmt);
ct.start();
System.out.println("Check if the query is canceled....");
//Thread.currentThread().sleep(10000);
System.out.println("Now exiting the application.....");
pStmt.close();
conn.close();
return;
}// end of try
catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
static class queryThread extends Thread
{
private PreparedStatement ps;
private boolean pass = false;
public queryThread(PreparedStatement pstmt)
{
ps = pstmt;
}
public void run()
{
try {
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsMD = rs.getMetaData();
int total = 0;
while (rs.next())
{
total++;
String data;
for (int j = 1; j <= rsMD.getColumnCount(); j++)
{
data = rsMD.getColumnName(j) + rs.getObject(j);
}
}
rs.close();
System.out.println("Query thread : total of " + total + " rows selected");
}// end of try
catch (SQLException se) {
System.out.println("Got SQLException in queryThread.....");
se.printStackTrace();
System.out.println(" SQLMessage " + se.getMessage());
System.out.println(" SQLState " + se.getSQLState());
System.out.println(" Error Code " + se.getErrorCode());
} catch (Exception e) {
System.out.println("Got Exception in queryThread.....");
e.printStackTrace();
System.out.println(e.getMessage());
}
}
} // end queryThread
static class cancelThread extends Thread
{
private PreparedStatement ps;
public cancelThread(PreparedStatement pstmt)
{
ps = pstmt;
}
public void run()
{
// adjust waitTime for the cancel to happen while the query is in
// progress
int waitTime = 3;
int waitTimeMill = waitTime * 1000;
java.util.Date startDate = new java.util.Date();
long startDateMilliseconds = startDate.getTime();
long endDateMilliseconds = startDateMilliseconds + waitTimeMill;
long nowTimeMills = 0;
long dot;
try
{
// Wait "waitTime" seconds to make sure query is running.
System.out.print(" In cancelThread: About to Cancel");
nowTimeMills = new java.util.Date().getTime();
dot = nowTimeMills + 1000;
while (nowTimeMills < endDateMilliseconds) {
nowTimeMills = new java.util.Date().getTime();
if (nowTimeMills > dot) {
System.out.print(".");
dot = nowTimeMills + 1000;
}
}
ps.cancel();
System.out.println("Statement canceled .....");
}// end of try
catch (SQLException se) {
System.out.println("Got SQLException in queryThread.....");
se.printStackTrace();
System.out.println(" SQLMessage " + se.getMessage());
System.out.println(" SQLState " + se.getSQLState());
System.out.println(" Error Code " + se.getErrorCode());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} catch (Throwable e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
} // end cancelThread
} // end qc1
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)