ctlinfo校验失败解决

This commit is contained in:
chenzhikai
2023-08-26 18:13:27 +08:00
parent c63c8980b8
commit bbfedd4e67

View File

@ -67,12 +67,13 @@ void WriteSSDoradoCtlInfoFile()
void ReadSSDoradoCtlInfoFile() void ReadSSDoradoCtlInfoFile()
{ {
struct stat st; struct stat st;
Assert(stat(SS_DORADO_CTRL_FILE, &st) == 0 && S_ISREG(st.st_mode)); if (!stat(SS_DORADO_CTRL_FILE, &st) == 0 || !S_ISREG(st.st_mode)) {
Assert(g_instance.xlog_cxt.ssReplicationXLogCtl != NULL); ereport(PANIC,
ShareStorageXLogCtl *ctlInfo = g_instance.xlog_cxt.ssReplicationXLogCtl; (errcode_for_file_access(), errmsg("[ReadSSDoradoCtlInfo]SS dorado control file is not exist\"%s\".",
errno_t errorno = EOK; SS_DORADO_CTRL_FILE)));
int fd = -1; }
fd = BasicOpenFile(SS_DORADO_CTRL_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
int fd = BasicOpenFile(SS_DORADO_CTRL_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
if (fd < 0) { if (fd < 0) {
/* TODO: need consider that dorado is briefly unreadable during the synchronization process */ /* TODO: need consider that dorado is briefly unreadable during the synchronization process */
ereport(PANIC, ereport(PANIC,
@ -82,27 +83,31 @@ void ReadSSDoradoCtlInfoFile()
char buffer[SS_DORADO_CTL_INFO_SIZE] __attribute__((__aligned__(ALIGNOF_BUFFER))); char buffer[SS_DORADO_CTL_INFO_SIZE] __attribute__((__aligned__(ALIGNOF_BUFFER)));
if (read(fd, buffer, SS_DORADO_CTL_INFO_SIZE) != SS_DORADO_CTL_INFO_SIZE) { if (read(fd, buffer, SS_DORADO_CTL_INFO_SIZE) != SS_DORADO_CTL_INFO_SIZE) {
(void)close(fd);
ereport(PANIC, ereport(PANIC,
(errcode_for_file_access(), errmsg("[ReadSSDoradoCtlInfo]could not read SS dorado control file \"%s\".", (errcode_for_file_access(), errmsg("[ReadSSDoradoCtlInfo]could not read SS dorado control file \"%s\".",
SS_DORADO_CTRL_FILE))); SS_DORADO_CTRL_FILE)));
} }
errorno = memcpy_s(ctlInfo, SS_DORADO_CTL_INFO_SIZE, buffer, SS_DORADO_CTL_INFO_SIZE); ShareStorageXLogCtl *ctlInfo = (ShareStorageXLogCtl*)buffer;
securec_check_c(errorno, "\0", "\0");
if (close(fd)) {
ereport(PANIC,
(errcode_for_file_access(), errmsg("[ReadSSDoradoCtlInfo]could not close SS dorado control file \"%s\".",
SS_DORADO_CTRL_FILE)));
}
if ((ctlInfo->magic != SHARE_STORAGE_CTL_MAGIC) || (ctlInfo->checkNumber != SHARE_STORAGE_CTL_CHCK_NUMBER)) { if ((ctlInfo->magic != SHARE_STORAGE_CTL_MAGIC) || (ctlInfo->checkNumber != SHARE_STORAGE_CTL_CHCK_NUMBER)) {
(void)close(fd);
ereport(FATAL, (errmsg("[ReadSSDoradoCtlInfo]SS replication ctl_info maybe damaged."))); ereport(FATAL, (errmsg("[ReadSSDoradoCtlInfo]SS replication ctl_info maybe damaged.")));
} }
pg_crc32c crc = CalShareStorageCtlInfoCrc(ctlInfo); pg_crc32c crc = CalShareStorageCtlInfoCrc(ctlInfo);
if (!EQ_CRC32C(crc, ctlInfo->crc)) { if (!EQ_CRC32C(crc, ctlInfo->crc)) {
(void)close(fd);
ereport(FATAL, (errmsg("[ReadSSDoradoCtlInfo]SS replication ctl_info crc check failed."))); ereport(FATAL, (errmsg("[ReadSSDoradoCtlInfo]SS replication ctl_info crc check failed.")));
} }
errno_t errorno = memcpy_s(g_instance.xlog_cxt.ssReplicationXLogCtl, SS_DORADO_CTL_INFO_SIZE, buffer, SS_DORADO_CTL_INFO_SIZE);
securec_check_c(errorno, "\0", "\0");
if (close(fd)) {
ereport(PANIC,
(errcode_for_file_access(), errmsg("[ReadSSDoradoCtlInfo]could not close SS dorado control file \"%s\".",
SS_DORADO_CTRL_FILE)));
}
} }
void InitSSDoradoCtlInfoFile() void InitSSDoradoCtlInfoFile()
@ -120,7 +125,7 @@ void InitSSDoradoCtlInfoFile()
int fd = -1; int fd = -1;
char buffer[SS_DORADO_CTL_INFO_SIZE] __attribute__((__aligned__(ALIGNOF_BUFFER))); /* need to be aligned */ char buffer[SS_DORADO_CTL_INFO_SIZE] __attribute__((__aligned__(ALIGNOF_BUFFER))); /* need to be aligned */
errno_t errorno = EOK; errno_t errorno = EOK;
Assert(stat(SS_DORADO_CTRL_FILE, &st) !=0 || !S_ISREG(st.st_mode)); Assert(stat(SS_DORADO_CTRL_FILE, &st) != 0 || !S_ISREG(st.st_mode));
/* create SS_DORADO_CTRL_FILE first time */ /* 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); fd = BasicOpenFile(SS_DORADO_CTRL_FILE, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, S_IRUSR | S_IWUSR);