You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2011/08/29 16:23:59 UTC
svn commit: r1162827 - in /db/derby/code/trunk/java:
engine/org/apache/derby/diag/ErrorLogReader.java
engine/org/apache/derby/diag/StatementDuration.java
testing/org/apache/derbyTesting/functionTests/tests/lang/SysDiagVTIMappingTest.java
Author: rhillegas
Date: Mon Aug 29 14:23:59 2011
New Revision: 1162827
URL: http://svn.apache.org/viewvc?rev=1162827&view=rev
Log:
DERBY-5391: Fix the statement duration and error log reader vtis to handle the new timestamp format which we've been using in Derby logs since 10.7.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/diag/ErrorLogReader.java
db/derby/code/trunk/java/engine/org/apache/derby/diag/StatementDuration.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SysDiagVTIMappingTest.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/diag/ErrorLogReader.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/diag/ErrorLogReader.java?rev=1162827&r1=1162826&r2=1162827&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/diag/ErrorLogReader.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/diag/ErrorLogReader.java Mon Aug 29 14:23:59 2011
@@ -89,7 +89,7 @@ public class ErrorLogReader extends VTIT
// Variables for current row
private String line;
- private int gmtIndex;
+ private int endTimestampIndex;
private int threadIndex;
private int xidIndex;
private int lccidIndex;
@@ -97,7 +97,7 @@ public class ErrorLogReader extends VTIT
private int drdaidIndex;
- private static final String GMT_STRING = " GMT";
+ private static final String END_TIMESTAMP = " Thread";
private static final String PARAMETERS_STRING = "Parameters:";
private static final String BEGIN_THREAD_STRING = "[";
private static final String END_THREAD_STRING = "]";
@@ -178,7 +178,7 @@ public class ErrorLogReader extends VTIT
return false;
}
- gmtIndex = line.indexOf(GMT_STRING);
+ endTimestampIndex = line.indexOf( END_TIMESTAMP );
threadIndex = line.indexOf(BEGIN_THREAD_STRING);
xidIndex = line.indexOf(BEGIN_XID_STRING);
lccidIndex = line.indexOf(BEGIN_XID_STRING, xidIndex + 1);
@@ -191,7 +191,7 @@ public class ErrorLogReader extends VTIT
continue;
}
- if (gmtIndex != -1 && threadIndex != -1 && xidIndex != -1 &&
+ if (endTimestampIndex != -1 && threadIndex != -1 && xidIndex != -1 &&
databaseIndex != -1)
{
return true;
@@ -234,7 +234,7 @@ public class ErrorLogReader extends VTIT
switch (columnNumber)
{
case 1:
- return line.substring(0, gmtIndex);
+ return line.substring(0, endTimestampIndex);
case 2:
return line.substring(threadIndex + 1, line.indexOf(END_THREAD_STRING));
@@ -314,7 +314,7 @@ public class ErrorLogReader extends VTIT
/* MetaData
*/
- // column1: TS varchar(26) not null
+ // column1: TS varchar(29) not null
// column2: THREADID varchar(40) not null
// column3: XID varchar(15) not null
// column4: LCCID varchar(15) not null
@@ -322,7 +322,7 @@ public class ErrorLogReader extends VTIT
// column6: DRDAID varchar(50) nullable
// column5: LOGTEXT VARCHAR(max) not null
private static final ResultColumnDescriptor[] columnInfo = {
- EmbedResultSetMetaData.getResultColumnDescriptor("TS", Types.VARCHAR, false, 26),
+ EmbedResultSetMetaData.getResultColumnDescriptor("TS", Types.VARCHAR, false, 29),
EmbedResultSetMetaData.getResultColumnDescriptor("THREADID", Types.VARCHAR, false, 40),
EmbedResultSetMetaData.getResultColumnDescriptor("XID", Types.VARCHAR, false, 15),
EmbedResultSetMetaData.getResultColumnDescriptor("LCCID", Types.VARCHAR, false, 15),
Modified: db/derby/code/trunk/java/engine/org/apache/derby/diag/StatementDuration.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/diag/StatementDuration.java?rev=1162827&r1=1162826&r2=1162827&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/diag/StatementDuration.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/diag/StatementDuration.java Mon Aug 29 14:23:59 2011
@@ -26,7 +26,7 @@ import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.FileInputStream;
-
+import java.text.SimpleDateFormat;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Properties;
@@ -86,13 +86,13 @@ public class StatementDuration extends V
// Variables for current row
private String line;
- private int gmtIndex;
+ private int endTimestampIndex;
private int threadIndex;
private int xidIndex;
private int lccidIndex;
private String[] currentRow;
- private static final String GMT_STRING = " GMT";
+ private static final String END_TIMESTAMP = " Thread";
private static final String BEGIN_THREAD_STRING = "[";
private static final String END_THREAD_STRING = "]";
private static final String BEGIN_XID_STRING = "= ";
@@ -170,12 +170,12 @@ public class StatementDuration extends V
return false;
}
- gmtIndex = line.indexOf(GMT_STRING);
+ endTimestampIndex = line.indexOf( END_TIMESTAMP );
threadIndex = line.indexOf(BEGIN_THREAD_STRING);
xidIndex = line.indexOf(BEGIN_XID_STRING);
lccidIndex = line.indexOf(BEGIN_XID_STRING, xidIndex + 1);
- if (gmtIndex != -1 && threadIndex != -1)
+ if (endTimestampIndex != -1 && threadIndex != -1 && xidIndex != -1)
{
/* Build a row */
String[] newRow = new String[6];
@@ -198,9 +198,9 @@ public class StatementDuration extends V
currentRow = (String[]) previousRow;
/* Figure out the duration. */
- Timestamp endTs = Timestamp.valueOf(newRow[0]);
+ Timestamp endTs = stringToTimestamp( newRow[0] );
long end = endTs.getTime() + endTs.getNanos() / 1000000;
- Timestamp startTs = Timestamp.valueOf(currentRow[0]);
+ Timestamp startTs = stringToTimestamp( currentRow[0] );
long start = startTs.getTime() + startTs.getNanos() / 1000000;
currentRow[5] = Long.toString(end - start);
@@ -208,6 +208,47 @@ public class StatementDuration extends V
}
}
}
+ // Turn a string into a Timestamp
+ private Timestamp stringToTimestamp( String raw ) throws SQLException
+ {
+ //
+ // We have to handle two timestamp formats.
+ //
+ // 1) Logged timestamps look like this before 10.7 and the fix introduced by DERBY-4752:
+ //
+ // 2006-12-15 16:14:58.280 GMT
+ //
+ // 2) From 10.7 onward, logged timestamps look like this:
+ //
+ // Fri Aug 26 09:28:00 PDT 2011
+ //
+ String trimmed = raw.trim();
+
+ // if we're dealing with a pre-10.7 timestamp
+ if ( !Character.isDigit( trimmed.charAt( trimmed.length() -1 ) ) )
+ {
+ // strip off the trailing timezone, which Timestamp does not expect
+
+ trimmed = trimmed.substring( 0, trimmed.length() - 4 );
+
+ return Timestamp.valueOf( trimmed );
+ }
+ else
+ {
+ //
+ // From 10.7 onward, the logged timestamp was formatted by Date.toString().
+ //
+ SimpleDateFormat sdf = new SimpleDateFormat( "EEE MMM dd HH:mm:ss zzz yyyy" );
+
+ try {
+ return new Timestamp( sdf.parse( trimmed ).getTime() );
+ }
+ catch (Exception e)
+ {
+ throw new SQLException( e.getMessage() );
+ }
+ }
+ }
/**
@see java.sql.ResultSet#close
@@ -250,7 +291,7 @@ public class StatementDuration extends V
switch (columnNumber)
{
case 1:
- return line.substring(0, gmtIndex);
+ return line.substring(0, endTimestampIndex);
case 2:
return line.substring(threadIndex + 1, line.indexOf(END_THREAD_STRING));
@@ -328,7 +369,7 @@ public class StatementDuration extends V
*/
private static final ResultColumnDescriptor[] columnInfo = {
- EmbedResultSetMetaData.getResultColumnDescriptor("TS", Types.VARCHAR, false, 26),
+ EmbedResultSetMetaData.getResultColumnDescriptor("TS", Types.VARCHAR, false, 29),
EmbedResultSetMetaData.getResultColumnDescriptor("THREADID", Types.VARCHAR, false, 80),
EmbedResultSetMetaData.getResultColumnDescriptor("XID", Types.VARCHAR, false, 15),
EmbedResultSetMetaData.getResultColumnDescriptor("LCCID", Types.VARCHAR, false, 10),
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SysDiagVTIMappingTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SysDiagVTIMappingTest.java?rev=1162827&r1=1162826&r2=1162827&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SysDiagVTIMappingTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SysDiagVTIMappingTest.java Mon Aug 29 14:23:59 2011
@@ -26,6 +26,7 @@ import org.apache.derbyTesting.junit.JDB
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.SecurityManagerSetup;
import org.apache.derbyTesting.junit.SupportFilesSetup;
+import org.apache.derbyTesting.junit.SystemPropertyTestSetup;
import org.apache.derbyTesting.junit.TestConfiguration;
import java.sql.ResultSet;
@@ -33,6 +34,9 @@ import java.sql.Statement;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.Properties;
public final class SysDiagVTIMappingTest extends BaseJDBCTestCase {
@@ -50,10 +54,18 @@ public final class SysDiagVTIMappingTest
public static Test suite()
{
TestSuite suite = new TestSuite("Diagnostic VTI Table Mappings");
- suite.addTest(TestConfiguration.
- defaultSuite(SysDiagVTIMappingTest.class));
- /* Some of the VTIs that are tested in this class require a derby.log
+ Test defaultSetup = TestConfiguration.defaultSuite( SysDiagVTIMappingTest.class );
+
+ // turn on statement logging so there will be something in the error log
+ // to run these vtis against
+ Properties sysprops = new Properties();
+ sysprops.put( "derby.language.logStatementText", "true" );
+ Test verboseTest = new SystemPropertyTestSetup ( defaultSetup, sysprops );
+
+ suite.addTest( verboseTest );
+
+ /* Some of the VTIs that are tested in this class require a derby.log
* file. We have a test log file stored in the tests/lang directory,
* and since the VTIs are going to try to read it, the test log file
* must be in a directory for which Derby has read access. By
@@ -393,7 +405,7 @@ public final class SysDiagVTIMappingTest
JDBC.assertColumnNames(rs, expColNames);
String [][] expRS = new String [][]
{
- {"2006-12-15 16:14:58.280", "main,5,main", "1111", "0",
+ {"2006-12-15 16:14:58.280 GMT", "main,5,main", "1111", "0",
"(DATABASE = ugh), (DRDAID = null), Cleanup action starting",
"0"}
};
@@ -413,7 +425,7 @@ public final class SysDiagVTIMappingTest
JDBC.assertColumnNames(rs, expColNames);
expRS = new String [][]
{
- {"2006-12-15 16:14:58.280", "main,5,main", "1111", "0",
+ {"2006-12-15 16:14:58.280 GMT", "main,5,main", "1111", "0",
"(DATABASE = ugh), (DRDAID = null), Cleanup action starting",
"0"}
};
@@ -450,9 +462,9 @@ public final class SysDiagVTIMappingTest
JDBC.assertColumnNames(rs, expColNames);
String [][] expRS = new String [][]
{
- {"2006-12-15 16:14:58.280", "main,5,main", "1111", "0", "ugh",
+ {"2006-12-15 16:14:58.280 GMT", "main,5,main", "1111", "0", "ugh",
"null", "Cleanup action starting"},
- {"2006-12-15 16:14:58.280", "main,5,main", "1111", "0", "ugh",
+ {"2006-12-15 16:14:58.280 GMT", "main,5,main", "1111", "0", "ugh",
"null", "Failed Statement is: select * from oops"}
};
@@ -471,9 +483,9 @@ public final class SysDiagVTIMappingTest
JDBC.assertColumnNames(rs, expColNames);
expRS = new String [][]
{
- {"2006-12-15 16:14:58.280", "main,5,main", "1111", "0", "ugh",
+ {"2006-12-15 16:14:58.280 GMT", "main,5,main", "1111", "0", "ugh",
"null", "Cleanup action starting"},
- {"2006-12-15 16:14:58.280", "main,5,main", "1111", "0", "ugh",
+ {"2006-12-15 16:14:58.280 GMT", "main,5,main", "1111", "0", "ugh",
"null", "Failed Statement is: select * from oops"}
};
@@ -703,6 +715,37 @@ public final class SysDiagVTIMappingTest
st.close();
}
+ /**
+ * Test date formatting in the vtis which read the error log. This attempts
+ * to keep us from breaking these vtis if the format of logged timestamps
+ * changes. See DERBY-5391.
+ */
+ public void test_5391() throws Exception
+ {
+ Statement st = createStatement();
+
+ ResultSet rs1 = st.executeQuery( "select * from table (syscs_diag.error_log_reader( )) as t1" );
+ vetTimestamp( rs1 );
+ rs1.close();
+
+ ResultSet rs2 = st.executeQuery( "select * from table (syscs_diag.statement_duration()) as t1" );
+ vetTimestamp( rs2 );
+ rs2.close();
+
+ st.close();
+ }
+ private void vetTimestamp( ResultSet rs ) throws Exception
+ {
+ assertTrue( rs.next() );
+
+ String timestampString = rs.getString( 1 ).trim();
+
+ SimpleDateFormat sdf = new SimpleDateFormat( "EEE MMM dd HH:mm:ss zzz yyyy" );
+ Timestamp timestamp = new Timestamp( sdf.parse( timestampString ).getTime() );
+
+ println( timestamp.toString() );
+ }
+
/* All statements in this method should fail because a VTI table-
* mapping that takes arguments can only be used as part of the TABLE
* constructor. Any other uses of, or attempts to modify, such a