* Copyright (c) 2024 Huawei Technologies Co.,Ltd.
*
* CM is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*
*cm_msg_version_convert.cpp
*
*
* IDENTIFICATION
* src/cm_common/cm_msg_version_convert.cpp
*
* -------------------------------------------------------------------------
*/
#include "cm_msg_version_convert.h"
#ifdef __cplusplus
extern "C" {
#endif
void CmToAgentLock2V1ToV2(const cm_to_agent_lock2_ipv4 *v1, cm_to_agent_lock2 *v2)
{
v2->instanceId = v1->instanceId;
v2->msg_type = v1->msg_type;
v2->node = v1->node;
errno_t rc = snprintf_s(v2->disconn_host,
CM_IP_LENGTH, (int)strlen(v1->disconn_host),
"%s",
v1->disconn_host);
securec_check_intval(rc, (void)rc);
v2->disconn_port = v1->disconn_port;
}
void CmToAgentLock2V2ToV1(const cm_to_agent_lock2 *v2, cm_to_agent_lock2_ipv4 *v1)
{
v1->instanceId = v2->instanceId;
v1->msg_type = v2->msg_type;
v1->node = v2->node;
errno_t rc = strncpy_s(v1->disconn_host, HOST_LENGTH, v2->disconn_host, HOST_LENGTH - 1);
securec_check_errno(rc, (void)rc);
v1->disconn_port = v2->disconn_port;
}
void CmLocalReplconninfoV1ToV2(const cm_local_replconninfo_ipv4 *v1, cm_local_replconninfo *v2)
{
v2->buildReason = v1->buildReason;
v2->db_state = v1->db_state;
errno_t rc = snprintf_s(v2->disconn_host, CM_IP_LENGTH, (int)strlen(v1->disconn_host), "%s", v1->disconn_host);
securec_check_intval(rc, (void)rc);
v2->disconn_mode = v1->disconn_mode;
v2->disconn_port = v1->disconn_port;
v2->last_flush_lsn = v1->last_flush_lsn;
rc = snprintf_s(v2->local_host, CM_IP_LENGTH, (int)strlen(v1->local_host), "%s", v1->local_host);
securec_check_intval(rc, (void)rc);
v2->local_port = v1->local_port;
v2->local_role = v1->local_role;
v2->redo_finished = v1->redo_finished;
v2->static_connections = v1->static_connections;
v2->term = v1->term;
}
void CmLocalReplconninfoV2ToV1(const cm_local_replconninfo *v2, cm_local_replconninfo_ipv4 *v1)
{
v1->buildReason = v2->buildReason;
v1->db_state = v2->db_state;
errno_t rc = strncpy_s(v1->disconn_host, HOST_LENGTH, v2->disconn_host, HOST_LENGTH - 1);
securec_check_errno(rc, (void)rc);
v1->disconn_mode = v2->disconn_mode;
v1->disconn_port = v2->disconn_port;
v1->last_flush_lsn = v2->last_flush_lsn;
rc = strncpy_s(v1->local_host, HOST_LENGTH, v2->local_host, HOST_LENGTH - 1);
securec_check_errno(rc, (void)rc);
v1->local_port = v2->local_port;
v1->local_role = v2->local_role;
v1->redo_finished = v2->redo_finished;
v1->static_connections = v2->static_connections;
v1->term = v2->term;
}
void AgentToCmDatanodeStatusReportV1ToV2(const agent_to_cm_datanode_status_report_ipv4 *v1,
agent_to_cm_datanode_status_report *v2)
{
errno_t rc = memcpy_s((void *)&(v2->build_info),
sizeof(BuildState),
(void *const)&(v1->build_info),
sizeof(BuildState));
securec_check_intval(rc, (void)rc);
v2->connectStatus = v1->connectStatus;
v2->dn_restart_counts = v1->dn_restart_counts;
v2->dn_restart_counts_in_hour = v1->dn_restart_counts_in_hour;
v2->dnVipStatus = v1->dnVipStatus;
v2->instanceId = v1->instanceId;
v2->instanceType = v1->instanceType;
rc = memcpy_s((void *)&(v2->local_redo_stats),
sizeof(cm_redo_stats),
(void *const)&(v1->local_redo_stats),
sizeof(cm_redo_stats));
securec_check_intval(rc, (void)rc);
CmLocalReplconninfoV1ToV2(&v1->local_status, &v2->local_status);
v2->msg_type = v1->msg_type;
v2->node = v1->node;
rc = memcpy_s((void *)&(v2->parallel_redo_status),
sizeof(RedoStatsData),
(void *const)&(v1->parallel_redo_status),
sizeof(RedoStatsData));
securec_check_intval(rc, (void)rc);
v2->phony_dead_times = v1->phony_dead_times;
v2->processStatus = v1->processStatus;
rc = memcpy_s((void *)&(v2->receive_status),
sizeof(cm_receiver_replconninfo),
(void *const)&(v1->receive_status),
sizeof(cm_receiver_replconninfo));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v2->sender_status[0]),
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo),
(void *const)v1->sender_status,
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo));
securec_check_intval(rc, (void)rc);
}
void AgentToCmDatanodeStatusReportV2ToV1(const agent_to_cm_datanode_status_report *v2,
agent_to_cm_datanode_status_report_ipv4 *v1)
{
errno_t rc = memcpy_s((void *)&(v1->build_info),
sizeof(BuildState),
(void *const)&(v2->build_info),
sizeof(BuildState));
securec_check_intval(rc, (void)rc);
v1->connectStatus = v2->connectStatus;
v1->dn_restart_counts = v2->dn_restart_counts;
v1->dn_restart_counts_in_hour = v2->dn_restart_counts_in_hour;
v1->dnVipStatus = v2->dnVipStatus;
v1->instanceId = v2->instanceId;
v1->instanceType = v2->instanceType;
rc = memcpy_s((void *)&(v1->local_redo_stats),
sizeof(cm_redo_stats),
(void *const)&(v2->local_redo_stats),
sizeof(cm_redo_stats));
securec_check_intval(rc, (void)rc);
CmLocalReplconninfoV2ToV1(&v2->local_status, &v1->local_status);
v1->msg_type = v2->msg_type;
v1->node = v2->node;
rc = memcpy_s((void *)&(v1->parallel_redo_status),
sizeof(RedoStatsData),
(void *const)&(v2->parallel_redo_status),
sizeof(RedoStatsData));
securec_check_intval(rc, (void)rc);
v1->phony_dead_times = v2->phony_dead_times;
v1->processStatus = v2->processStatus;
rc = memcpy_s((void *)&(v1->receive_status),
sizeof(cm_receiver_replconninfo),
(void *const)&(v2->receive_status),
sizeof(cm_receiver_replconninfo));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v1->sender_status[0]),
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo),
(void *const)v2->sender_status,
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo));
securec_check_intval(rc, (void)rc);
}
void CmDnReportStatusMsgV1ToV2(const CmDnReportStatusMsg_ipv4 *v1, CmDnReportStatusMsg *v2)
{
v2->arbiTime = v1->arbiTime;
v2->arbitrateFlag = v1->arbitrateFlag;
v2->archive_LSN = v1->archive_LSN;
errno_t rc = snprintf_s(v2->barrierID, BARRIERLEN, BARRIERLEN-1, "%s", v1->barrierID);
securec_check_intval(rc, (void)rc);
v2->barrierLSN = v1->barrierLSN;
rc = memcpy_s((void *)&(v2->build_info), sizeof(BuildState), (void *const)&(v1->build_info), sizeof(BuildState));
securec_check_intval(rc, (void)rc);
v2->ckpt_redo_point = v1->ckpt_redo_point;
v2->dn_restart_counts = v1->dn_restart_counts;
v2->dn_restart_counts_in_hour = v1->dn_restart_counts_in_hour;
rc = memcpy_s((void *)&(v2->dnLp), sizeof(DatanodelocalPeer), (void *const)&(v1->dnLp), sizeof(DatanodelocalPeer));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v2->dnSyncList), sizeof(DatanodeSyncList), (void *const)&(v1->dnSyncList),
sizeof(DatanodeSyncList));
securec_check_intval(rc, (void)rc);
v2->failoverStep = v1->failoverStep;
v2->failoverTimeout = v1->failoverTimeout;
v2->flush_LSN = v1->flush_LSN;
v2->is_barrier_exist = v1->is_barrier_exist;
v2->is_finish_redo_cmd_sent = v1->is_finish_redo_cmd_sent;
rc = memcpy_s((void *)&(v2->local_redo_stats), sizeof(cm_redo_stats), (void *const)&(v1->local_redo_stats),
sizeof(cm_redo_stats));
securec_check_intval(rc, (void)rc);
CmLocalReplconninfoV1ToV2(&v1->local_status, &v2->local_status);
rc = memcpy_s((void *)&(v2->parallel_redo_status), sizeof(RedoStatsData), (void *const)&(v1->parallel_redo_status),
sizeof(RedoStatsData));
securec_check_intval(rc, (void)rc);
v2->phony_dead_interval = v1->phony_dead_interval;
v2->phony_dead_times = v1->phony_dead_times;
v2->printBegin = v1->printBegin;
rc = memcpy_s((void *)&(v2->printBegin), sizeof(cmTime_t), (void *const)&(v1->printBegin), sizeof(cmTime_t));
securec_check_intval(rc, (void)rc);
rc = snprintf_s(v2->query_barrierId, BARRIERLEN, BARRIERLEN-1, "%s", v1->query_barrierId);
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v2->receive_status), sizeof(cm_receiver_replconninfo), (void *const)&(v1->receive_status),
sizeof(cm_receiver_replconninfo));
securec_check_intval(rc, (void)rc);
v2->send_gs_guc_time = v1->send_gs_guc_time;
v2->sender_count = v1->sender_count;
rc = memcpy_s((void *)&(v2->sender_status[0]), CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo),
(void *const)v1->sender_status, CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo));
securec_check_intval(rc, (void)rc);
v2->sendFailoverTimes = v1->sendFailoverTimes;
v2->sync_standby_mode = v1->sync_standby_mode;
v2->syncDone = v1->syncDone;
}
void CmDnReportStatusMsgV2ToV1(const CmDnReportStatusMsg *v2, CmDnReportStatusMsg_ipv4 *v1)
{
v1->arbiTime = v2->arbiTime;
v1->arbitrateFlag = v2->arbitrateFlag;
v1->archive_LSN = v2->archive_LSN;
errno_t rc = snprintf_s(v1->barrierID, BARRIERLEN, BARRIERLEN-1, "%s", v2->barrierID);
securec_check_intval(rc, (void)rc);
v1->barrierLSN = v2->barrierLSN;
rc = memcpy_s((void *)&(v1->build_info), sizeof(BuildState), (void *const)&(v2->build_info), sizeof(BuildState));
securec_check_intval(rc, (void)rc);
v1->ckpt_redo_point = v2->ckpt_redo_point;
v1->dn_restart_counts = v2->dn_restart_counts;
v1->dn_restart_counts_in_hour = v2->dn_restart_counts_in_hour;
rc = memcpy_s((void *)&(v1->dnLp), sizeof(DatanodelocalPeer), (void *const)&(v2->dnLp), sizeof(DatanodelocalPeer));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v1->dnSyncList), sizeof(DatanodeSyncList), (void *const)&(v2->dnSyncList),
sizeof(DatanodeSyncList));
securec_check_intval(rc, (void)rc);
v1->failoverStep = v2->failoverStep;
v1->failoverTimeout = v2->failoverTimeout;
v1->flush_LSN = v2->flush_LSN;
v1->is_barrier_exist = v2->is_barrier_exist;
v1->is_finish_redo_cmd_sent = v2->is_finish_redo_cmd_sent;
rc = memcpy_s((void *)&(v1->local_redo_stats), sizeof(cm_redo_stats), (void *const)&(v2->local_redo_stats),
sizeof(cm_redo_stats));
securec_check_intval(rc, (void)rc);
CmLocalReplconninfoV2ToV1(&v2->local_status, &v1->local_status);
rc = memcpy_s((void *)&(v1->parallel_redo_status), sizeof(RedoStatsData), (void *const)&(v2->parallel_redo_status),
sizeof(RedoStatsData));
securec_check_intval(rc, (void)rc);
v1->phony_dead_interval = v2->phony_dead_interval;
v1->phony_dead_times = v2->phony_dead_times;
v1->printBegin = v2->printBegin;
rc = memcpy_s((void *)&(v1->printBegin), sizeof(cmTime_t), (void *const)&(v2->printBegin), sizeof(cmTime_t));
securec_check_intval(rc, (void)rc);
rc = snprintf_s(v1->query_barrierId, BARRIERLEN, BARRIERLEN-1, "%s", v2->query_barrierId);
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v1->receive_status), sizeof(cm_receiver_replconninfo), (void *const)&(v2->receive_status),
sizeof(cm_receiver_replconninfo));
securec_check_intval(rc, (void)rc);
v1->send_gs_guc_time = v2->send_gs_guc_time;
v1->sender_count = v2->sender_count;
rc = memcpy_s((void *)&(v1->sender_status[0]), CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo),
(void *const)v2->sender_status, CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo));
securec_check_intval(rc, (void)rc);
v1->sendFailoverTimes = v2->sendFailoverTimes;
v1->sync_standby_mode = v2->sync_standby_mode;
v1->syncDone = v2->syncDone;
}
void CmToCtlGetDatanodeRelationAckV1ToV2(const cm_to_ctl_get_datanode_relation_ack_ipv4 *v1,
cm_to_ctl_get_datanode_relation_ack *v2)
{
v2->command_result = v1->command_result;
for (uint32 i = 0; i < CM_PRIMARY_STANDBY_MAX_NUM; ++i) {
CmDnReportStatusMsgV1ToV2(&v1->data_node_member[i], &v2->data_node_member[i]);
}
errno_t rc = memcpy_s((void *)&(v2->gtm_member[0]),
CM_PRIMARY_STANDBY_NUM * sizeof(cm_instance_gtm_report_status),
(void *const)v1->gtm_member,
CM_PRIMARY_STANDBY_NUM * sizeof(cm_instance_gtm_report_status));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v2->instanceMember[0]),
CM_PRIMARY_STANDBY_MAX_NUM * sizeof(CM_PRIMARY_STANDBY_MAX_NUM),
(void *const)v1->instanceMember,
CM_PRIMARY_STANDBY_MAX_NUM * sizeof(cm_instance_role_status));
securec_check_intval(rc, (void)rc);
v2->member_index = v1->member_index;
}
void CmToCtlGetDatanodeRelationAckV2ToV1(const cm_to_ctl_get_datanode_relation_ack *v2,
cm_to_ctl_get_datanode_relation_ack_ipv4 *v1)
{
v1->command_result = v2->command_result;
for (uint32 i = 0; i < CM_PRIMARY_STANDBY_MAX_NUM; ++i) {
CmDnReportStatusMsgV2ToV1(&v2->data_node_member[i], &v1->data_node_member[i]);
}
errno_t rc = memcpy_s((void *)&(v1->gtm_member[0]),
CM_PRIMARY_STANDBY_NUM * sizeof(cm_instance_gtm_report_status),
(void *const)v2->gtm_member,
CM_PRIMARY_STANDBY_NUM * sizeof(cm_instance_gtm_report_status));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v1->instanceMember[0]),
CM_PRIMARY_STANDBY_MAX_NUM * sizeof(CM_PRIMARY_STANDBY_MAX_NUM),
(void *const)v2->instanceMember,
CM_PRIMARY_STANDBY_MAX_NUM * sizeof(cm_instance_role_status));
securec_check_intval(rc, (void)rc);
v1->member_index = v2->member_index;
}
void CmToCtlInstanceDatanodeStatusV1ToV2(const cm_to_ctl_instance_datanode_status_ipv4 *v1,
cm_to_ctl_instance_datanode_status *v2)
{
errno_t rc = memcpy_s((void *)&(v2->build_info),
sizeof(BuildState),
(void *const)&(v1->build_info),
sizeof(BuildState));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v2->local_redo_stats),
sizeof(cm_redo_stats),
(void *const)&(v1->local_redo_stats),
sizeof(cm_redo_stats));
securec_check_intval(rc, (void)rc);
CmLocalReplconninfoV1ToV2(&v1->local_status, &v2->local_status);
rc = memcpy_s((void *)&(v2->parallel_redo_status),
sizeof(RedoStatsData),
(void *const)&(v1->parallel_redo_status),
sizeof(RedoStatsData));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v2->receive_status),
sizeof(cm_receiver_replconninfo),
(void *const)&(v1->receive_status),
sizeof(cm_receiver_replconninfo));
securec_check_intval(rc, (void)rc);
v2->send_gs_guc_time = v1->send_gs_guc_time;
v2->sender_count = v1->sender_count;
rc = memcpy_s((void *)&(v2->sender_status[0]),
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo),
(void *const)v1->sender_status,
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo));
securec_check_intval(rc, (void)rc);
v2->sync_standby_mode = v1->sync_standby_mode;
}
void CmToCtlInstanceDatanodeStatusV2ToV1(const cm_to_ctl_instance_datanode_status *v2,
cm_to_ctl_instance_datanode_status_ipv4 *v1)
{
errno_t rc = memcpy_s((void *)&(v1->build_info),
sizeof(BuildState),
(void *const)&(v2->build_info),
sizeof(BuildState));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v1->local_redo_stats),
sizeof(cm_redo_stats),
(void *const)&(v2->local_redo_stats),
sizeof(cm_redo_stats));
securec_check_intval(rc, (void)rc);
CmLocalReplconninfoV2ToV1(&v2->local_status, &v1->local_status);
rc = memcpy_s((void *)&(v1->parallel_redo_status),
sizeof(RedoStatsData),
(void *const)&(v2->parallel_redo_status),
sizeof(RedoStatsData));
securec_check_intval(rc, (void)rc);
rc = memcpy_s((void *)&(v1->receive_status),
sizeof(cm_receiver_replconninfo),
(void *const)&(v2->receive_status),
sizeof(cm_receiver_replconninfo));
securec_check_intval(rc, (void)rc);
v1->send_gs_guc_time = v2->send_gs_guc_time;
v1->sender_count = v2->sender_count;
rc = memcpy_s((void *)&(v1->sender_status[0]),
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo),
(void *const)v2->sender_status,
CM_MAX_SENDER_NUM * sizeof(cm_sender_replconninfo));
securec_check_intval(rc, (void)rc);
v1->sync_standby_mode = v2->sync_standby_mode;
}
void CmToCtlInstanceStatusV1ToV2(const cm_to_ctl_instance_status_ipv4 *v1, cm_to_ctl_instance_status *v2)
{
v2->coordinatemember = v1->coordinatemember;
errno_t rc = memcpy_s((void *)&(v2->coordinatemember),
sizeof(cm_to_ctl_instance_coordinate_status),
(void *const)&(v1->coordinatemember),
sizeof(cm_to_ctl_instance_coordinate_status));
securec_check_intval(rc, (void)rc);
CmToCtlInstanceDatanodeStatusV1ToV2(&v1->data_node_member, &v2->data_node_member);
v2->fenced_UDF_status = v1->fenced_UDF_status;
rc = memcpy_s((void *)&(v2->gtm_member),
sizeof(cm_to_ctl_instance_gtm_status),
(void *const)&(v1->gtm_member),
sizeof(cm_to_ctl_instance_gtm_status));
securec_check_intval(rc, (void)rc);
v2->instance_type = v1->instance_type;
v2->instanceId = v1->instanceId;
v2->is_central = v1->is_central;
v2->member_index = v1->member_index;
v2->msg_type = v1->msg_type;
v2->node = v1->node;
}
void CmToCtlInstanceStatusV2ToV1(const cm_to_ctl_instance_status *v2, cm_to_ctl_instance_status_ipv4 *v1)
{
v1->coordinatemember = v2->coordinatemember;
errno_t rc = memcpy_s((void *)&(v1->coordinatemember),
sizeof(cm_to_ctl_instance_coordinate_status),
(void *const)&(v2->coordinatemember),
sizeof(cm_to_ctl_instance_coordinate_status));
securec_check_intval(rc, (void)rc);
CmToCtlInstanceDatanodeStatusV2ToV1(&v2->data_node_member, &v1->data_node_member);
v1->fenced_UDF_status = v2->fenced_UDF_status;
rc = memcpy_s((void *)&(v1->gtm_member),
sizeof(cm_to_ctl_instance_gtm_status),
(void *const)&(v2->gtm_member),
sizeof(cm_to_ctl_instance_gtm_status));
securec_check_intval(rc, (void)rc);
v1->instance_type = v2->instance_type;
v1->instanceId = v2->instanceId;
v1->is_central = v2->is_central;
v1->member_index = v2->member_index;
v1->msg_type = v2->msg_type;
v1->node = v2->node;
}
void GetCtlInstanceStatusFromRecvMsg(char *receiveMsg, cm_to_ctl_instance_status *ctlInstanceStatusPtr)
{
if (undocumentedVersion != 0 && undocumentedVersion < SUPPORT_IPV6_VERSION) {
cm_to_ctl_instance_status_ipv4 *statusPtrIpv4 = (cm_to_ctl_instance_status_ipv4 *)receiveMsg;
CmToCtlInstanceStatusV1ToV2(statusPtrIpv4, ctlInstanceStatusPtr);
} else {
errno_t rc = memcpy_s(ctlInstanceStatusPtr,
sizeof(cm_to_ctl_instance_status),
receiveMsg,
sizeof(cm_to_ctl_instance_status));
securec_check_intval(rc, (void)rc);
}
}
#ifdef __cplusplus
}
#endif