From: | Justin Pitts <jpitts(at)bplglobal(dot)net> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-bugs(at)postgreSQL(dot)org |
Subject: | Re: BUG #5269: postgres backend terminates with SIGSEGV |
Date: | 2010-01-14 15:07:36 |
Message-ID: | C1CAC7F4-7E90-4778-BB7B-D08ACD541EB3@bplglobal.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Apologies for over-quoting on the previous message.
My approach to a regression test was this single-threaded test ( actual code at bottom )
Connection 1 - implicitly autocommiting every statement
create a test table and populate it with a single row.
CREATE TABLE FOO ( a int not null );
INSERT INTO FOO VALUES (1);
set the connection autocommit to false ( implied transaction begin on next statement )
read
SELECT * FROM FOO;
modify
UPDATE FOO SET a=a+1;
( transaction is still open )
Connection 2
set the connection autocommit to false
read
SELECT * FROM FOO;
Connection 1
commit;
Connection 2
modify
UPDATE FOO SET a=a+1
throws concurrent serialization error
Connection 3
do a bunch of catalog updates
for f in 1..??? ( i tried 1, 10, 100, and 4096 )
CREATE TEMP TABLE BAR$f (a int not null );
Connection 2
rollback <- I am expecting a server crash here. It does not crash.
My guess is that I am not provoking a 'SI queue overrun'
( I am assuming this is a reference to the queue implemented in sinvaladt.c. My C skills are rusty at best. )
Am I completely off base about how this should be reproducing?
Bug5269Test.java
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/* Regression test for PostgreSQL Bug # 5269
* http://archives.postgresql.org/pgsql-bugs/2010-01/msg00080.php
* */
public class Bug5269Test {
private Connection newConnection(Driver driver) {
Properties info = new Properties();
info.put("user", "postgres");
try {
return driver.connect("jdbc:postgresql://localhost:5433", info);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public void test() throws SQLException, InterruptedException {
Driver driver = new org.postgresql.Driver();
Connection a = newConnection(driver);
setupTable(a);
Connection b = newConnection(driver);
a.setAutoCommit(false);
a.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
b.setAutoCommit(false);
b.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
String select = "select * from foo";
String update = "update foo set a = a + 1";
a.prepareStatement(select).execute();
System.out.println("select a");
a.prepareStatement(update).execute();
System.out.println("update a");
b.prepareStatement(select).execute();
System.out.println("select b");
a.commit();
System.out.println("commit a");
try {
b.prepareStatement(update).execute();
b.commit();
throw new RuntimeException("Expected a serialization failure.");
} catch (SQLException sqle) {
System.out.println(sqle.getMessage());
flogCatalogs(driver);
System.out.println("flog catalogs");
// The hope is that an unpatched system would crash here.
b.rollback();
System.out.println("rollback.");
}
a.close();
b.close();
}
private void setupTable(Connection a) throws SQLException {
try {
a.prepareStatement("drop table foo").execute();
} catch (Exception e) {
e.printStackTrace();
}
a.prepareStatement("create table foo(a int not null)").executeUpdate();
a.prepareStatement("insert into foo values (1);").executeUpdate();
}
private void flogCatalogs(final Driver driver) throws SQLException {
final Connection conn = newConnection(driver);
try {
conn.setAutoCommit(false);
Statement ps = conn.createStatement();
String a = "create temp table bar";
String b = " (a int not null); ";
for (int f = 0; f < 128; f++) {
StringBuilder sb = new StringBuilder();
sb.append(a).append(f).append(b);
ps.execute(sb.toString());
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String... args) throws SQLException,
InterruptedException {
Bug5269Test test = new Bug5269Test();
test.test();
}
}
On Jan 13, 2010, at 10:22 PM, Justin Pitts wrote:
> Sorry for the delay.
>
> I am attempting to construct a JDBC test case that reproduces the problem.
>
> I have installed the patch and have not seen the crash since.
>
> On Jan 13, 2010, at 11:58 AM, Tom Lane wrote:
>
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2010-01-14 15:16:50 | Re: BUG #5269: postgres backend terminates with SIGSEGV |
Previous Message | Pavel Stehule | 2010-01-14 14:59:42 | Re: BUG #5274: [PL/PgSQL] EXECUTE ... USING variable expansion |