Commit 57faaf37 authored by Thomas Munro's avatar Thomas Munro

Use truncate(2) where appropriate.

When truncating files by name, use truncate(2).  Windows hasn't got it,
so keep our previous coding based on ftruncate(2) as a fallback.

Discussion: https://postgr.es/m/16663-fe97ccf9932fc800%40postgresql.org
parent 9f35f943
......@@ -622,6 +622,33 @@ pg_flush_data(int fd, off_t offset, off_t nbytes)
#endif
}
/*
* Truncate a file to a given length by name.
*/
int
pg_truncate(const char *path, off_t length)
{
#ifdef WIN32
int save_errno;
int ret;
int fd;
fd = OpenTransientFile(path, O_RDWR | PG_BINARY);
if (fd >= 0)
{
ret = ftruncate(fd, 0);
save_errno = errno;
CloseTransientFile(fd);
errno = save_errno;
}
else
ret = -1;
return ret;
#else
return truncate(path, length);
#endif
}
/*
* fsync_fname -- fsync a file or directory, handling errors properly
......
......@@ -294,19 +294,8 @@ do_truncate(const char *path)
{
int save_errno;
int ret;
int fd;
/* truncate(2) would be easier here, but Windows hasn't got it */
fd = OpenTransientFile(path, O_RDWR | PG_BINARY);
if (fd >= 0)
{
ret = ftruncate(fd, 0);
save_errno = errno;
CloseTransientFile(fd);
errno = save_errno;
}
else
ret = -1;
ret = pg_truncate(path, 0);
/* Log a warning here to avoid repetition in callers. */
if (ret < 0 && errno != ENOENT)
......
......@@ -153,6 +153,7 @@ extern int pg_fsync_no_writethrough(int fd);
extern int pg_fsync_writethrough(int fd);
extern int pg_fdatasync(int fd);
extern void pg_flush_data(int fd, off_t offset, off_t amount);
extern int pg_truncate(const char *path, off_t length);
extern void fsync_fname(const char *fname, bool isdir);
extern int fsync_fname_ext(const char *fname, bool isdir, bool ignore_perm, int elevel);
extern int durable_rename(const char *oldfile, const char *newfile, int loglevel);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment