mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Refactor new file permission handling
The file handling functions from fd.c were called with a diverse mix of notations for the file permissions when they were opening new files. Almost all files created by the server should have the same permissions set. So change the API so that e.g. OpenTransientFile() automatically uses the standard permissions set, and OpenTransientFilePerm() is a new function that takes an explicit permissions set for the few cases where it is needed. This also saves an unnecessary argument for call sites that are just opening an existing file. While we're reviewing these APIs, get rid of the FileName typedef and use the standard const char * for the file name and mode_t for the file mode. This makes these functions match other file handling functions and removes an unnecessary layer of mysteriousness. We can also get rid of a few casts that way. Author: David Steele <david@pgmasters.net>
This commit is contained in:
@ -1013,8 +1013,7 @@ logical_rewrite_log_mapping(RewriteState state, TransactionId xid,
|
||||
src->off = 0;
|
||||
memcpy(src->path, path, sizeof(path));
|
||||
src->vfd = PathNameOpenFile(path,
|
||||
O_CREAT | O_EXCL | O_WRONLY | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
O_CREAT | O_EXCL | O_WRONLY | PG_BINARY);
|
||||
if (src->vfd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
@ -1133,8 +1132,7 @@ heap_xlog_logical_rewrite(XLogReaderState *r)
|
||||
xlrec->mapped_xid, XLogRecGetXid(r));
|
||||
|
||||
fd = OpenTransientFile(path,
|
||||
O_CREAT | O_WRONLY | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
O_CREAT | O_WRONLY | PG_BINARY);
|
||||
if (fd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
@ -1258,7 +1256,7 @@ CheckPointLogicalRewriteHeap(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
int fd = OpenTransientFile(path, O_RDONLY | PG_BINARY, 0);
|
||||
int fd = OpenTransientFile(path, O_RDONLY | PG_BINARY);
|
||||
|
||||
/*
|
||||
* The file cannot vanish due to concurrency since this function
|
||||
|
@ -599,7 +599,7 @@ SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno)
|
||||
|
||||
SlruFileName(ctl, path, segno);
|
||||
|
||||
fd = OpenTransientFile(path, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
|
||||
fd = OpenTransientFile(path, O_RDWR | PG_BINARY);
|
||||
if (fd < 0)
|
||||
{
|
||||
/* expected: file doesn't exist */
|
||||
@ -654,7 +654,7 @@ SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno)
|
||||
* SlruPhysicalWritePage). Hence, if we are InRecovery, allow the case
|
||||
* where the file doesn't exist, and return zeroes instead.
|
||||
*/
|
||||
fd = OpenTransientFile(path, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
|
||||
fd = OpenTransientFile(path, O_RDWR | PG_BINARY);
|
||||
if (fd < 0)
|
||||
{
|
||||
if (errno != ENOENT || !InRecovery)
|
||||
@ -804,8 +804,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruFlush fdata)
|
||||
* don't use O_EXCL or O_TRUNC or anything like that.
|
||||
*/
|
||||
SlruFileName(ctl, path, segno);
|
||||
fd = OpenTransientFile(path, O_RDWR | O_CREAT | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = OpenTransientFile(path, O_RDWR | O_CREAT | PG_BINARY);
|
||||
if (fd < 0)
|
||||
{
|
||||
slru_errcause = SLRU_OPEN_FAILED;
|
||||
|
@ -307,8 +307,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI,
|
||||
unlink(tmppath);
|
||||
|
||||
/* do not use get_sync_bit() here --- want to fsync only at end of fill */
|
||||
fd = OpenTransientFile(tmppath, O_RDWR | O_CREAT | O_EXCL,
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = OpenTransientFile(tmppath, O_RDWR | O_CREAT | O_EXCL);
|
||||
if (fd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
@ -325,7 +324,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI,
|
||||
else
|
||||
TLHistoryFilePath(path, parentTLI);
|
||||
|
||||
srcfd = OpenTransientFile(path, O_RDONLY, 0);
|
||||
srcfd = OpenTransientFile(path, O_RDONLY);
|
||||
if (srcfd < 0)
|
||||
{
|
||||
if (errno != ENOENT)
|
||||
@ -459,8 +458,7 @@ writeTimeLineHistoryFile(TimeLineID tli, char *content, int size)
|
||||
unlink(tmppath);
|
||||
|
||||
/* do not use get_sync_bit() here --- want to fsync only at end of fill */
|
||||
fd = OpenTransientFile(tmppath, O_RDWR | O_CREAT | O_EXCL,
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = OpenTransientFile(tmppath, O_RDWR | O_CREAT | O_EXCL);
|
||||
if (fd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
|
@ -1195,7 +1195,7 @@ ReadTwoPhaseFile(TransactionId xid, bool give_warnings)
|
||||
|
||||
TwoPhaseFilePath(path, xid);
|
||||
|
||||
fd = OpenTransientFile(path, O_RDONLY | PG_BINARY, 0);
|
||||
fd = OpenTransientFile(path, O_RDONLY | PG_BINARY);
|
||||
if (fd < 0)
|
||||
{
|
||||
if (give_warnings)
|
||||
@ -1581,8 +1581,7 @@ RecreateTwoPhaseFile(TransactionId xid, void *content, int len)
|
||||
TwoPhaseFilePath(path, xid);
|
||||
|
||||
fd = OpenTransientFile(path,
|
||||
O_CREAT | O_TRUNC | O_WRONLY | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
O_CREAT | O_TRUNC | O_WRONLY | PG_BINARY);
|
||||
if (fd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
|
@ -3185,8 +3185,7 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
|
||||
*/
|
||||
if (*use_existent)
|
||||
{
|
||||
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method),
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
|
||||
if (fd < 0)
|
||||
{
|
||||
if (errno != ENOENT)
|
||||
@ -3211,8 +3210,7 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
|
||||
unlink(tmppath);
|
||||
|
||||
/* do not use get_sync_bit() here --- want to fsync only at end of fill */
|
||||
fd = BasicOpenFile(tmppath, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = BasicOpenFile(tmppath, O_RDWR | O_CREAT | O_EXCL | PG_BINARY);
|
||||
if (fd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
@ -3308,8 +3306,7 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
|
||||
*use_existent = false;
|
||||
|
||||
/* Now open original target segment (might not be file I just made) */
|
||||
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method),
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
|
||||
if (fd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
@ -3350,7 +3347,7 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno,
|
||||
* Open the source file
|
||||
*/
|
||||
XLogFilePath(path, srcTLI, srcsegno, wal_segment_size);
|
||||
srcfd = OpenTransientFile(path, O_RDONLY | PG_BINARY, 0);
|
||||
srcfd = OpenTransientFile(path, O_RDONLY | PG_BINARY);
|
||||
if (srcfd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
@ -3364,8 +3361,7 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno,
|
||||
unlink(tmppath);
|
||||
|
||||
/* do not use get_sync_bit() here --- want to fsync only at end of fill */
|
||||
fd = OpenTransientFile(tmppath, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = OpenTransientFile(tmppath, O_RDWR | O_CREAT | O_EXCL | PG_BINARY);
|
||||
if (fd < 0)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
@ -3543,8 +3539,7 @@ XLogFileOpen(XLogSegNo segno)
|
||||
|
||||
XLogFilePath(path, ThisTimeLineID, segno, wal_segment_size);
|
||||
|
||||
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method),
|
||||
S_IRUSR | S_IWUSR);
|
||||
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
|
||||
if (fd < 0)
|
||||
ereport(PANIC,
|
||||
(errcode_for_file_access(),
|
||||
@ -3610,7 +3605,7 @@ XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli,
|
||||
snprintf(path, MAXPGPATH, XLOGDIR "/%s", xlogfname);
|
||||
}
|
||||
|
||||
fd = BasicOpenFile(path, O_RDONLY | PG_BINARY, 0);
|
||||
fd = BasicOpenFile(path, O_RDONLY | PG_BINARY);
|
||||
if (fd >= 0)
|
||||
{
|
||||
/* Success! */
|
||||
@ -4449,8 +4444,7 @@ WriteControlFile(void)
|
||||
memcpy(buffer, ControlFile, sizeof(ControlFileData));
|
||||
|
||||
fd = BasicOpenFile(XLOG_CONTROL_FILE,
|
||||
O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
O_RDWR | O_CREAT | O_EXCL | PG_BINARY);
|
||||
if (fd < 0)
|
||||
ereport(PANIC,
|
||||
(errcode_for_file_access(),
|
||||
@ -4494,8 +4488,7 @@ ReadControlFile(void)
|
||||
* Read data...
|
||||
*/
|
||||
fd = BasicOpenFile(XLOG_CONTROL_FILE,
|
||||
O_RDWR | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
O_RDWR | PG_BINARY);
|
||||
if (fd < 0)
|
||||
ereport(PANIC,
|
||||
(errcode_for_file_access(),
|
||||
@ -4695,8 +4688,7 @@ UpdateControlFile(void)
|
||||
FIN_CRC32C(ControlFile->crc);
|
||||
|
||||
fd = BasicOpenFile(XLOG_CONTROL_FILE,
|
||||
O_RDWR | PG_BINARY,
|
||||
S_IRUSR | S_IWUSR);
|
||||
O_RDWR | PG_BINARY);
|
||||
if (fd < 0)
|
||||
ereport(PANIC,
|
||||
(errcode_for_file_access(),
|
||||
|
@ -694,7 +694,7 @@ XLogRead(char *buf, int segsize, TimeLineID tli, XLogRecPtr startptr,
|
||||
|
||||
XLogFilePath(path, tli, sendSegNo, segsize);
|
||||
|
||||
sendFile = BasicOpenFile(path, O_RDONLY | PG_BINARY, 0);
|
||||
sendFile = BasicOpenFile(path, O_RDONLY | PG_BINARY);
|
||||
|
||||
if (sendFile < 0)
|
||||
{
|
||||
|
Reference in New Issue
Block a user