PGStream synchronization
От | Maciek Sakrejda |
---|---|
Тема | PGStream synchronization |
Дата | |
Msg-id | 895e58dd0908241736q3575cdc2v461d879c5b5f9dcb@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: PGStream synchronization
|
Список | pgsql-jdbc |
We've found some synchronization issues around PGStream in QueryExecutorImpl and ProtocolConnectionImpl. Specifically, while QueryExecutorImpl synchronizes all its uses off PGStream, ProtocolConnectionImpl uses the same PGStream directly when close() is called. This can easily cause protocol-level errors and, theoretically, at least, bad data shoved into a COPY IN query while the actual Connection.close() is ignored. This doesn't just affect COPY, though--anything that causes writes to the QueryExecutorImpl's pgStream could be affected. The only thing I've achieved so far is protocol-level errors, but that's a serious enough issue on its own. It's not immediately clear how to fix this, since we don't want to synchronize PGStream itself. Should ProtocolConnectionImpl just delegate to QueryExecutorImpl on close() perhaps, with QueryExecutorImpl handling the actual writes to PGStream? See sample code to reproduce below: package com.truviso; import java.sql.Connection; import java.sql.DriverManager; import org.postgresql.PGConnection; import org.postgresql.copy.CopyIn; public class Test { public static void main(String[] args) throws Exception { Class.forName("org.postgresql.Driver"); final PGConnection c = (PGConnection) DriverManager.getConnection("jdbc:postgresql://localhost:5432/cqdb", "foo", ""); ((Connection)c).createStatement().execute( "drop table if exists foo; create temporary table foo(a text)"); Thread t1 = new Thread(new Runnable() { public void run() { try { CopyIn copy = c.getCopyAPI().copyInQuery("copy foo from stdin"); String copyData = "abc"; byte[] copyBytes = copyData.getBytes(); copy.writeToCopy(copyBytes, 0, copyBytes.length); Thread.sleep(2000); copy.endCopy(); } catch (Exception e) { e.printStackTrace(); } } }); t1.start(); Thread.sleep(1000); ((Connection)c).close(); t1.join(); } } Thanks, -- Maciek Sakrejda | Software Engineer | Truviso 1065 E. Hillsdale Blvd., Suite 230 Foster City, CA 94404 (650) 242-3500 Main (650) 242-3501 F msakrejda@truviso.com www.truviso.com
В списке pgsql-jdbc по дате отправления: