Fix a couple of bugs in pg_recvlogical output to stdout.
Don't close stdout on SIGHUP. Also, when a SIGHUP is received, close the file immediately, rather than only after receiving some more data from the server. Rename a variable, to avoid mentally dealing with double negatives (not unsynced means synced).
This commit is contained in:
parent
8f9b9590d7
commit
00c26b6a60
@ -51,7 +51,7 @@ static int outfd = -1;
|
|||||||
static volatile sig_atomic_t time_to_abort = false;
|
static volatile sig_atomic_t time_to_abort = false;
|
||||||
static volatile sig_atomic_t output_reopen = false;
|
static volatile sig_atomic_t output_reopen = false;
|
||||||
static int64 output_last_fsync = -1;
|
static int64 output_last_fsync = -1;
|
||||||
static bool output_unsynced = false;
|
static bool output_needs_fsync = false;
|
||||||
static XLogRecPtr output_written_lsn = InvalidXLogRecPtr;
|
static XLogRecPtr output_written_lsn = InvalidXLogRecPtr;
|
||||||
static XLogRecPtr output_fsync_lsn = InvalidXLogRecPtr;
|
static XLogRecPtr output_fsync_lsn = InvalidXLogRecPtr;
|
||||||
|
|
||||||
@ -173,10 +173,10 @@ OutputFsync(int64 now)
|
|||||||
if (fsync_interval <= 0)
|
if (fsync_interval <= 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!output_unsynced)
|
if (!output_needs_fsync)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
output_unsynced = false;
|
output_needs_fsync = false;
|
||||||
|
|
||||||
/* Accept EINVAL, in case output is writing to a pipe or similar. */
|
/* Accept EINVAL, in case output is writing to a pipe or similar. */
|
||||||
if (fsync(outfd) != 0 && errno != EINVAL)
|
if (fsync(outfd) != 0 && errno != EINVAL)
|
||||||
@ -304,6 +304,17 @@ StreamLog(void)
|
|||||||
last_status = now;
|
last_status = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* got SIGHUP, close output file */
|
||||||
|
if (outfd != -1 && output_reopen && strcmp(outfile, "-") != 0)
|
||||||
|
{
|
||||||
|
now = feGetCurrentTimestamp();
|
||||||
|
if (!OutputFsync(now))
|
||||||
|
goto error;
|
||||||
|
close(outfd);
|
||||||
|
outfd = -1;
|
||||||
|
}
|
||||||
|
output_reopen = false;
|
||||||
|
|
||||||
r = PQgetCopyData(conn, ©buf, 1);
|
r = PQgetCopyData(conn, ©buf, 1);
|
||||||
if (r == 0)
|
if (r == 0)
|
||||||
{
|
{
|
||||||
@ -327,7 +338,7 @@ StreamLog(void)
|
|||||||
((int64) 1000);
|
((int64) 1000);
|
||||||
|
|
||||||
/* Compute when we need to wakeup to fsync the output file. */
|
/* Compute when we need to wakeup to fsync the output file. */
|
||||||
if (fsync_interval > 0 && output_unsynced)
|
if (fsync_interval > 0 && output_needs_fsync)
|
||||||
fsync_target = output_last_fsync + (fsync_interval - 1) *
|
fsync_target = output_last_fsync + (fsync_interval - 1) *
|
||||||
((int64) 1000);
|
((int64) 1000);
|
||||||
|
|
||||||
@ -468,26 +479,12 @@ StreamLog(void)
|
|||||||
output_written_lsn = Max(temp, output_written_lsn);
|
output_written_lsn = Max(temp, output_written_lsn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* redirect output to stdout */
|
/* open the output file, if not open yet */
|
||||||
if (outfd == -1 && strcmp(outfile, "-") == 0)
|
|
||||||
{
|
|
||||||
outfd = fileno(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* got SIGHUP, close output file */
|
|
||||||
if (outfd != -1 && output_reopen)
|
|
||||||
{
|
|
||||||
now = feGetCurrentTimestamp();
|
|
||||||
if (!OutputFsync(now))
|
|
||||||
goto error;
|
|
||||||
close(outfd);
|
|
||||||
outfd = -1;
|
|
||||||
output_reopen = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outfd == -1)
|
if (outfd == -1)
|
||||||
{
|
{
|
||||||
|
if (strcmp(outfile, "-") == 0)
|
||||||
|
outfd = fileno(stdout);
|
||||||
|
else
|
||||||
outfd = open(outfile, O_CREAT | O_APPEND | O_WRONLY | PG_BINARY,
|
outfd = open(outfile, O_CREAT | O_APPEND | O_WRONLY | PG_BINARY,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR);
|
||||||
if (outfd == -1)
|
if (outfd == -1)
|
||||||
@ -503,7 +500,7 @@ StreamLog(void)
|
|||||||
bytes_written = 0;
|
bytes_written = 0;
|
||||||
|
|
||||||
/* signal that a fsync is needed */
|
/* signal that a fsync is needed */
|
||||||
output_unsynced = true;
|
output_needs_fsync = true;
|
||||||
|
|
||||||
while (bytes_left)
|
while (bytes_left)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user