Re: jdbc PGCopyOutputStream close() v. endCopy()

From: Dave Cramer <pg(at)fastcrypt(dot)com>
To: Rob Sargent <robjsargent(at)gmail(dot)com>
Cc: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: jdbc PGCopyOutputStream close() v. endCopy()
Date: 2019-01-10 13:09:22
Message-ID: CADK3HHJwRCot7UeYyccX8PHn0MtMcM_AvY9hE8P2bZbQKJ4LKA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi Rob,

Interesting. I've not looked too much into the copy implementation.
The JDBC list or the jdbc github repo https://github.com/pgjdbc/pgjdbc
might be a better place to report this. I know Lukas Edar monitors it as
well

Dave Cramer

davec(at)postgresintl(dot)com
www.postgresintl.com

On Tue, 8 Jan 2019 at 16:29, Rob Sargent <robjsargent(at)gmail(dot)com> wrote:

> As is often the case, I'm unsure of which of these methods to use, or if
> I'm using them correctly.
>
> PG10.5, jooq-3.10.8, postgresql-42.1.4, linux (redhat 6.9) and logback to
> a file.
>
> I have been using close() for a while but thought I would make use of
> either the returned long from endCopy() or perhaps getHandledRowCount().
>
> Both work perfectly, but when I use endCopy() I always get the exception
> shown near the bottom of this log excerpt. The COPY is on its own thread
> from the same connection as the direct jooq writes also listed. Again, the
> data is all saved but I am worried that I'm not closing properly even if I
> use close(). The data here doesn't warrent bulk copy but it's just a quick
> example to repeat.
>
> 13:32:55.785 [pool-1-thread-1] DEBUG edu.utah.camplab.jx.PayloadFromMux -
> STAGING TABLE CREATED: bulk."flk_g16-forcing very long name to trigger
> truncation_22_8045c0"
> 13:32:55.786 [pool-1-thread-1] INFO edu.utah.camplab.jx.PayloadFromMux -
> 8045c057-99ec-490b-90c1-85875269afee: started COPY work at 1546979575786
> 13:32:55.789 [pool-1-thread-1] INFO edu.utah.camplab.jx.PayloadFromMux -
> 8045c057-99ec-490b-90c1-85875269afee: Total segment save took 22 ms
> 13:32:55.790 [pool-1-thread-1] INFO edu.utah.camplab.jx.AbstractPayload -
> 8045c057-99ec-490b-90c1-85875269afee: closing process
> 8045c057-99ec-490b-90c1-85875269afee
> 13:32:55.790 [8045c057-99ec-490b-90c1-85875269afee] INFO
> e.u.camplab.jx.PayloadWriterThread - bulk."flk_g16-forcing very long name
> to trigger truncation_22_8045c0": Begin bulk copy segment
> 13:32:55.793 [8045c057-99ec-490b-90c1-85875269afee] INFO
> e.u.camplab.jx.PayloadWriterThread - bulked up to 89, maybe?
> 13:32:55.793 [pool-1-thread-1] DEBUG org.jooq.tools.LoggerListener -
> Executing batch query : insert into "process_input" ("id", "process_id",
> "input_type", "input_ref") values (?, ?, ?, ?)
> 13:32:55.795 [8045c057-99ec-490b-90c1-85875269afee] INFO
> e.u.camplab.jx.PayloadWriterThread - bulked up to 197, maybe?
> 13:32:55.797 [8045c057-99ec-490b-90c1-85875269afee] INFO
> e.u.camplab.jx.PayloadWriterThread - bulked up to 318, maybe?
> 13:32:55.798 [8045c057-99ec-490b-90c1-85875269afee] INFO
> e.u.camplab.jx.PayloadWriterThread - bulked up to 393, maybe?
> 13:32:55.799 [8045c057-99ec-490b-90c1-85875269afee] INFO
> e.u.camplab.jx.PayloadWriterThread - 393/393 segments delivered in 9 ms
> 13:32:55.799 [8045c057-99ec-490b-90c1-85875269afee] DEBUG
> e.u.camplab.jx.PayloadWriterThread - staged in 9 ms
> 13:32:55.800 [pool-1-thread-1] DEBUG org.jooq.tools.LoggerListener -
> Executing batch query : insert into "process_output" ("id",
> "process_id", "output_type", "output_ref") values (?, ?, ?, ?)
> 13:32:55.805 [8045c057-99ec-490b-90c1-85875269afee] ERROR
> e.u.camplab.jx.PayloadWriterThread - bulk."flk_g16-forcing very long name
> to trigger truncation_22_8045c0": i/o trouble
> java.io.IOException: Ending write to copy failed.
> at
> org.postgresql.copy.PGCopyOutputStream.close(PGCopyOutputStream.java:107)
> ~[postgresql-42.1.4.jar:42.1.4]
> at
> edu.utah.camplab.jx.PayloadWriterThread.run(PayloadWriterThread.java:75)
> ~[transport/:na]
> Caused by: org.postgresql.util.PSQLException: Tried to write to an
> inactive copy operation
> at
> org.postgresql.core.v3.QueryExecutorImpl.writeToCopy(QueryExecutorImpl.java:978)
> ~[postgresql-42.1.4.jar:42.1.4]
> at org.postgresql.core.v3.CopyInImpl.writeToCopy(CopyInImpl.java:35)
> ~[postgresql-42.1.4.jar:42.1.4]
> at
> org.postgresql.copy.PGCopyOutputStream.endCopy(PGCopyOutputStream.java:166)
> ~[postgresql-42.1.4.jar:42.1.4]
> at
> org.postgresql.copy.PGCopyOutputStream.close(PGCopyOutputStream.java:105)
> ~[postgresql-42.1.4.jar:42.1.4]
> ... 1 common frames omitted
> 13:32:55.810 [pool-1-thread-1] DEBUG org.jooq.tools.LoggerListener -
> Executing batch query : insert into "process_arg" ("id", "process_id",
> "argname", "argvalue_int", "argvalue_float", "argvalue_text") values (?, ?,
> ?, ?, ?, ?)
>
> The class doing the bulk work, PayloadWriterThread extends Thread, the
> thread name is set from the caller and the critical parts are as follows:
>
> @Override
> public void run() {
> try (PGCopyOutputStream writer = new PGCopyOutputStream(copyIn)) {
> long startAt = System.currentTimeMillis();
> deliverSegments(writer);
> long postDeliver = System.currentTimeMillis();
> logger.debug("staged in {} ms", postDeliver - startAt);
> }
> catch (SQLException sqle) {
> sqle.printStackTrace();
> logger.error("{}: sql trouble", tableName, sqle);
> throw new RuntimeException("Bulk copy failed on sql", sqle);
> }
> catch (IOException ioe) {
> ioe.printStackTrace();
> logger.error("{}: i/o trouble", tableName, ioe);
> throw new RuntimeException("Bulk copy failed on i/o", ioe);
> }
> }
> private void deliverSegments(PGCopyOutputStream writer) throws
> IOException, SQLException {
> logger.info("{}: Begin bulk copy segment", tableName);
>
> long counter = 0;
> long copied = 0;
> //These had better end up the same number
> long st = System.currentTimeMillis();
> for (Map.Entry<String, List<Segment>> seglistME :
> segmentListMap.entrySet()) {
> String pbsCSV = seglistME.getKey();
> UUID currentPbsId = probandsetIdMap.get(pbsCSV);
> if (currentPbsId == null) {
> throw new RuntimeException("Could not find pbsId by " +
> pbsCSV);
> }
> counter += seglistME.getValue().size();
> for (Segment segment : seglistME.getValue()) {
> String segmentCSV = makeCSV(segment, currentPbsId);
> writer.write(segmentCSV.getBytes());
> }
> logger.info("bulked up to {}, maybe?", counter);
> }
> copied = writer.endCopy();
> logger.info("{}/{} segments delivered in {} ms", copied, counter,
> System.currentTimeMillis() - st);
> }
>
> Also, the stack trace always references the line of the closing brace of
> the try-with-resources and not on the call to endCopy. Because it's a
> caught exception? Or it's closing a closed writer?
>
>
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Alexander Farber 2019-01-10 13:48:15 Re: Not sure which part of the query needs optimization
Previous Message Tony Shelver 2019-01-10 12:41:37 Re: Pulling data from Postgres DB table for every 5 seconds.