Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix missing abort checks in pg_backup_directory.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 May 2016 17:18:48 +0000 (13:18 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 May 2016 17:18:48 +0000 (13:18 -0400)
Parallel restore from directory format failed to respond to control-C
in a timely manner, because there were no checkAborting() calls in the
code path that reads data from a file and sends it to the backend.
If any worker was in the midst of restoring data for a large table,
you'd just have to wait.

This fix doesn't do anything for the problem of aborting a long-running
server-side command, but at least it fixes things for data transfers.

Back-patch to 9.3 where parallel restore was introduced.

src/bin/pg_dump/pg_backup_directory.c

index 1d7b0cc66adad816b51142072c3dd115c8d2aa92..27c619054618445cbece42dc5acfd12d969a2db3 100644 (file)
@@ -406,7 +406,12 @@ _PrintFileData(ArchiveHandle *AH, char *filename)
    buflen = ZLIB_OUT_SIZE;
 
    while ((cnt = cfread(buf, buflen, cfp)))
+   {
+       /* Are we aborting? */
+       checkAborting(AH);
+
        ahwrite(buf, 1, cnt, AH);
+   }
 
    free(buf);
    if (cfclose(cfp) !=0)
@@ -543,6 +548,9 @@ _ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
 {
    lclContext *ctx = (lclContext *) AH->formatData;
 
+   /* Are we aborting? */
+   checkAborting(AH);
+
    /*
     * If there was an I/O error, we already exited in cfread(), so here we
     * exit on short reads.