diff --git a/src/bin/pg_probackup/pg_probackup.cpp b/src/bin/pg_probackup/pg_probackup.cpp index 64da319438c09ebd382f283b6bc112bea9adcad9..2d53f5640297559982c765abae4a3df7aaf5130b 100644 --- a/src/bin/pg_probackup/pg_probackup.cpp +++ b/src/bin/pg_probackup/pg_probackup.cpp @@ -953,12 +953,13 @@ static void dss_init(void) parse_vgname_args(instance_config.dss.vgname); /* Check dss connect */ - if (!dss_exist_dir(instance_config.dss.vgdata)) { + struct stat st; + if (stat(instance_config.dss.vgdata, &st) != 0 || !S_ISDIR(st.st_mode)) { elog(ERROR, "Could not connect dssserver, vgdata: \"%s\", socketpath: \"%s\", check and retry later.", instance_config.dss.vgdata, instance_config.dss.socketpath); } - if (strlen(instance_config.dss.vglog) && !dss_exist_dir(instance_config.dss.vglog)) { + if (strlen(instance_config.dss.vglog) && (stat(instance_config.dss.vglog, &st) != 0 || !S_ISDIR(st.st_mode))) { elog(ERROR, "Could not connect dssserver, vglog: \"%s\", socketpath: \"%s\", check and retry later.", instance_config.dss.vglog, instance_config.dss.socketpath); } diff --git a/src/bin/pg_resetxlog/pg_resetxlog.cpp b/src/bin/pg_resetxlog/pg_resetxlog.cpp index 9b7d27fa2b025ed393688328e036ffa7f842df44..41ff527c4a201d532e03d0de1ef5a5a550bf51f6 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.cpp +++ b/src/bin/pg_resetxlog/pg_resetxlog.cpp @@ -490,7 +490,8 @@ static void SetGlobalDssParam(void) securec_check_c(rc, "\0", "\0"); XLogSegmentSize = DSS_XLOG_SEG_SIZE; /* Check dss connect */ - if (!dss_exist_dir(g_datadir.dss_data)) { + struct stat st; + if (stat(g_datadir.dss_data, &st) != 0 || !S_ISDIR(st.st_mode)) { fprintf(stderr, _("Could not connect dssserver, vgname: \"%s\", socketpath: \"%s\", \n" "please check that whether the dssserver is manually started and retry later.\n"), dss.vgname, dss.socketpath); diff --git a/src/common/backend/utils/cache/relmapper.cpp b/src/common/backend/utils/cache/relmapper.cpp index 4fe12d60a3c92a00e9b50ee95f443ab601dfe853..594ca880115662818f5f6e03fbceba36de9135c8 100644 --- a/src/common/backend/utils/cache/relmapper.cpp +++ b/src/common/backend/utils/cache/relmapper.cpp @@ -493,7 +493,8 @@ void RelationMapFinishBootstrap(void) g_instance.attr.attr_storage.dss_attr.ss_dss_vg_name, RELMAPPER_FILENAME); securec_check_ss_c(rc, "\0", "\0"); - if (dss_exist_file(map_file_name)) { + struct stat st; + if (stat(map_file_name, &st) == 0 && S_ISREG(st.st_mode)) { return; } } diff --git a/src/common/backend/utils/init/miscinit.cpp b/src/common/backend/utils/init/miscinit.cpp index b8e974640cde1b75ead6521b0d43c164e35f1c0b..329706f92cbc89fb8890d2deb94be52c1cdded71 100644 --- a/src/common/backend/utils/init/miscinit.cpp +++ b/src/common/backend/utils/init/miscinit.cpp @@ -2160,7 +2160,8 @@ void initDSSConf(void) } // check whether dss connect is successful. - if (!dss_exist_dir(g_instance.attr.attr_storage.dss_attr.ss_dss_vg_name)) { + struct stat st; + if (stat(g_instance.attr.attr_storage.dss_attr.ss_dss_vg_name, &st) != 0 || !S_ISDIR(st.st_mode)) { ereport(FATAL, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("Could not connect dssserver, vgname: \"%s\", socketpath: \"%s\"", g_instance.attr.attr_storage.dss_attr.ss_dss_vg_name, diff --git a/src/gausskernel/ddes/adapter/ss_dms_recovery.cpp b/src/gausskernel/ddes/adapter/ss_dms_recovery.cpp index 48dd3646b073fc2b73308563d69eb981e29c315b..b8a5a2c6292fb0335cdb1f1336d23bfce8652a16 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_recovery.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_recovery.cpp @@ -167,7 +167,8 @@ void SSInitReformerControlPages(void) /* * If already exists control file, reformer page must have been initialized */ - if (dss_exist_file(XLOG_CONTROL_FILE)) { + struct stat st; + if (stat(XLOG_CONTROL_FILE, &st) == 0 && S_ISREG(st.st_mode)) { SSReadControlFile(REFORM_CTRL_PAGE); if (g_instance.dms_cxt.SSReformerControl.list_stable != 0 || g_instance.dms_cxt.SSReformerControl.primaryInstId == SS_MY_INST_ID) { @@ -187,7 +188,7 @@ void SSInitReformerControlPages(void) * Initialize list_stable and primaryInstId * First node to initdb is chosen as primary for now, and for first-time cluster startup. */ - Assert(!dss_exist_file(XLOG_CONTROL_FILE)); + Assert(stat(XLOG_CONTROL_FILE, &st) != 0 || !S_ISREG(st.st_mode)); g_instance.dms_cxt.SSReformerControl.list_stable = 0; g_instance.dms_cxt.SSReformerControl.primaryInstId = SS_MY_INST_ID; g_instance.dms_cxt.SSReformerControl.recoveryInstId = INVALID_INSTANCEID; diff --git a/src/gausskernel/storage/dss/dss_adaptor.cpp b/src/gausskernel/storage/dss/dss_adaptor.cpp index 6ca556a17d1eda3bca46fc03530919053e3a1c82..0b1ce5c6712e59af9eba9517893d53609343e5fa 100644 --- a/src/gausskernel/storage/dss/dss_adaptor.cpp +++ b/src/gausskernel/storage/dss/dss_adaptor.cpp @@ -104,9 +104,7 @@ int dss_device_init(const char *conn_path, bool enable_dss) 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_pwrite", (void **)&device_op.dss_pwrite)); - SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_fexist", (void **)&device_op.dss_exist)); 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_dexist", (void **)&device_op.dss_exist_dir)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_dopen", (void **)&device_op.dss_open_dir)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_dread", (void **)&device_op.dss_read_dir)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_dclose", (void **)&device_op.dss_close_dir)); @@ -119,7 +117,6 @@ int dss_device_init(const char *conn_path, bool enable_dss) SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_get_error", (void **)&device_op.dss_get_error)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_symlink", (void **)&device_op.dss_link)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_unlink", (void **)&device_op.dss_unlink)); - SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_islink", (void **)&device_op.dss_exist_link)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_readlink", (void **)&device_op.dss_read_link)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_stat", (void **)&device_op.dss_stat)); SS_RETURN_IFERR(dss_load_symbol(device_op.handle, "dss_lstat", (void **)&device_op.dss_lstat)); diff --git a/src/gausskernel/storage/dss/fio_dss.cpp b/src/gausskernel/storage/dss/fio_dss.cpp index ae7673ccd8161198d5883c8048addb13d5c2aceb..3feac456c8a418fb3dac2be694c9cec6348da8a3 100644 --- a/src/gausskernel/storage/dss/fio_dss.cpp +++ b/src/gausskernel/storage/dss/fio_dss.cpp @@ -93,15 +93,6 @@ void dss_set_errno(int *errcode) } } -bool dss_exist_file(const char *file_name) -{ - bool result = false; - if (g_dss_device_op.dss_exist(file_name, &result) != DSS_SUCCESS) { - dss_set_errno(NULL); - return false; - } - return result; -} int dss_access_file(const char *file_name, int mode) { @@ -118,16 +109,6 @@ int dss_create_dir(const char *name, mode_t mode) return GS_SUCCESS; } -bool dss_exist_dir(const char *name) -{ - bool result = false; - if (g_dss_device_op.dss_exist_dir(name, &result) != DSS_SUCCESS) { - dss_set_errno(NULL); - return false; - } - return result; -} - int dss_open_dir(const char *name, DIR **dir_handle) { DSS_DIR *dss_dir = NULL; @@ -216,9 +197,10 @@ int dss_remove_file(const char *name) int dss_open_file(const char *name, int flags, mode_t mode, int *handle) { - if ((flags & O_CREAT) != 0 && !dss_exist_file(name)) { + struct stat st; + if ((flags & O_CREAT) != 0 && dss_stat_file(name, &st) != GS_SUCCESS) { // file not exists, create it first. - if (g_dss_device_op.dss_create(name, flags) != DSS_SUCCESS) { + if (errno == ERR_DSS_FILE_NOT_EXIST && g_dss_device_op.dss_create(name, flags) != DSS_SUCCESS) { dss_set_errno(NULL); return GS_ERROR; } @@ -508,16 +490,6 @@ int dss_unlink_target(const char *name) return GS_SUCCESS; } -bool dss_exist_link(const char *name) -{ - bool result = false; - if (g_dss_device_op.dss_exist_link(name, &result) != DSS_SUCCESS) { - dss_set_errno(NULL); - return false; - } - return result; -} - ssize_t dss_read_link(const char *path, char *buf, size_t buf_size) { ssize_t result = (ssize_t)g_dss_device_op.dss_read_link(path, buf, buf_size); @@ -696,9 +668,11 @@ int dss_set_server_status_wrapper() int dss_remove_dev(const char *name) { - if (dss_exist_file(name)) { + struct stat st; + int ret = lstat(name, &st); + if (ret == 0 && S_ISREG(st.st_mode)) { return dss_remove_file(name); - } else if (dss_exist_link(name)) { + } else if (ret == 0 && S_ISLNK(st.st_mode)) { return dss_unlink_target(name); } else { return GS_SUCCESS; diff --git a/src/gausskernel/storage/replication/slot.cpp b/src/gausskernel/storage/replication/slot.cpp index d3d31edcd5f32a9c3829cce1712c214ecf8c916f..c26f39ceb6152af3a62d0d21ab6bacfe3c56e886 100644 --- a/src/gausskernel/storage/replication/slot.cpp +++ b/src/gausskernel/storage/replication/slot.cpp @@ -2635,7 +2635,8 @@ static bool CheckExistReplslotPath(char *path) errno_t rc = strcat_s(path_for_check, MAXPGPATH, suffix); securec_check_ss(rc, "\0", "\0"); } - if (dss_exist_dir(path_for_check)) { + struct stat st; + if (stat(path_for_check, &st) == 0 && S_ISDIR(st.st_mode)) { return true; } diff --git a/src/gausskernel/storage/replication/ss_cluster_replication.cpp b/src/gausskernel/storage/replication/ss_cluster_replication.cpp index 3283018b92332a7488cf8ae33eeb7d075f7659d3..ca1f33cefcf38be33b37369115526b4f0f2a092d 100644 --- a/src/gausskernel/storage/replication/ss_cluster_replication.cpp +++ b/src/gausskernel/storage/replication/ss_cluster_replication.cpp @@ -30,7 +30,8 @@ void WriteSSDoradoCtlInfoFile() { - Assert(dss_exist_file(SS_DORADO_CTRL_FILE)); + struct stat st; + Assert(stat(SS_DORADO_CTRL_FILE, &st) == 0 && S_ISREG(st.st_mode)); Assert(g_instance.xlog_cxt.ssReplicationXLogCtl != NULL); ShareStorageXLogCtl *ctlInfo = g_instance.xlog_cxt.ssReplicationXLogCtl; errno_t errorno = EOK; @@ -65,7 +66,8 @@ void WriteSSDoradoCtlInfoFile() void ReadSSDoradoCtlInfoFile() { - Assert(dss_exist_file(SS_DORADO_CTRL_FILE)); + struct stat st; + Assert(stat(SS_DORADO_CTRL_FILE, &st) == 0 && S_ISREG(st.st_mode)); Assert(g_instance.xlog_cxt.ssReplicationXLogCtl != NULL); ShareStorageXLogCtl *ctlInfo = g_instance.xlog_cxt.ssReplicationXLogCtl; errno_t errorno = EOK; @@ -105,7 +107,8 @@ void ReadSSDoradoCtlInfoFile() void InitSSDoradoCtlInfoFile() { - if (dss_exist_file(SS_DORADO_CTRL_FILE)) { + struct stat st; + if (stat(SS_DORADO_CTRL_FILE, &st) == 0 && S_ISREG(st.st_mode)) { ReadSSDoradoCtlInfoFile(); ereport(LOG, (errcode_for_file_access(), errmsg("[InitSSDoradoCtlInfoFile] Dorado ctl info file already exists."))); return; @@ -117,7 +120,7 @@ void InitSSDoradoCtlInfoFile() int fd = -1; char buffer[SS_DORADO_CTL_INFO_SIZE] __attribute__((__aligned__(ALIGNOF_BUFFER))); /* need to be aligned */ errno_t errorno = EOK; - Assert(!dss_exist_file(SS_DORADO_CTRL_FILE)); + Assert(stat(SS_DORADO_CTRL_FILE, &st) !=0 || !S_ISREG(st.st_mode)); /* create SS_DORADO_CTRL_FILE first time */ fd = BasicOpenFile(SS_DORADO_CTRL_FILE, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, S_IRUSR | S_IWUSR); diff --git a/src/include/storage/dss/dss_adaptor.h b/src/include/storage/dss/dss_adaptor.h index d8bac490252756f24a16030cab6eaa33e883d1d9..c46b3dbe605acde3b3bc4331081beb8a56ca8022 100644 --- a/src/include/storage/dss/dss_adaptor.h +++ b/src/include/storage/dss/dss_adaptor.h @@ -44,9 +44,7 @@ typedef int (*dss_trucate_device)(int handle, long keep_size); typedef int (*dss_create_device)(const char *name, int flags); typedef int (*dss_remove_device)(const char *name); typedef int (*dss_close_device)(int handle); -typedef int (*dss_exist_device)(const char *name, bool *result); typedef int (*dss_create_device_dir)(const char *name); -typedef int (*dss_exist_device_dir)(const char *name, bool *result); typedef dss_dir_handle (*dss_open_device_dir)(const char *name); typedef int (*dss_read_device_dir)(dss_dir_handle dir, dss_dirent_t *item, dss_dir_item_t *result); typedef int (*dss_close_device_dir)(dss_dir_handle dir); @@ -56,7 +54,6 @@ typedef int (*dss_check_device_size)(int size); 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_exist_device_link)(const char *path, bool *result); typedef int (*dss_device_name)(int handle, char *fname, size_t fname_size); 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); @@ -88,9 +85,7 @@ typedef struct st_dss_device_op_t { dss_seek_device dss_seek; dss_trucate_device dss_truncate; dss_close_device dss_close; - dss_exist_device dss_exist; dss_create_device_dir dss_create_dir; - dss_exist_device_dir dss_exist_dir; dss_rename_device dss_rename; dss_check_device_size dss_check_size; dss_align_device_size dss_align_size; @@ -103,7 +98,6 @@ typedef struct st_dss_device_op_t { dss_remove_device_dir dss_remove_dir; dss_link_device dss_link; dss_unlink_device dss_unlink; - dss_exist_device_link dss_exist_link; dss_read_device_link dss_read_link; dss_stat_device dss_stat; dss_lstat_device dss_lstat; diff --git a/src/include/storage/dss/fio_dss.h b/src/include/storage/dss/fio_dss.h index 585047dfdf0755daa6337bf45f72b174091bba85..0dd0e4c63deb38aaa5278fb99f38778e8273cb9f 100644 --- a/src/include/storage/dss/fio_dss.h +++ b/src/include/storage/dss/fio_dss.h @@ -34,10 +34,8 @@ void dss_device_register(dss_device_op_t *dss_device_op, bool enable_dss); void dss_set_errno(int *errcode); -bool dss_exist_file(const char *file_name); int dss_access_file(const char *file_name, int mode); int dss_create_dir(const char *name, mode_t mode); -bool dss_exist_dir(const char *name); int dss_open_dir(const char *name, DIR **dir_handle); int dss_read_dir(DIR *dir_handle, struct dirent **result); int dss_close_dir(DIR *dir_handle); @@ -66,7 +64,6 @@ off_t dss_get_file_size(const char *fname); int dss_fallocate_file(int handle, int mode, off_t offset, off_t len); int dss_link(const char *src, const char *dst); int dss_unlink_target(const char *name); -bool dss_exist_link(const char *name); ssize_t dss_read_link(const char *path, char *buf, size_t buf_size); int dss_setvbuf(FILE *stream, char *buf, int mode, size_t size); int dss_feof(FILE *stream); diff --git a/src/include/storage/file/fio_device.h b/src/include/storage/file/fio_device.h index 105fbfb5dd8a08527501e524a465a91904f9e02e..b19048803937e4b54ae2a979348df5e32e4db7f3 100644 --- a/src/include/storage/file/fio_device.h +++ b/src/include/storage/file/fio_device.h @@ -166,10 +166,10 @@ static inline int fallocate_dev(int fd, int mode, off_t offset, off_t len) static inline int access_dev(const char *pathname, int mode) { if (is_dss_file(pathname)) { - if (!dss_exist_file(pathname) && !dss_exist_dir(pathname)) { + if (dss_access_file(pathname, mode) != GS_SUCCESS) { return -1; } - return dss_access_file(pathname, mode); + return 0; } else { return access(pathname, mode); } @@ -215,7 +215,8 @@ static inline int symlink_dev(const char *target, const char *linkpath) static inline ssize_t readlink_dev(const char *pathname, char *buf, size_t bufsiz) { if (is_dss_file(pathname)) { - if (!dss_exist_link(pathname)) { + struct stat st; + if (dss_lstat_file(pathname, &st) != GS_SUCCESS || !S_ISLNK(st.st_mode)) { return -1; } @@ -249,11 +250,13 @@ static inline int unlink_dev(const char *pathname) static inline int lstat_dev(const char * pathname, struct stat * statbuf) { if (is_dss_file(pathname)) { - if (!dss_exist_file(pathname) && !dss_exist_dir(pathname)) { - errno = ENOENT; + if (dss_lstat_file(pathname, statbuf) != GS_SUCCESS) { + if (errno == ERR_DSS_FILE_NOT_EXIST) { + errno = ENOENT; + } return -1; } - return dss_lstat_file(pathname, statbuf); + return GS_SUCCESS; } else { return lstat(pathname, statbuf); } @@ -262,11 +265,13 @@ static inline int lstat_dev(const char * pathname, struct stat * statbuf) static inline int stat_dev(const char *pathname, struct stat *statbuf) { if (is_dss_file(pathname)) { - if (!dss_exist_file(pathname) && !dss_exist_dir(pathname)) { - errno = ENOENT; + if (dss_stat_file(pathname, statbuf) != GS_SUCCESS) { + if (errno == ERR_DSS_FILE_NOT_EXIST) { + errno = ENOENT; + } return -1; } - return dss_stat_file(pathname, statbuf); + return GS_SUCCESS; } else { return stat(pathname, statbuf); }