mirror of
https://github.com/postgres/postgres.git
synced 2025-11-15 03:41:20 +03:00
PostgreSQL's Windows port has never been able to handle files larger than 2GB due to the use of off_t for file offsets, only 32-bit on Windows. This causes signed integer overflow at exactly 2^31 bytes when trying to handle files larger than 2GB, for the routines touched by this commit. Note that large files are forbidden by ./configure (3c6248a828) and meson (recent change, see79cd66f28c). This restriction also exists in v16 and older versions for the now-dead MSVC scripts. The code base already defines pgoff_t as __int64 (64-bit) on Windows for this purpose, and some function declarations in headers use it, but many internals still rely on off_t. This commit switches more routines to use pgoff_t, offering more portability, for areas mainly related to file extensions and storage. These are not critical for WAL segments yet, which have currently a maximum size allowed of 1GB (well, this opens the door at allowing a larger size for them). This matters more for segment files if we want to lift the large file restriction in ./configure and meson in the future, which would make sense to remove once/if all traces of off_t are gone from the tree. This can additionally matter for out-of-core code that may want files larger than 2GB in places where off_t is four bytes in size. Note that off_t is still used in other parts of the tree like buffile.c, WAL sender/receiver, base backup, pg_combinebackup, etc. These other code paths can be addressed separately, and their update will be required if we want to remove the large file restriction in the future. This commit is a good first cut in itself towards more portability, hopefully. On Unix-like systems, pgoff_t is defined as off_t, so this change only affects Windows behavior. Author: Bryan Green <dbryan.green@gmail.com> Reviewed-by: Thomas Munro <thomas.munro@gmail.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/0f238ff4-c442-42f5-adb8-01b762c94ca1@gmail.com
67 lines
1.8 KiB
C
67 lines
1.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* Assorted utility functions to work on files.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/common/file_utils.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef FILE_UTILS_H
|
|
#define FILE_UTILS_H
|
|
|
|
#include <dirent.h>
|
|
|
|
typedef enum PGFileType
|
|
{
|
|
PGFILETYPE_ERROR,
|
|
PGFILETYPE_UNKNOWN,
|
|
PGFILETYPE_REG,
|
|
PGFILETYPE_DIR,
|
|
PGFILETYPE_LNK,
|
|
} PGFileType;
|
|
|
|
typedef enum DataDirSyncMethod
|
|
{
|
|
DATA_DIR_SYNC_METHOD_FSYNC,
|
|
DATA_DIR_SYNC_METHOD_SYNCFS,
|
|
} DataDirSyncMethod;
|
|
|
|
struct iovec; /* avoid including port/pg_iovec.h here */
|
|
|
|
#ifdef FRONTEND
|
|
extern int pre_sync_fname(const char *fname, bool isdir);
|
|
extern int fsync_fname(const char *fname, bool isdir);
|
|
extern void sync_pgdata(const char *pg_data, int serverVersion,
|
|
DataDirSyncMethod sync_method, bool sync_data_files);
|
|
extern void sync_dir_recurse(const char *dir, DataDirSyncMethod sync_method);
|
|
extern int durable_rename(const char *oldfile, const char *newfile);
|
|
extern int fsync_parent_path(const char *fname);
|
|
#endif
|
|
|
|
extern PGFileType get_dirent_type(const char *path,
|
|
const struct dirent *de,
|
|
bool look_through_symlinks,
|
|
int elevel);
|
|
|
|
extern int compute_remaining_iovec(struct iovec *destination,
|
|
const struct iovec *source,
|
|
int iovcnt,
|
|
size_t transferred);
|
|
|
|
extern ssize_t pg_pwritev_with_retry(int fd,
|
|
const struct iovec *iov,
|
|
int iovcnt,
|
|
pgoff_t offset);
|
|
|
|
extern ssize_t pg_pwrite_zeros(int fd, size_t size, pgoff_t offset);
|
|
|
|
/* Filename components */
|
|
#define PG_TEMP_FILES_DIR "pgsql_tmp"
|
|
#define PG_TEMP_FILE_PREFIX "pgsql_tmp"
|
|
|
|
#endif /* FILE_UTILS_H */
|