diff --git a/src/bin/pg_probackup/dir.cpp b/src/bin/pg_probackup/dir.cpp index fb4a766b8b98c8fe261542a32f96f98d329a7c78..95d500f7ba60b44b5e1d95e1f9ab23d84bfcea2d 100644 --- a/src/bin/pg_probackup/dir.cpp +++ b/src/bin/pg_probackup/dir.cpp @@ -1312,10 +1312,15 @@ create_data_directories(parray *dest_files, const char *data_dir, const char *ba if (dir->external_dir_num != 0) continue; - if (is_dss_type(dir->type) && is_ss_xlog(dir->rel_path)) { - ss_createdir(dir->rel_path, instance_config.dss.vgdata, - instance_config.dss.vglog); - continue; + if (is_dss_type(dir->type)) { + if (is_ss_xlog(dir->rel_path)) { + ss_createdir(dir->rel_path, instance_config.dss.vgdata, instance_config.dss.vglog); + continue; + } + + if (ss_create_if_doublewrite(dir, instance_config.dss.vgdata, instance_config.dss.instance_id)) { + continue; + } } /* tablespace_map exists */ diff --git a/src/bin/pg_probackup/pg_probackupc.h b/src/bin/pg_probackup/pg_probackupc.h index 9358aa6e77ffe6ffdb20d5984d0a06f271e4fa59..13df3f742a91e82fe3b82a900cc110d7d6ea2fae 100644 --- a/src/bin/pg_probackup/pg_probackupc.h +++ b/src/bin/pg_probackup/pg_probackupc.h @@ -390,6 +390,7 @@ extern void get_redo(const char *pgdata_path, RedoParams *redo); 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 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 aefb8503e4a0db7cf8fcbfaaec46720a947fa8f6..c6bb47ddb498953a3c397918b3203148987c8f72 100644 --- a/src/bin/pg_probackup/util.cpp +++ b/src/bin/pg_probackup/util.cpp @@ -560,9 +560,6 @@ is_ss_xlog(const char *ss_dir) rc = sprintf_s(ss_xlog, sizeof(ss_xlog), "%s%d", "pg_xlog", instance_id); securec_check_ss_c(rc, "\0", "\0"); - rc = sprintf_s(ss_doublewrite, sizeof(ss_doublewrite), "%s%d", "pg_doublewrite", instance_id); - securec_check_ss_c(rc, "\0", "\0"); - rc = sprintf_s(ss_notify, sizeof(ss_notify), "%s%d", "pg_notify", instance_id); securec_check_ss_c(rc, "\0", "\0"); @@ -571,7 +568,6 @@ is_ss_xlog(const char *ss_dir) if (IsDssMode() && strlen(instance_config.dss.vglog) && (pg_strcasecmp(ss_dir, ss_xlog) == 0 || - pg_strcasecmp(ss_dir, ss_doublewrite) == 0 || pg_strcasecmp(ss_dir, ss_notify) == 0 || pg_strcasecmp(ss_dir, ss_notify) == 0)) { return true; @@ -598,6 +594,22 @@ ss_createdir(const char *ss_dir, const char *vgdata, const char *vglog) } } +bool +ss_create_if_doublewrite(pgFile* dir, const char* vgdata, int instance_id) +{ + 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) { + rc = sprintf_s(ss_doublewrite, sizeof(ss_doublewrite), "%s/%s", vgdata, dir->rel_path); + securec_check_ss_c(rc, "\0", "\0"); + dir_create_dir(ss_doublewrite, DIR_PERMISSION); + return true; + } else { + return false; + } +} + /* * Rewrite minRecoveryPoint of pg_control in backup directory. minRecoveryPoint * 'as-is' is not to be trusted.