diff --git a/src/bin/gs_retrieve/gs_retrieve.cpp b/src/bin/gs_retrieve/gs_retrieve.cpp index 48d83a7573e42a2a21091094f3faa0a02f10d9ee..3f3d59b23b40c0b597619918208da326c4a86e1e 100644 --- a/src/bin/gs_retrieve/gs_retrieve.cpp +++ b/src/bin/gs_retrieve/gs_retrieve.cpp @@ -919,9 +919,6 @@ int main(int argc, char **argv) exit(1); } - /* Prepare some g_datadir parameters */ - g_datadir.instance_id = ss_instance_config.dss.instance_id; - errno_t rc = strcpy_s(g_datadir.dss_data, strlen(ss_instance_config.dss.vgname) + 1, ss_instance_config.dss.vgname); securec_check_c(rc, "\0", "\0"); diff --git a/src/bin/pg_ctl/pg_ctl.cpp b/src/bin/pg_ctl/pg_ctl.cpp index 1d6192bb61fc4e8fb0cc9c9bcd031579a0fc693e..02fcf5fa413e841afe3f15c58b490ce5983ed111 100755 --- a/src/bin/pg_ctl/pg_ctl.cpp +++ b/src/bin/pg_ctl/pg_ctl.cpp @@ -7159,9 +7159,6 @@ int main(int argc, char** argv) goto Error; } - /* Prepare some g_datadir parameters */ - g_datadir.instance_id = ss_instance_config.dss.instance_id; - errno_t rc = strcpy_s(g_datadir.dss_data, strlen(ss_instance_config.dss.vgname) + 1, ss_instance_config.dss.vgname); securec_check_c(rc, "\0", "\0"); diff --git a/src/bin/pg_probackup/backup.cpp b/src/bin/pg_probackup/backup.cpp index 59a7147631001c67b2fe68c99fd40c42f54feddc..9b092ab3ea8c95efb6d7e3a115c7c1b82f0c0469 100644 --- a/src/bin/pg_probackup/backup.cpp +++ b/src/bin/pg_probackup/backup.cpp @@ -315,10 +315,7 @@ static void start_stream_wal(const char *database_path, const char *dssdata_path stream_stop_timeout = stream_stop_timeout + stream_stop_timeout * 0.1; if (IsDssMode()) { - error_t rc; - rc = snprintf_s(dst_backup_path, MAXPGPATH, MAXPGPATH - 1, "%s/%s%d", dssdata_path, - PG_XLOG_DIR, instance_config.dss.instance_id); - securec_check_ss_c(rc, "\0", "\0"); + join_path_components(dst_backup_path, dssdata_path, PG_XLOG_DIR); } else { join_path_components(dst_backup_path, database_path, PG_XLOG_DIR); } @@ -476,8 +473,7 @@ static void calc_data_bytes() } } -static void add_xlog_files_into_backup_list(const char *database_path, const char *dssdata_path, - int instance_id, bool enable_dss) +static void add_xlog_files_into_backup_list(const char *database_path, const char *dssdata_path, bool enable_dss) { int i; parray *xlog_files_list; @@ -489,17 +485,13 @@ static void add_xlog_files_into_backup_list(const char *database_path, const cha xlog_files_list = parray_new(); if (IsDssMode()) { - errno_t rc; - - rc = snprintf_s(pg_xlog_path, MAXPGPATH, MAXPGPATH - 1, "%s/%s%d", dssdata_path, PG_XLOG_DIR, instance_id); - securec_check_ss_c(rc, "\0", "\0"); + join_path_components(pg_xlog_path, dssdata_path, PG_XLOG_DIR); parent_path = dssdata_path; } else { join_path_components(pg_xlog_path, database_path, PG_XLOG_DIR); parent_path = database_path; } - dir_list_file(xlog_files_list, pg_xlog_path, false, true, false, false, true, 0, FIO_BACKUP_HOST); @@ -600,7 +592,7 @@ static void sync_files(parray *database_map, const char *database_path, parray * /* Add archived xlog files into the list of files of this backup */ if (stream_wal) { - add_xlog_files_into_backup_list(database_path, dssdata_path, instance_config.dss.instance_id, IsDssMode()); + add_xlog_files_into_backup_list(database_path, dssdata_path, IsDssMode()); } /* write database map to file and add it to control file */ @@ -1524,19 +1516,11 @@ wait_wal_lsn(XLogRecPtr target_lsn, bool is_start_lsn, TimeLineID tli, { if (IsDssMode()) { - errno_t rc; - char dss_xlog[MAXPGPATH]; - - rc = snprintf_s(dss_xlog, MAXPGPATH, MAXPGPATH - 1, "%s%d", - PG_XLOG_DIR, instance_config.dss.instance_id); - securec_check_ss_c(rc, "\0", "\0"); - pgBackupGetPath2(¤t, pg_wal_dir, lengthof(pg_wal_dir), - DSSDATA_DIR, dss_xlog); + pgBackupGetPath2(¤t, pg_wal_dir, lengthof(pg_wal_dir), DSSDATA_DIR, PG_XLOG_DIR); } else { - pgBackupGetPath2(¤t, pg_wal_dir, lengthof(pg_wal_dir), - DATABASE_DIR, PG_XLOG_DIR); + pgBackupGetPath2(¤t, pg_wal_dir, lengthof(pg_wal_dir), DATABASE_DIR, PG_XLOG_DIR); } join_path_components(wal_segment_path, pg_wal_dir, wal_segment); wal_segment_dir = pg_wal_dir; @@ -1662,13 +1646,8 @@ static void get_valid_stop_lsn(pgBackup *backup, bool *stop_lsn_exists, XLogRecP { if (IsDssMode()) { - errno_t rc; - char dss_xlog[MAXPGPATH]; - rc = snprintf_s(dss_xlog, MAXPGPATH, MAXPGPATH - 1, "%s%d", PG_XLOG_DIR, - instance_config.dss.instance_id); - securec_check_ss_c(rc, "\0", "\0"); pgBackupGetPath2(backup, stream_xlog_path, lengthof(stream_xlog_path), - DSSDATA_DIR, dss_xlog); + DSSDATA_DIR, PG_XLOG_DIR); } else { @@ -2107,19 +2086,11 @@ pg_stop_backup(pgBackup *backup, PGconn *pg_startbackup_conn, if (IsDssMode()) { - errno_t rc; - char dss_xlog[MAXPGPATH]; - - rc = snprintf_s(dss_xlog, MAXPGPATH, MAXPGPATH - 1, "%s%d", - PG_XLOG_DIR, instance_config.dss.instance_id); - securec_check_ss_c(rc, "\0", "\0"); - pgBackupGetPath2(backup, stream_xlog_path, lengthof(stream_xlog_path), - DSSDATA_DIR, dss_xlog); + pgBackupGetPath2(backup, stream_xlog_path, lengthof(stream_xlog_path), DSSDATA_DIR, PG_XLOG_DIR); } else { - pgBackupGetPath2(backup, stream_xlog_path, lengthof(stream_xlog_path), - DATABASE_DIR, PG_XLOG_DIR); + pgBackupGetPath2(backup, stream_xlog_path, lengthof(stream_xlog_path), DATABASE_DIR, PG_XLOG_DIR); } xlog_path = stream_xlog_path; } diff --git a/src/bin/pg_probackup/dir.cpp b/src/bin/pg_probackup/dir.cpp index feea2280baa1f4486f293bf2c3172649de94aeac..7ab85ad0a5f365b7a1f330c7ae35a9e4234cc402 100644 --- a/src/bin/pg_probackup/dir.cpp +++ b/src/bin/pg_probackup/dir.cpp @@ -128,7 +128,6 @@ static char check_in_tablespace(pgFile *file, bool in_tablespace); static char check_db_dir(pgFile *file); static char check_digit_file(pgFile *file); static char check_nobackup_dir(pgFile *file); -static char check_in_dss(pgFile *file, int include_id); static void dir_list_file_internal(parray *files, pgFile *parent, const char *parent_dir, bool exclude, bool follow_symlink, bool backup_logs, bool skip_hidden, int external_dir_num, fio_location location, @@ -715,12 +714,6 @@ dir_check_file(pgFile *file, bool backup_logs, bool backup_replslots) } } - /* skip other instance files in dss mode */ - check_res = check_in_dss(file, instance_config.dss.instance_id); - if (check_res != CHECK_TRUE) { - return check_res; - } - ret = check_in_tablespace(file, in_tablespace); if (ret != -1) { return ret; @@ -729,47 +722,6 @@ dir_check_file(pgFile *file, bool backup_logs, bool backup_replslots) return check_db_dir(file); } -static char check_in_dss(pgFile *file, int include_id) -{ - char instance_id[MAX_INSTANCEID_LEN]; - char top_path[MAXPGPATH]; - errno_t rc = EOK; - int move = 0; - - if (!is_dss_type(file->type)) { - return CHECK_TRUE; - } - - /* step1 : skip other instance owner file or dir */ - strlcpy(top_path, file->rel_path, sizeof(top_path)); - get_top_path(top_path); - - rc = snprintf_s(instance_id, sizeof(instance_id), sizeof(instance_id) - 1, "%d", include_id); - securec_check_ss_c(rc, "\0", "\0"); - - move = (int)strlen(top_path) - (int)strlen(instance_id); - if (move > 0 && move < MAXPGPATH && strcmp(top_path + move, instance_id) != 0) { - char tail = top_path[strlen(top_path) - 1]; - /* Is this file or dir belongs to other instance? */ - if (tail >= '0' && tail <= '9') { - return CHECK_FALSE; - } - } - - /* step2: recheck dir is in the exclude list, include id will be considered */ - if (S_ISDIR(file->mode)) { - for (int i = 0; pgdata_exclude_dir[i]; i++) { - int len = (int)strlen(pgdata_exclude_dir[i]); - if (strncmp(top_path, pgdata_exclude_dir[i], len) == 0 && - strcmp(top_path + len, instance_id) == 0) { - return CHECK_EXCLUDE_FALSE; - } - } - } - - return CHECK_TRUE; -} - static char check_in_tablespace(pgFile *file, bool in_tablespace) { if (in_tablespace) @@ -1330,7 +1282,7 @@ create_data_directories(parray *dest_files, const char *data_dir, const char *ba continue; } - if (ss_create_if_doublewrite(dir, instance_config.dss.vgdata, instance_config.dss.instance_id)) { + if (ss_create_if_doublewrite(dir, instance_config.dss.vgdata)) { continue; } diff --git a/src/bin/pg_probackup/help.cpp b/src/bin/pg_probackup/help.cpp index 564d647e69e1870a661d74db7c064f60054dcd73..c9af4d8561eca2d62b01bb35d9df68951e1470cc 100644 --- a/src/bin/pg_probackup/help.cpp +++ b/src/bin/pg_probackup/help.cpp @@ -89,8 +89,7 @@ void help_pg_probackup(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); #endif printf(_(" [--help]\n")); @@ -121,8 +120,7 @@ void help_pg_probackup(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); #endif printf(_(" [--help]\n")); @@ -176,8 +174,7 @@ void help_pg_probackup(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); #endif printf(_(" [--ttl=interval] [--expire-time=time]\n")); printf(_(" [--backup-pg-replslot]\n")); @@ -198,8 +195,7 @@ void help_pg_probackup(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); #endif printf(_(" [--log-level-console=log-level-console]\n")); printf(_(" [--log-level-file=log-level-file]\n")); @@ -277,8 +273,7 @@ static void help_add_instance(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n\n")); #endif printf(_(" -B, --backup-path=backup-path location of the backup storage area\n")); @@ -296,7 +291,7 @@ static void help_add_instance(void) printf(_(" --remote-path=path path to directory with gs_probackup binary on remote host\n")); printf(_(" (default: current binary path)\n")); printf(_(" --remote-user=username user name for ssh connection (default: current user)\n")); - printf(_(" --remote-libpath=libpath library path on remote host\n")); + printf(_(" --remote-libpath=libpath library path on remote host\n")); printf(_(" --ssh-options=ssh_options additional ssh options (default: none)\n")); printf(_(" (example: --ssh-options='-c cipher_spec -F configfile')\n")); @@ -311,8 +306,7 @@ static void help_add_instance(void) #ifndef ENABLE_LITE_MODE printf(_("\n DSS options:\n")); printf(_(" --enable-dss enable shared storage mode\n")); - printf(_(" --vgname=\"vgdata,vglog\" name of dss volume group\n")); - printf(_(" --instance-id=instance_id instance id of backup node\n")); + printf(_(" --vgname=\"vgdata,vglog\" name of dss volume group\n")); printf(_(" --socketpath=socketpath dss connect socket file path\n\n")); #endif } @@ -361,8 +355,7 @@ static void help_set_config(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n\n")); #endif printf(_(" -B, --backup-path=backup-path location of the backup storage area\n")); @@ -422,7 +415,7 @@ static void help_set_config(void) printf(_(" --remote-path=path path to directory with gs_probackup binary on remote host\n")); printf(_(" (default: current binary path)\n")); printf(_(" --remote-user=username user name for ssh connection (default: current user)\n")); - printf(_(" --remote-libpath=libpath library path on remote host\n")); + printf(_(" --remote-libpath=libpath library path on remote host\n")); printf(_(" --ssh-options=ssh_options additional ssh options (default: none)\n")); printf(_(" (example: --ssh-options='-c cipher_spec -F configfile')\n")); @@ -437,8 +430,7 @@ static void help_set_config(void) #ifndef ENABLE_LITE_MODE printf(_("\n DSS options:\n")); printf(_(" --enable-dss enable shared storage mode\n")); - printf(_(" --vgname=\"vgdata,vglog\" name of dss volume group\n")); - printf(_(" --instance-id=instance_id instance id of backup node\n")); + printf(_(" --vgname=\"vgdata,vglog\" name of dss volume group\n")); printf(_(" --socketpath=socketpath dss connect socket file path\n\n")); #endif } @@ -547,8 +539,7 @@ static void help_backup(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); #endif printf(_(" [--ttl=interval] [--expire-time=time]\n")); printf(_(" [--backup-pg-replslot]\n\n")); @@ -633,7 +624,7 @@ static void help_backup(void) printf(_(" --remote-path=path path to directory with gs_probackup binary on remote host\n")); printf(_(" (default: current binary path)\n")); printf(_(" --remote-user=username user name for ssh connection (default: current user)\n")); - printf(_(" --remote-libpath=libpath library path on remote host\n")); + printf(_(" --remote-libpath=libpath library path on remote host\n")); printf(_(" --ssh-options=ssh_options additional ssh options (default: none)\n")); printf(_(" (example: --ssh-options='-c cipher_spec -F configfile')\n")); @@ -649,7 +640,6 @@ static void help_backup(void) printf(_("\n DSS options:\n")); printf(_(" --enable-dss enable shared storage mode\n")); printf(_(" --vgname=\"vgdata,vglog\" name of dss volume group\n")); - printf(_(" --instance-id=instance_id instance id of backup node\n")); printf(_(" --socketpath=socketpath dss connect socket file path\n")); #endif @@ -678,8 +668,7 @@ static void help_restore(void) printf(_(" [--media-type=type] [--access-id=ak] [--access-key=sk]\n")); printf(_(" [--access-bucket=bucket] [--endpoint=endpoint] [--region=region]\n")); #ifndef ENABLE_LITE_MODE - printf(_(" [--enable-dss] [--instance-id=instance_id]\n")); - printf(_(" [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); + printf(_(" [--enable-dss] [--vgname=\"vgdata,vglog\"] [--socketpath=socketpath]\n")); #endif printf(_(" [--log-level-console=log-level-console]\n")); printf(_(" [--log-level-file=log-level-file]\n")); @@ -725,7 +714,7 @@ static void help_restore(void) printf(_(" --remote-path=path path to directory with gs_probackup binary on remote host\n")); printf(_(" (default: current binary path)\n")); printf(_(" --remote-user=username user name for ssh connection (default: current user)\n")); - printf(_(" --remote-libpath=libpath library path on remote host\n")); + printf(_(" --remote-libpath=libpath library path on remote host\n")); printf(_(" --ssh-options=ssh_options additional ssh options (default: none)\n")); printf(_(" (example: --ssh-options='-c cipher_spec -F configfile')\n")); @@ -741,7 +730,6 @@ static void help_restore(void) printf(_("\n DSS options:\n")); printf(_(" --enable-dss enable shared storage mode\n")); printf(_(" --vgname=\"vgdata,vglog\" name of dss volume group\n")); - printf(_(" --instance-id=instance_id instance id of backup node\n")); printf(_(" --socketpath=socketpath dss connect socket file path\n")); #endif diff --git a/src/bin/pg_probackup/parsexlog.cpp b/src/bin/pg_probackup/parsexlog.cpp index c03d3e82c71254cb84acb83043ab384710eba3d9..35e55bdb2508c6d483d9332a99844fc53661477a 100644 --- a/src/bin/pg_probackup/parsexlog.cpp +++ b/src/bin/pg_probackup/parsexlog.cpp @@ -441,17 +441,13 @@ validate_wal(pgBackup *backup, const char *archivedir, if (IsDssMode()) { - errno_t rc; join_path_components(backup_database_dir, backup->root_dir, DSSDATA_DIR); - rc = snprintf_s(backup_xlog_path, MAXPGPATH, MAXPGPATH - 1, "%s/%s%d", - backup_database_dir, PG_XLOG_DIR, instance_config.dss.instance_id); - securec_check_ss_c(rc, "\0", "\0"); } else { join_path_components(backup_database_dir, backup->root_dir, DATABASE_DIR); - join_path_components(backup_xlog_path, backup_database_dir, PG_XLOG_DIR); } + join_path_components(backup_xlog_path, backup_database_dir, PG_XLOG_DIR); validate_backup_wal_from_start_to_stop(backup, backup_xlog_path, tli, wal_seg_size); } diff --git a/src/bin/pg_probackup/pg_probackup.cpp b/src/bin/pg_probackup/pg_probackup.cpp index 64df6426b10a0ad6cd51bb5c54bda0d9c9e4e5a2..f7979e52289ee34307a5c60e95514b56251fff05 100644 --- a/src/bin/pg_probackup/pg_probackup.cpp +++ b/src/bin/pg_probackup/pg_probackup.cpp @@ -180,7 +180,6 @@ static void opt_media_type(ConfigOption *opt, const char *arg); static void compress_init(void); static void dss_init(void); -static int ss_get_primary_id(void); static void check_unlimit_stack_size(void); /* @@ -1038,52 +1037,6 @@ compress_init(void) } } -static int ss_get_primary_id(void) -{ - int fd = -1; - int len = 0; - int primary_id = -1; - errno_t rc = 0; - struct stat statbuf; - char control_file_path[MAXPGPATH]; - - rc = memset_s(control_file_path, MAXPGPATH, 0, MAXPGPATH); - securec_check_c(rc, "\0", "\0"); - rc = snprintf_s(control_file_path, MAXPGPATH, MAXPGPATH - 1, "%s/pg_control", instance_config.dss.vgdata); - securec_check_ss_c(rc, "\0", "\0"); - - fd = open(control_file_path, O_RDONLY | PG_BINARY, 0); - if (fd < 0) { - pg_log(PG_WARNING, _("failed to open pg_contol\n")); - close(fd); - exit(1); - } - - if (stat(control_file_path, &statbuf) < 0) { - pg_log(PG_WARNING, _("failed to stat pg_contol\n")); - close(fd); - exit(1); - } - - len = statbuf.st_size; - char *tmpBuffer = (char*)malloc(len + 1); - - if ((read(fd, tmpBuffer, len)) != len) { - close(fd); - free(tmpBuffer); - pg_log(PG_WARNING, _("failed to read pg_contol\n")); - exit(1); - } - - ss_reformer_ctrl_t* reformerCtrl; - - /* Calculate the offset to obtain the primary_id of the last page */ - reformerCtrl = (ss_reformer_ctrl_t*)(tmpBuffer + REFORMER_CTL_INSTANCEID * PG_CONTROL_SIZE); - primary_id = reformerCtrl->primaryInstId; - free(tmpBuffer); - return primary_id; -} - static void dss_init(void) { if (IsDssMode()) { @@ -1121,39 +1074,16 @@ static void dss_init(void) instance_config.dss.vglog, instance_config.dss.socketpath); } - /* Check backup instance id in shared storage mode */ - int id = instance_config.dss.instance_id; - if (id < MIN_INSTANCEID || id > MAX_INSTANCEID) { - elog(ERROR, "Instance id must be specified in dss mode, valid range is %d - %d.", - MIN_INSTANCEID, MAX_INSTANCEID); - } - - if (backup_subcmd == BACKUP_CMD || backup_subcmd == ADD_INSTANCE_CMD) { - int primary_instance_id = ss_get_primary_id(); - if (id != primary_instance_id) { - elog(ERROR, "backup only support on primary in dss mode, primary instance id: %d, backup instance id: %d", - primary_instance_id, id); - } - } - if (backup_subcmd != RESTORE_CMD) { off_t size = 0; char xlog_control_path[MAXPGPATH]; join_path_components(xlog_control_path, instance_config.dss.vgdata, PG_XLOG_CONTROL_FILE); - if ((size = dss_get_file_size(xlog_control_path)) == INVALID_DEVICE_SIZE) { - elog(ERROR, "Could not get \"%s\" size: %s", xlog_control_path, strerror(errno)); - } - - if (size < (off_t)BLCKSZ * id) { - elog(ERROR, "Cound not read beyond end of file \"%s\", file_size: %ld, instance_id: %d\n", - xlog_control_path, size, id); + if (size != (off_t)(PG_CONTROL_SIZE * (MAX_INSTANCEID + 1))) { + elog(ERROR, "Invalid size of file \"%s\", file_size: %ld\n", xlog_control_path, size); } } - /* Prepare some g_datadir parameters */ - g_datadir.instance_id = id; - errno_t rc = strcpy_s(g_datadir.dss_data, strlen(instance_config.dss.vgdata) + 1, instance_config.dss.vgdata); securec_check_c(rc, "\0", "\0"); diff --git a/src/bin/pg_probackup/pg_probackupc.h b/src/bin/pg_probackup/pg_probackupc.h index 090d6f0360ca0a9b8eda08990f3d9ff9c1c5edc8..fc4461e22cdb68d1428b94d3c8f015a4ad218a63 100644 --- a/src/bin/pg_probackup/pg_probackupc.h +++ b/src/bin/pg_probackup/pg_probackupc.h @@ -415,7 +415,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_pg_replication(pgFile *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_doublewrite(pgFile* dir, const char* vgdata); 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, diff --git a/src/bin/pg_probackup/restore.cpp b/src/bin/pg_probackup/restore.cpp index 11d109654ab2f9d6d967055e0672ae7c419195a0..5eefada6afd91e2f6fb5c1586ae1bfd1e3d1453a 100644 --- a/src/bin/pg_probackup/restore.cpp +++ b/src/bin/pg_probackup/restore.cpp @@ -87,7 +87,6 @@ static void get_pgdata_and_dssdata_files(const char *pgdata_path, parray *pgdata_and_dssdata_files, parray *external_dirs); static bool skip_some_tblspc_files(pgFile *file); -static char check_in_dss_instance(pgFile *file, int include_id); static void remove_redundant_files(const char *pgdata_path, const char *dssdata_path, parray *pgdata_and_dssdata_files, @@ -1039,36 +1038,6 @@ static bool skip_some_tblspc_files(pgFile *file) #define CHECK_TRUE 1 #define CHECK_EXCLUDE_FALSE 2 -static char check_in_dss_instance(pgFile *file, int include_id) -{ - if (!is_dss_type(file->type)) { - return CHECK_TRUE; - } - - char instance_id[MAX_INSTANCEID_LEN]; - char top_path[MAXPGPATH]; - errno_t rc = EOK; - int move = 0; - - /* step1 : skip other instance owner file or dir */ - strlcpy(top_path, file->rel_path, sizeof(top_path)); - get_top_path(top_path); - - rc = snprintf_s(instance_id, sizeof(instance_id), sizeof(instance_id) - 1, "%d", include_id); - securec_check_ss_c(rc, "\0", "\0"); - - move = (int)strlen(top_path) - (int)strlen(instance_id); - if (move > 0 && move < MAXPGPATH && strcmp(top_path + move, instance_id) != 0) { - char tail = top_path[strlen(top_path) - 1]; - /* Is this file or dir belongs to other instance? */ - if (tail >= '0' && tail <= '9') { - return CHECK_FALSE; - } - } - - return CHECK_TRUE; -} - /* * Print a progress report based on the global variables. * Execute this function in another thread and print the progress periodically. @@ -1172,13 +1141,7 @@ static void remove_redundant_files(const char *pgdata_path, file->external_dir_num - 1); join_path_components(fullpath, external_path, file->rel_path); } else if (is_dss_type(file->type)) { - /* skip other instance files in dss mode */ - char check_res = check_in_dss_instance(file, instance_config.dss.instance_id); - if (check_res != CHECK_TRUE) { - continue; - } else { - join_path_components(fullpath, dssdata_path, file->rel_path); - } + join_path_components(fullpath, dssdata_path, file->rel_path); } else { join_path_components(fullpath, pgdata_path, file->rel_path); } diff --git a/src/bin/pg_probackup/util.cpp b/src/bin/pg_probackup/util.cpp index d99c92c2f45e9644e65db625466f71ab40452f04..209eea4ee462413f84b07e18c19d0b8fbfa00b7d 100644 --- a/src/bin/pg_probackup/util.cpp +++ b/src/bin/pg_probackup/util.cpp @@ -148,31 +148,12 @@ digestControlFile(ControlFileData *ControlFile, char *src, size_t size) errno_t rc; char* oldSrc = src; char* tmpDssSrc; - size_t clearSize = 0; bool dssMode = IsDssMode(); - int instanceId = instance_config.dss.instance_id; - int64 instanceId64 = (int64) instanceId; - size_t instanceIdSize = (size_t) instanceId; size_t compareSize = PG_CONTROL_SIZE; /* control file contents need special handle in dss mode */ if (dssMode) { // dms support (MAX_INSTANCEID + 1) instance, and last page for all control. - compareSize = 1 + MAX_INSTANCEID - MIN_INSTANCEID; - compareSize = (compareSize + 1) * PG_CONTROL_SIZE; - src += instanceId64 * PG_CONTROL_SIZE; - // in here, we clear all control page except instance page and last page. - if (instanceId != MIN_INSTANCEID) { - clearSize = instanceIdSize * PG_CONTROL_SIZE; - rc = memset_s(oldSrc, clearSize, 0, clearSize); - securec_check_c(rc, "\0", "\0"); - } - if (instanceId != MAX_INSTANCEID) { - clearSize = (size_t) (MAX_INSTANCEID - instanceIdSize) * PG_CONTROL_SIZE; - tmpDssSrc = oldSrc; - tmpDssSrc += (instanceId64 + 1) * PG_CONTROL_SIZE; - rc = memset_s(tmpDssSrc, clearSize, 0, clearSize); - securec_check_c(rc, "\0", "\0"); - } + compareSize = (MAX_INSTANCEID + 1) * PG_CONTROL_SIZE; } if (size != compareSize) @@ -560,25 +541,8 @@ void parse_vgname_args(const char* args) bool is_ss_xlog(const char *ss_dir) { - char ss_xlog[MAXPGPATH] = {0}; - char ss_notify[MAXPGPATH] = {0}; - char ss_snapshots[MAXPGPATH] = {0}; - int rc = EOK; - int instance_id = instance_config.dss.instance_id; - - 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_notify, sizeof(ss_notify), "%s%d", "pg_notify", instance_id); - securec_check_ss_c(rc, "\0", "\0"); - - rc = sprintf_s(ss_snapshots, sizeof(ss_snapshots), "%s%d", "pg_snapshots", instance_id); - securec_check_ss_c(rc, "\0", "\0"); - - if (IsDssMode() && strlen(instance_config.dss.vglog) && - (pg_strcasecmp(ss_dir, ss_xlog) == 0 || - pg_strcasecmp(ss_dir, ss_notify) == 0 || - pg_strcasecmp(ss_dir, ss_notify) == 0)) { + if (IsDssMode() && strlen(instance_config.dss.vglog) && (pg_strcasecmp(ss_dir, "pg_xlog") == 0 || + pg_strcasecmp(ss_dir, "pg_notify") == 0 || pg_strcasecmp(ss_dir, "pg_snapshots") == 0)) { return true; } return false; @@ -638,13 +602,11 @@ ss_create_if_pg_replication(pgFile* dir, const char* vgdata, const char* vglog) } bool -ss_create_if_doublewrite(pgFile* dir, const char* vgdata, int instance_id) +ss_create_if_doublewrite(pgFile* dir, const char* vgdata) { 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); + if (pg_strcasecmp(dir->rel_path, "pg_doublewrite") == 0) { + errno_t 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; diff --git a/src/bin/pg_resetxlog/pg_resetxlog.cpp b/src/bin/pg_resetxlog/pg_resetxlog.cpp index 035ae58801a4a589689c4d204732830a0f000714..22c1c9b001010d755ce1f26f16c9bf4013f98ae7 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.cpp +++ b/src/bin/pg_resetxlog/pg_resetxlog.cpp @@ -68,8 +68,6 @@ static const char* progname; static void DssParaInit(void); static void SetGlobalDssParam(void); -static int ReadNonDssControlFile(int *fd, char * buffer); -static int ReadDssControlFile(int *fd, char *buffer); static bool TryReadControlFile(void); static void GuessControlValues(void); static bool GetGucValue(const char *key, char *value); @@ -81,6 +79,8 @@ static void KillExistingXLOG(void); static void KillExistingArchiveStatus(void); static void WriteEmptyXLOG(void); static void usage(void); +static void CheckPrimaryInDssMode(void); +static int GetPrimaryIdInDssMode(void); #define XLOG_NAME_LENGTH 24 #define MAX_STRING_LENGTH 1024 @@ -371,6 +371,12 @@ int main(int argc, char* argv[]) exit(1); } + /* + * We require cluster shutdown when executing this tool, so a better + * solution is to execute the tool on the primary node. + */ + CheckPrimaryInDssMode(); + /* * Attempt to read the existing pg_control file */ @@ -378,34 +384,6 @@ int main(int argc, char* argv[]) GuessControlValues(); } - if (dss.enable_dss) { - char guc_value[MAX_STRING_LENGTH] = {0}; - int curr_inst_id; - - if (!GetGucValue("ss_instance_id", guc_value)) { - fprintf(stderr, - _("%s: get the guc value of \"ss_instance_id\" failed, " - "please check the file \"postgresql.conf\".\n"), progname); - exit(1); - } - curr_inst_id = atoi(guc_value); - - if (curr_inst_id < MIN_INSTANCEID || curr_inst_id > MAX_INSTANCEID) { - fprintf(stderr, _("%s: unexpected node id specified, valid range is %d - %d\n"), - progname, MIN_INSTANCEID, MAX_INSTANCEID); - exit(1); - } - - if (curr_inst_id != dss.primaryInstId) { - fprintf(stderr, - _("%s: you must execute this command in primary node: %d, " - "current node id is %d.\n"), - progname, dss.primaryInstId, curr_inst_id); - exit(1); - } - } - - /* * Also look at existing segment files to set up newXlogSegNo */ @@ -512,92 +490,6 @@ static void SetGlobalDssParam(void) } } -/* - * Try to read the existing pg_control file. - */ -static int ReadNonDssControlFile(int *fd, char *buffer) -{ - int len = 0; - len = read(*fd, buffer, PG_CONTROL_SIZE); - if (len < 0) { - fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), - progname, T_XLOG_CONTROL_FILE, strerror(errno)); - free(buffer); - buffer = NULL; - close(*fd); - *fd = -1; - exit(1); - } - return len; -} - -/* - * Try to read the existing pg_control file in DSS mode. - */ -static int ReadDssControlFile(int *fd, char *buffer) -{ - char *tmpDssSrc; - struct stat statbuf; - int len; - errno_t rc; - - if (stat(T_XLOG_CONTROL_FILE, &statbuf) < 0) { - fprintf(stderr, _("%s: could not stat file \"%s\": %s\n"), - progname, T_XLOG_CONTROL_FILE, strerror(errno)); - free(buffer); - buffer = NULL; - close(*fd); - *fd = -1; - exit(1); - } - - len = statbuf.st_size; - - char *tmpBuffer = (char*)malloc(len + 1); - - if (read(*fd, tmpBuffer, len) != len) { - fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), - progname, T_XLOG_CONTROL_FILE, strerror(errno)); - free(buffer); - buffer = NULL; - free(tmpBuffer); - tmpBuffer = NULL; - close(*fd); - *fd = -1; - exit(1); - } - - /* - * In dss mode, we need to get the primary instance id - * from the pg_control file's last page. - */ - ss_reformer_ctrl_t *reformerCtrl; - reformerCtrl = (ss_reformer_ctrl_t *)(tmpBuffer + REFORMER_CTL_INSTANCEID * PG_CONTROL_SIZE); - dss.primaryInstId = reformerCtrl->primaryInstId; - if (dss.primaryInstId < MIN_INSTANCEID || dss.primaryInstId > MAX_INSTANCEID) { - fprintf(stderr, _("%s: unexpected primary node id: %d, valid range is %d - %d.\n"), - progname, dss.primaryInstId, MIN_INSTANCEID, MAX_INSTANCEID); - free(tmpBuffer); - tmpBuffer = NULL; - close(*fd); - *fd = -1; - exit(1); - } - g_datadir.instance_id = dss.primaryInstId; - /* update the dss data path */ - initDataPathStruct(dss.enable_dss); - - tmpBuffer[len] = '\0'; - tmpDssSrc = tmpBuffer; - tmpDssSrc += dss.primaryInstId * PG_CONTROL_SIZE; - rc = memcpy_s(buffer, PG_CONTROL_SIZE, tmpDssSrc, PG_CONTROL_SIZE); - securec_check_c(rc, "\0", "\0"); - - free(tmpBuffer); - tmpBuffer = NULL; - return PG_CONTROL_SIZE; -} - /* * Try to read the existing pg_control file. * @@ -640,10 +532,16 @@ static bool TryReadControlFile(void) fd = -1; exit(1); } - if (dss.enable_dss) { - len = ReadDssControlFile(&fd, buffer); - } else { - len = ReadNonDssControlFile(&fd, buffer); + + len = read(fd, buffer, PG_CONTROL_SIZE); + if (len < 0) { + fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), + progname, T_XLOG_CONTROL_FILE, strerror(errno)); + free(buffer); + buffer = NULL; + close(fd); + fd = -1; + exit(1); } close(fd); fd = -1; @@ -953,18 +851,6 @@ static void RewriteControlFile(void) exit(1); } - errno = 0; - if (dss.enable_dss) { - off_t seekpos = (off_t)BLCKSZ * dss.primaryInstId; - if (lseek(fd, seekpos, SEEK_SET) < 0) { - fprintf(stderr, _("%s: Can not seek the primary id %d of \"%s\": %s\n"), - progname, dss.primaryInstId, T_XLOG_CONTROL_FILE, strerror(errno)); - close(fd); - fd = -1; - exit(1); - } - } - errno = 0; if (write(fd, buffer, PG_CONTROL_SIZE) != PG_CONTROL_SIZE) { /* if write didn't set errno, assume problem is no disk space */ @@ -1308,6 +1194,93 @@ static void WriteEmptyXLOG(void) fd = -1; } +static void CheckPrimaryInDssMode(void) +{ + if (!dss.enable_dss) { + return; + } + + char guc_value[MAX_STRING_LENGTH] = {0}; + int curr_inst_id; + + if (!GetGucValue("ss_instance_id", guc_value)) { + fprintf(stderr, + _("%s: get the guc value of \"ss_instance_id\" failed, " + "please check the file \"postgresql.conf\".\n"), progname); + exit(1); + } + + if (curr_inst_id < MIN_INSTANCEID || curr_inst_id > MAX_INSTANCEID) { + fprintf(stderr, _("%s: unexpected node id specified, valid range is %d - %d\n"), + progname, MIN_INSTANCEID, MAX_INSTANCEID); + exit(1); + } + + dss.primaryInstId = GetPrimaryIdInDssMode(); + curr_inst_id = atoi(guc_value); + if (curr_inst_id != dss.primaryInstId) { + fprintf(stderr, _("%s: you must execute this command in primary node: %d, current node id is %d.\n"), + progname, dss.primaryInstId, curr_inst_id); + exit(1); + } +} + +static int GetPrimaryIdInDssMode(void) +{ + char* buffer = NULL; + int fd = -1; + int len = 0; + int primaryId = -1; + + if ((fd = open(T_XLOG_CONTROL_FILE, O_RDONLY | PG_BINARY, 0)) < 0) { + /* + * If pg_control is not there at all, or we can't read it, the odds + * are we've been handed a bad DataDir path, so give up. User can do + * "touch pg_control" to force us to proceed. + */ + fprintf(stderr, + _("%s: could not open file \"%s\" for reading: %s\n"), + progname, + T_XLOG_CONTROL_FILE, + strerror(errno)); + exit(1); + } + + /* Use malloc to ensure we have a maxaligned buffer */ + buffer = (char*)malloc(PG_CONTROL_SIZE); + if (buffer == NULL) { + fprintf(stderr, _("%s: out of memory\n"), progname); + close(fd); + fd = -1; + exit(1); + } + + len = pread(fd, buffer, PG_CONTROL_SIZE, REFORMER_CTL_INSTANCEID * PG_CONTROL_SIZE); + if (len < 0) { + fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), + progname, T_XLOG_CONTROL_FILE, strerror(errno)); + free(buffer); + buffer = NULL; + close(fd); + fd = -1; + exit(1); + } + + ss_reformer_ctrl_t *reformerCtrl = (ss_reformer_ctrl_t *)buffer; + primaryId = reformerCtrl->primaryInstId; + if (primaryId < MIN_INSTANCEID || primaryId > MAX_INSTANCEID) { + fprintf(stderr, _("%s: unexpected primary id %d in reform control, valid range is %d - %d\n"), + progname, primaryId, MIN_INSTANCEID, MAX_INSTANCEID); + exit(1); + } + + free(buffer); + buffer = NULL; + close(fd); + fd = -1; + return primaryId; +} + static void usage(void) { printf(_("%s resets the openGauss transaction log.\n\n"), progname); diff --git a/src/common/port/tool_common.cpp b/src/common/port/tool_common.cpp index 7dcdaf029c0e55a2a32c9fcd0cfb051ac24ce93f..fa868ad03626893e120847ae796e1cd205083ce6 100644 --- a/src/common/port/tool_common.cpp +++ b/src/common/port/tool_common.cpp @@ -147,45 +147,38 @@ static void initDSSDataPathStruct(datadir_t *dataDir) rc = snprintf_s(dataDir->tblspcDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_tblspc", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->controlPath, MAXPGPATH, MAXPGPATH - 1, "%s/pg_control", dataDir->dss_data); + rc = snprintf_s(dataDir->clogDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_clog", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->controlBakPath, MAXPGPATH, MAXPGPATH - 1, "%s/pg_control.backup", dataDir->dss_data); + rc = snprintf_s(dataDir->csnlogDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_csnlog", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->controlInfoPath, MAXPGPATH, MAXPGPATH - 1, "%s/pg_replication/pg_ss_ctl_info", - dataDir->dss_log); + rc = snprintf_s(dataDir->serialDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_serial", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - // DSS file directory (instance owner) - rc = snprintf_s(dataDir->clogDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_clog%d", dataDir->dss_data, - dataDir->instance_id); + rc = snprintf_s(dataDir->twophaseDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_twophase", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->csnlogDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_csnlog%d", dataDir->dss_data, - dataDir->instance_id); + rc = snprintf_s(dataDir->multixactDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_multixact", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->serialDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_serial%d", dataDir->dss_data, - dataDir->instance_id); + rc = snprintf_s(dataDir->xlogDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_xlog", dataDir->dss_log); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->snapshotsDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_snapshots%d", dataDir->dss_data, - dataDir->instance_id); + rc = snprintf_s(dataDir->snapshotsDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_snapshots", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->twophaseDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_twophase%d", dataDir->dss_data, - dataDir->instance_id); + rc = snprintf_s(dataDir->controlPath, MAXPGPATH, MAXPGPATH - 1, "%s/pg_control", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->multixactDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_multixact%d", dataDir->dss_data, - dataDir->instance_id); + rc = snprintf_s(dataDir->controlBakPath, MAXPGPATH, MAXPGPATH - 1, "%s/pg_control.backup", dataDir->dss_data); securec_check_ss_c(rc, "", ""); - rc = snprintf_s(dataDir->xlogDir, MAXPGPATH, MAXPGPATH - 1, "%s/pg_xlog", dataDir->dss_log); + rc = snprintf_s(dataDir->controlInfoPath, MAXPGPATH, MAXPGPATH - 1, "%s/pg_replication/pg_ss_ctl_info", + dataDir->dss_log); securec_check_ss_c(rc, "", ""); - // Unix file directory (instance owner) + // doublewrite file rc = snprintf_s(dataDir->dwDir.dwOldPath, MAXPGPATH, MAXPGPATH - 1, "%s/pg_doublewrite/pg_dw", dataDir->dss_data); securec_check_ss_c(rc, "", ""); diff --git a/src/include/tool_common.h b/src/include/tool_common.h index 4fd8ed40edd474f6fff86f8d80429856f70d2dae..551ce4d706652ecaa08e8451bc8af6e1f6db24e4 100644 --- a/src/include/tool_common.h +++ b/src/include/tool_common.h @@ -96,8 +96,6 @@ typedef struct st_datadir_t { char pg_data[MAXPGPATH]; // pg_data path in unix char dss_data[MAXPGPATH]; // dss vgdata (only in dss mode) char dss_log[MAXPGPATH]; // dss vglog (only in dss mode) - int instance_id; // instance id of cluster (only in dss mode) - char xlogDir[MAXPGPATH]; char baseDir[MAXPGPATH]; char globalDir[MAXPGPATH]; char clogDir[MAXPGPATH]; @@ -109,6 +107,7 @@ typedef struct st_datadir_t { char tblspcDir[MAXPGPATH]; char twophaseDir[MAXPGPATH]; char multixactDir[MAXPGPATH]; + char xlogDir[MAXPGPATH]; char controlPath[MAXPGPATH]; char controlBakPath[MAXPGPATH]; char controlInfoPath[MAXPGPATH];