Skip site navigation (1) Skip section navigation (2)

Re: BUG #5269: postgres backend terminates with SIGSEGV

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 (view raw or flat)
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:
> 


In response to

Responses

pgsql-bugs by date

Next:From: Tom LaneDate: 2010-01-14 15:16:50
Subject: Re: BUG #5269: postgres backend terminates with SIGSEGV
Previous:From: Pavel StehuleDate: 2010-01-14 14:59:42
Subject: Re: BUG #5274: [PL/PgSQL] EXECUTE ... USING variable expansion

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group