14 #ifdef HAVE_COPYFILE_H
18 #include <sys/ioctl.h>
39 const char *schemaName,
const char *relName)
41 #if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
42 if (copyfile(src, dst, NULL, COPYFILE_CLONE_FORCE) < 0)
43 pg_fatal(
"error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
44 schemaName, relName, src, dst,
strerror(errno));
45 #elif defined(__linux__) && defined(FICLONE)
49 if ((src_fd = open(src, O_RDONLY |
PG_BINARY, 0)) < 0)
50 pg_fatal(
"error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n",
51 schemaName, relName, src,
strerror(errno));
53 if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL |
PG_BINARY,
55 pg_fatal(
"error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n",
56 schemaName, relName, dst,
strerror(errno));
58 if (ioctl(dest_fd, FICLONE, src_fd) < 0)
61 pg_fatal(
"error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
62 schemaName, relName, src, dst,
strerror(errno));
79 const char *schemaName,
const char *relName)
86 if ((src_fd = open(src, O_RDONLY |
PG_BINARY, 0)) < 0)
87 pg_fatal(
"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n",
88 schemaName, relName, src,
strerror(errno));
90 if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL |
PG_BINARY,
92 pg_fatal(
"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n",
93 schemaName, relName, dst,
strerror(errno));
96 #define COPY_BUF_SIZE (50 * BLCKSZ)
106 pg_fatal(
"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n",
107 schemaName, relName, src,
strerror(errno));
113 if (
write(dest_fd, buffer, nbytes) != nbytes)
118 pg_fatal(
"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n",
119 schemaName, relName, dst,
strerror(errno));
129 if (CopyFile(src, dst,
true) == 0)
132 pg_fatal(
"error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
133 schemaName, relName, src, dst,
strerror(errno));
148 const char *schemaName,
const char *relName)
150 if (
link(src, dst) < 0)
151 pg_fatal(
"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
152 schemaName, relName, src, dst,
strerror(errno));
174 const char *schemaName,
const char *relName)
180 ssize_t totalBytesRead = 0;
181 ssize_t src_filesize;
182 int rewriteVmBytesPerPage;
189 if ((src_fd = open(fromfile, O_RDONLY |
PG_BINARY, 0)) < 0)
190 pg_fatal(
"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n",
191 schemaName, relName, fromfile,
strerror(errno));
193 if (
fstat(src_fd, &statbuf) != 0)
194 pg_fatal(
"error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n",
195 schemaName, relName, fromfile,
strerror(errno));
197 if ((dst_fd = open(tofile, O_RDWR | O_CREAT | O_EXCL |
PG_BINARY,
199 pg_fatal(
"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n",
200 schemaName, relName, tofile,
strerror(errno));
203 src_filesize = statbuf.
st_size;
211 while (totalBytesRead < src_filesize)
220 if ((bytesRead =
read(src_fd, buffer.
data, BLCKSZ)) != BLCKSZ)
223 pg_fatal(
"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n",
224 schemaName, relName, fromfile,
strerror(errno));
226 pg_fatal(
"error while copying relation \"%s.%s\": partial page found in file \"%s\"\n",
227 schemaName, relName, fromfile);
230 totalBytesRead += BLCKSZ;
231 old_lastblk = (totalBytesRead == src_filesize);
243 old_blkend = buffer.
data + bytesRead;
244 old_break = old_cur + rewriteVmBytesPerPage;
246 while (old_break <= old_blkend)
256 old_lastpart = old_lastblk && (old_break == old_blkend);
261 while (old_cur < old_break)
279 new_cur[0] = (char) (new_vmbits & 0xFF);
280 new_cur[1] = (char) (new_vmbits >> 8);
287 if (old_lastpart && empty)
296 if (
write(dst_fd, new_vmbuf.
data, BLCKSZ) != BLCKSZ)
301 pg_fatal(
"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n",
302 schemaName, relName, tofile,
strerror(errno));
306 old_break += rewriteVmBytesPerPage;
324 unlink(new_link_file);
326 #if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
327 if (copyfile(existing_file, new_link_file, NULL, COPYFILE_CLONE_FORCE) < 0)
328 pg_fatal(
"could not clone file between old and new data directories: %s\n",
330 #elif defined(__linux__) && defined(FICLONE)
335 if ((src_fd = open(existing_file, O_RDONLY |
PG_BINARY, 0)) < 0)
336 pg_fatal(
"could not open file \"%s\": %s\n",
339 if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL |
PG_BINARY,
341 pg_fatal(
"could not create file \"%s\": %s\n",
344 if (ioctl(dest_fd, FICLONE, src_fd) < 0)
345 pg_fatal(
"could not clone file between old and new data directories: %s\n",
352 pg_fatal(
"file cloning not supported on this platform\n");
355 unlink(new_link_file);
366 unlink(new_link_file);
368 if (
link(existing_file, new_link_file) < 0)
369 pg_fatal(
"could not create hard link between old and new data directories: %s\n"
370 "In link mode the old and new data directories must be on the same file system.\n",
373 unlink(new_link_file);
PageHeaderData * PageHeader
#define SizeOfPageHeaderData
uint16 pg_checksum_page(char *page, BlockNumber blkno)
void * pg_malloc(size_t size)
void linkFile(const char *src, const char *dst, const char *schemaName, const char *relName)
void check_file_clone(void)
void rewriteVisibilityMap(const char *fromfile, const char *tofile, const char *schemaName, const char *relName)
void cloneFile(const char *src, const char *dst, const char *schemaName, const char *relName)
void check_hard_link(void)
void copyFile(const char *src, const char *dst, const char *schemaName, const char *relName)
int link(const char *src, const char *dst)
bool data_checksum_version
#define BITS_PER_HEAPBLOCK
#define VISIBILITYMAP_ALL_VISIBLE
void _dosmaperr(unsigned long)