diff -r -u -P --exclude-from=/home/postgres/cmd/diff.excludes postgresql-9.5alpha2/src/backend/postmaster/checkpointer.c postgresql-9.5alpha2-sync_file_range/src/backend/postmaster/checkpointer.c --- postgresql-9.5alpha2/src/backend/postmaster/checkpointer.c 2015-08-04 05:34:55.000000000 +0900 +++ postgresql-9.5alpha2-sync_file_range/src/backend/postmaster/checkpointer.c 2015-09-17 15:44:19.118766727 +0900 @@ -1385,3 +1385,11 @@ return FirstCall; } + +bool +AmIcheckpointer(void) +{ + if (CheckpointerShmem) + return MyProcPid == CheckpointerShmem->checkpointer_pid; + return false; +} diff -r -u -P --exclude-from=/home/postgres/cmd/diff.excludes postgresql-9.5alpha2/src/backend/storage/file/fd.c postgresql-9.5alpha2-sync_file_range/src/backend/storage/file/fd.c --- postgresql-9.5alpha2/src/backend/storage/file/fd.c 2015-08-04 05:34:55.000000000 +0900 +++ postgresql-9.5alpha2-sync_file_range/src/backend/storage/file/fd.c 2015-09-18 13:19:12.297149058 +0900 @@ -2719,3 +2719,21 @@ (void) CloseTransientFile(fd); } + +int +FileSyncFileRange(File file, off64_t offset, off64_t nbytes) +{ + int returnCode; + + Assert(FileIsValid(file)); + + DO_DB(elog(LOG, "FileSyncFileRange: %d (%s)", + file, VfdCache[file].fileName)); + + returnCode = FileAccess(file); + if (returnCode < 0) + return returnCode; + + return sync_file_range(VfdCache[file].fd, offset, nbytes, + SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE); +} diff -r -u -P --exclude-from=/home/postgres/cmd/diff.excludes postgresql-9.5alpha2/src/backend/storage/smgr/md.c postgresql-9.5alpha2-sync_file_range/src/backend/storage/smgr/md.c --- postgresql-9.5alpha2/src/backend/storage/smgr/md.c 2015-08-04 05:34:55.000000000 +0900 +++ postgresql-9.5alpha2-sync_file_range/src/backend/storage/smgr/md.c 2015-09-18 13:19:04.281934015 +0900 @@ -795,7 +795,11 @@ } if (!skipFsync && !SmgrIsTemp(reln)) + { register_dirty_segment(reln, forknum, v); + if (AmIcheckpointer()) + FileSyncFileRange(v->mdfd_vfd, seekpos, BLCKSZ); + } } /* diff -r -u -P --exclude-from=/home/postgres/cmd/diff.excludes postgresql-9.5alpha2/src/include/postmaster/bgwriter.h postgresql-9.5alpha2-sync_file_range/src/include/postmaster/bgwriter.h --- postgresql-9.5alpha2/src/include/postmaster/bgwriter.h 2015-08-04 05:34:55.000000000 +0900 +++ postgresql-9.5alpha2-sync_file_range/src/include/postmaster/bgwriter.h 2015-09-17 09:08:33.105535928 +0900 @@ -30,6 +30,7 @@ extern void RequestCheckpoint(int flags); extern void CheckpointWriteDelay(int flags, double progress); +extern bool AmIcheckpointer(void); extern bool ForwardFsyncRequest(RelFileNode rnode, ForkNumber forknum, BlockNumber segno); diff -r -u -P --exclude-from=/home/postgres/cmd/diff.excludes postgresql-9.5alpha2/src/include/storage/fd.h postgresql-9.5alpha2-sync_file_range/src/include/storage/fd.h --- postgresql-9.5alpha2/src/include/storage/fd.h 2015-08-04 05:34:55.000000000 +0900 +++ postgresql-9.5alpha2-sync_file_range/src/include/storage/fd.h 2015-09-17 20:43:57.372916888 +0900 @@ -72,6 +72,7 @@ extern int FileRead(File file, char *buffer, int amount); extern int FileWrite(File file, char *buffer, int amount); extern int FileSync(File file); +extern int FileSyncFileRange(File file, off64_t offset, off64_t nbytes); extern off_t FileSeek(File file, off_t offset, int whence); extern int FileTruncate(File file, off_t offset); extern char *FilePathName(File file);