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",
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",
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",
56 schemaName, relName, dst,
strerror(errno));
58 if (ioctl(dest_fd, FICLONE, src_fd) < 0)
60 int save_errno = errno;
64 pg_fatal(
"error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
65 schemaName, relName, src, dst,
strerror(save_errno));
82 const char *schemaName,
const char *relName)
89 if ((src_fd = open(src, O_RDONLY |
PG_BINARY, 0)) < 0)
90 pg_fatal(
"error while copying relation \"%s.%s\": could not open file \"%s\": %s",
91 schemaName, relName, src,
strerror(errno));
93 if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL |
PG_BINARY,
95 pg_fatal(
"error while copying relation \"%s.%s\": could not create file \"%s\": %s",
96 schemaName, relName, dst,
strerror(errno));
99 #define COPY_BUF_SIZE (50 * BLCKSZ)
109 pg_fatal(
"error while copying relation \"%s.%s\": could not read file \"%s\": %s",
110 schemaName, relName, src,
strerror(errno));
116 if (
write(dest_fd, buffer, nbytes) != nbytes)
121 pg_fatal(
"error while copying relation \"%s.%s\": could not write file \"%s\": %s",
122 schemaName, relName, dst,
strerror(errno));
132 if (CopyFile(src, dst,
true) == 0)
135 pg_fatal(
"error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
136 schemaName, relName, src, dst,
strerror(errno));
151 const char *schemaName,
const char *relName)
153 if (
link(src, dst) < 0)
154 pg_fatal(
"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
155 schemaName, relName, src, dst,
strerror(errno));
177 const char *schemaName,
const char *relName)
183 ssize_t totalBytesRead = 0;
184 ssize_t src_filesize;
185 int rewriteVmBytesPerPage;
192 if ((src_fd = open(fromfile, O_RDONLY |
PG_BINARY, 0)) < 0)
193 pg_fatal(
"error while copying relation \"%s.%s\": could not open file \"%s\": %s",
194 schemaName, relName, fromfile,
strerror(errno));
196 if (
fstat(src_fd, &statbuf) != 0)
197 pg_fatal(
"error while copying relation \"%s.%s\": could not stat file \"%s\": %s",
198 schemaName, relName, fromfile,
strerror(errno));
200 if ((dst_fd = open(tofile, O_RDWR | O_CREAT | O_EXCL |
PG_BINARY,
202 pg_fatal(
"error while copying relation \"%s.%s\": could not create file \"%s\": %s",
203 schemaName, relName, tofile,
strerror(errno));
206 src_filesize = statbuf.
st_size;
214 while (totalBytesRead < src_filesize)
223 if ((bytesRead =
read(src_fd, buffer.
data, BLCKSZ)) != BLCKSZ)
226 pg_fatal(
"error while copying relation \"%s.%s\": could not read file \"%s\": %s",
227 schemaName, relName, fromfile,
strerror(errno));
229 pg_fatal(
"error while copying relation \"%s.%s\": partial page found in file \"%s\"",
230 schemaName, relName, fromfile);
233 totalBytesRead += BLCKSZ;
234 old_lastblk = (totalBytesRead == src_filesize);
246 old_blkend = buffer.
data + bytesRead;
247 old_break = old_cur + rewriteVmBytesPerPage;
249 while (old_break <= old_blkend)
259 old_lastpart = old_lastblk && (old_break == old_blkend);
264 while (old_cur < old_break)
282 new_cur[0] = (char) (new_vmbits & 0xFF);
283 new_cur[1] = (char) (new_vmbits >> 8);
290 if (old_lastpart && empty)
299 if (
write(dst_fd, new_vmbuf.
data, BLCKSZ) != BLCKSZ)
304 pg_fatal(
"error while copying relation \"%s.%s\": could not write file \"%s\": %s",
305 schemaName, relName, tofile,
strerror(errno));
309 old_break += rewriteVmBytesPerPage;
327 unlink(new_link_file);
329 #if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
330 if (copyfile(existing_file, new_link_file, NULL, COPYFILE_CLONE_FORCE) < 0)
331 pg_fatal(
"could not clone file between old and new data directories: %s",
333 #elif defined(__linux__) && defined(FICLONE)
338 if ((src_fd = open(existing_file, O_RDONLY |
PG_BINARY, 0)) < 0)
339 pg_fatal(
"could not open file \"%s\": %s",
342 if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL |
PG_BINARY,
344 pg_fatal(
"could not create file \"%s\": %s",
347 if (ioctl(dest_fd, FICLONE, src_fd) < 0)
348 pg_fatal(
"could not clone file between old and new data directories: %s",
355 pg_fatal(
"file cloning not supported on this platform");
358 unlink(new_link_file);
369 unlink(new_link_file);
371 if (
link(existing_file, new_link_file) < 0)
372 pg_fatal(
"could not create hard link between old and new data directories: %s\n"
373 "In link mode the old and new data directories must be on the same file system.",
376 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)
uint32 data_checksum_version
#define BITS_PER_HEAPBLOCK
#define VISIBILITYMAP_ALL_VISIBLE
void _dosmaperr(unsigned long)
int link(const char *src, const char *dst)