diff --git a/src/bin/initdb/initdb.cpp b/src/bin/initdb/initdb.cpp index 12fb5d565..b1b11f6a5 100644 --- a/src/bin/initdb/initdb.cpp +++ b/src/bin/initdb/initdb.cpp @@ -4932,7 +4932,7 @@ int main(int argc, char* argv[]) } if (enable_dss && ss_issharedstorage) { - ss_need_mkspecialdir = (ss_enable_dorado && !ss_check_specialdir(vgdata)); + ss_need_mkspecialdir = !ss_check_specialdir(vgdata); ss_mkdirdir(ss_nodeid, pg_data, vgdata, vglog, ss_need_mkclusterdir, ss_need_mkspecialdir); } else { /* Create required subdirectories */ diff --git a/src/bin/pg_probackup/dir.cpp b/src/bin/pg_probackup/dir.cpp index 95d500f7b..44b17ecb2 100644 --- a/src/bin/pg_probackup/dir.cpp +++ b/src/bin/pg_probackup/dir.cpp @@ -1321,6 +1321,10 @@ create_data_directories(parray *dest_files, const char *data_dir, const char *ba if (ss_create_if_doublewrite(dir, instance_config.dss.vgdata, instance_config.dss.instance_id)) { continue; } + + if (ss_create_if_pg_replication(dir, instance_config.dss.vgdata, instance_config.dss.vglog)) { + continue; + } } /* tablespace_map exists */ diff --git a/src/bin/pg_probackup/pg_probackupc.h b/src/bin/pg_probackup/pg_probackupc.h index 13df3f742..19b31d02a 100644 --- a/src/bin/pg_probackup/pg_probackupc.h +++ b/src/bin/pg_probackup/pg_probackupc.h @@ -391,6 +391,7 @@ extern void parse_vgname_args(const char* args); extern bool is_ss_xlog(const char *ss_dir); extern void ss_createdir(const char *ss_dir, const char *vgdata, const char *vglog); extern bool ss_create_if_doublewrite(pgFile* dir, const char* vgdata, int instance_id); +extern bool ss_create_if_pg_replication(pgFile* dir, const char* vgdata, const char* vglog); extern char* xstrdup(const char* s); extern void set_min_recovery_point(pgFile *file, const char *fullpath, XLogRecPtr stop_backup_lsn); diff --git a/src/bin/pg_probackup/util.cpp b/src/bin/pg_probackup/util.cpp index c6bb47ddb..c7fa12452 100644 --- a/src/bin/pg_probackup/util.cpp +++ b/src/bin/pg_probackup/util.cpp @@ -594,10 +594,31 @@ ss_createdir(const char *ss_dir, const char *vgdata, const char *vglog) } } +bool +ss_create_if_pg_replication(pgFile* dir, const char* vgdata, const char* vglog) +{ + if (pg_strcasecmp(dir->rel_path, "pg_replication") == 0) { + char path[MAXPGPATH]; + errno_t rc = sprintf_s(path, sizeof(path), "%s/%s", vglog, dir->rel_path); + securec_check_ss_c(rc, "\0", "\0"); + char link_path[MAXPGPATH]; + rc = sprintf_s(link_path, sizeof(link_path), "%s/%s", vgdata, dir->rel_path); + securec_check_ss_c(rc, "\0", "\0"); + dir_create_dir(path, DIR_PERMISSION); + if (symlink(path, link_path) < 0) { + elog(ERROR, "can not link dss dir \"%s\" to dss dir \"%s\": %s", link_path, path, + strerror(errno)); + } + return true; + } else { + return false; + } +} + bool ss_create_if_doublewrite(pgFile* dir, const char* vgdata, int instance_id) { - char ss_doublewrite[MAXPGPATH];; + char ss_doublewrite[MAXPGPATH]; errno_t rc = sprintf_s(ss_doublewrite, sizeof(ss_doublewrite), "%s%d", "pg_doublewrite", instance_id); securec_check_ss_c(rc, "\0", "\0"); if (pg_strcasecmp(dir->rel_path, ss_doublewrite) == 0) {