diff --git a/src/common/backend/utils/init/miscinit.cpp b/src/common/backend/utils/init/miscinit.cpp index 190e63232..499f22c60 100644 --- a/src/common/backend/utils/init/miscinit.cpp +++ b/src/common/backend/utils/init/miscinit.cpp @@ -2150,6 +2150,8 @@ void initDssPath(char *dssdir) rc = snprintf_s(g_instance.datadir_cxt.hbaConfigFilePath, MAXPGPATH, MAXPGPATH - 1, "%s/shared_pg_hba.conf", dssdir); securec_check_ss(rc, "", ""); + + ss_initdwsubdir(dssdir); } void initDSSConf(void) diff --git a/src/common/backend/utils/misc/guc.cpp b/src/common/backend/utils/misc/guc.cpp index c638035a4..d0b3be6d9 100755 --- a/src/common/backend/utils/misc/guc.cpp +++ b/src/common/backend/utils/misc/guc.cpp @@ -12886,57 +12886,69 @@ ErrCode write_guc_file(const char* path, char** lines) static int copy_file_dss(char *scpath, char *despath) { - const int buffer_size = 16384; - char buffer[buffer_size]; - size_t need_write_size; - FILE *srcFile = fopen(scpath, "rb"); - FILE *destFile = NULL; - - if (srcFile == NULL) { - ereport(WARNING, (errmsg("could not open source file: %s:%s", scpath, TRANSLATE_ERRNO))); - return -1; - } - - if (remove(despath) != 0 && !is_file_delete(errno)) { - ereport(WARNING, (errmsg("could not remove destination file: %s:%s", despath, TRANSLATE_ERRNO))); - fclose(srcFile); - return -1; - } - - destFile = fopen(despath, "wb"); - if (destFile == NULL) { - ereport(WARNING, (errmsg("could not create destination file: %s:%s", despath, TRANSLATE_ERRNO))); - fclose(srcFile); - return -1; - } - + int fd_source, fd_target; + int res = 0; + ssize_t step_size = DSS_BYTE_AGAINST; + ssize_t read_size = DSS_BYTE_AGAINST; struct stat statbuf; - if (stat(scpath, &statbuf) == 0) { - need_write_size = statbuf.st_size; - } else { - ereport(WARNING, (errmsg("could not stat source file: %s:%s", scpath, TRANSLATE_ERRNO))); - fclose(srcFile); - fclose(destFile); - return -1; + char buffer[step_size]; + off_t offset = 0; + + if (lstat(despath, &statbuf) == 0) { + if (remove(despath) != 0) { + ereport(LOG, (errmsg("could not remove file: %s", despath))); + return -1; + } } - if ((fread(buffer, 1, buffer_size, srcFile)) <= 0) { - ereport(WARNING, (errmsg("could not read source file: %s:%s", scpath, TRANSLATE_ERRNO))); - fclose(srcFile); - fclose(destFile); + fd_source = open(scpath, O_RDONLY, 0644); + if (fd_source < 0) { + ereport(LOG, (errmsg("could not open file: %s", scpath))); + return -1; + } + fd_target = open(despath, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd_target < 0) { + ereport(LOG, (errmsg("could not open file: %s", despath))); + close(fd_source); + return -1; + } + int size = lseek(fd_source, 0, SEEK_END); + + lseek(fd_source, 0, SEEK_SET); + while (offset < size) { + if (offset + step_size > size) { + read_size = size - offset; + errno_t rc = memset_s(buffer, step_size, ' ', step_size); + securec_check(rc, "\0", "\0"); + buffer[read_size] = '\n'; + } + res = pread(fd_source, buffer, step_size, offset); + if (res != read_size && res != step_size) { + ereport(LOG, (errmsg("read %s, failed, errno: %s", scpath, strerror(errno)))); + close(fd_source); + close(fd_target); + return -1; + } + res = pwrite(fd_target, buffer, step_size, offset); + if (res != step_size) { + ereport(LOG, (errmsg("write %s, failed, errno: %s", despath, strerror(errno)))); + close(fd_source); + close(fd_target); + return -1; + } + offset += step_size; + } + + res = ftruncate(fd_target, size); + if (res != 0) { + close(fd_source); + close(fd_target); + ereport(LOG, (errmsg("truncate %s, failed, errno: %s", despath, strerror(errno)))); return -1; } - /* not use read size because of the read size of file in dss is not the same as the file size */ - if (fwrite(buffer, 1, need_write_size, destFile) <= 0 ) { - ereport(WARNING, (errmsg("write error to destination file: %s:%s", despath, TRANSLATE_ERRNO))); - fclose(srcFile); - fclose(destFile); - return -1; - } - - fclose(srcFile); - fclose(destFile); + close(fd_source); + close(fd_target); return 0; } diff --git a/src/gausskernel/storage/dss/dss_adaptor.cpp b/src/gausskernel/storage/dss/dss_adaptor.cpp index 5af10cd3e..5af7d11f1 100644 --- a/src/gausskernel/storage/dss/dss_adaptor.cpp +++ b/src/gausskernel/storage/dss/dss_adaptor.cpp @@ -103,7 +103,6 @@ int dss_device_init(const char *conn_path, bool enable_dss) SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_fseek", (void **)&device_op.dss_seek)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_ftruncate", (void **)&device_op.dss_truncate)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_fwrite", (void **)&device_op.dss_write)); - SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_fcopy", (void **)&device_op.dss_fcopy)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_pwrite", (void **)&device_op.dss_pwrite)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_dmake", (void **)&device_op.dss_create_dir)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_dopen", (void **)&device_op.dss_open_dir)); diff --git a/src/gausskernel/storage/dss/fio_dss.cpp b/src/gausskernel/storage/dss/fio_dss.cpp index 25be89a85..e64a5f1dd 100644 --- a/src/gausskernel/storage/dss/fio_dss.cpp +++ b/src/gausskernel/storage/dss/fio_dss.cpp @@ -851,11 +851,6 @@ int dss_compare_size(const char *vg_name, long long *au_size) return GS_SUCCESS; } -int dss_file_copy(const char *src_path, const char *dest_path) -{ - return g_dss_device_op.dss_fcopy(src_path, dest_path); -} - int dss_aio_prep_pwrite(void *iocb, int fd, void *buf, size_t count, long long offset) { return g_dss_device_op.dss_aio_pwrite(iocb, fd, buf, count, offset); diff --git a/src/include/storage/dss/dss_adaptor.h b/src/include/storage/dss/dss_adaptor.h index d502db4e6..e81b0ff59 100644 --- a/src/include/storage/dss/dss_adaptor.h +++ b/src/include/storage/dss/dss_adaptor.h @@ -55,7 +55,6 @@ typedef int (*dss_align_device_size)(int size); typedef int (*dss_link_device)(const char *oldpath, const char *newpath); typedef int (*dss_unlink_device)(const char *path); typedef int (*dss_device_name)(int handle, char *fname, size_t fname_size); -typedef int (*dss_fcopy_device)(const char *src_path, const char *dest_path); typedef int (*dss_read_device_link)(const char *path, char *buf, int bufsize); typedef int (*dss_stat_device)(const char *path, dss_stat_info_t item); typedef int (*dss_lstat_device)(const char *path, dss_stat_info_t item); @@ -94,7 +93,6 @@ typedef struct st_dss_device_op_t { dss_align_device_size dss_align_size; dss_device_size dss_fsize; dss_device_name dss_fname; - dss_fcopy_device dss_fcopy; dss_error_info dss_get_error; dss_open_device_dir dss_open_dir; dss_read_device_dir dss_read_dir; diff --git a/src/include/storage/dss/fio_dss.h b/src/include/storage/dss/fio_dss.h index 51c2291c7..ccea0e151 100644 --- a/src/include/storage/dss/fio_dss.h +++ b/src/include/storage/dss/fio_dss.h @@ -78,7 +78,6 @@ int dss_remove_dev(const char *name); int dss_get_addr(int handle, long long offset, char *poolname, char *imagename, char *objAddr, unsigned int *objId, unsigned long int *objOffset); int dss_compare_size(const char *vg_name, long long *au_size); -int dss_file_copy(const char *src_path, const char *dest_path); int dss_aio_prep_pwrite(void *iocb, int fd, void *buf, size_t count, long long offset); int dss_aio_prep_pread(void *iocb, int fd, void *buf, size_t count, long long offset); int dss_aio_post_pwrite(void *iocb, int fd, size_t count, long long offset);