- Sender may send broadcast big messages (> 65K) then small messages (< 65K). Current MDS just loop via all destinations to unicast all fragmented messages to one by one destinations. But sending multicast non-fragment messages to all destinations. Therefor, receivers may get messages with incorrect order, non-fragment messages may come before fragmented messages. For example, it may lead to OUT OF ORDER for IMMNDs during IMMD sync. - Solution: support send multicast each fragmented messages to avoid disorder of arrived broadcast messages. --- src/mds/mds_c_sndrcv.c | 3 +- src/mds/mds_dt_tipc.c | 104 +++++++++++++++++++------------------------------ 2 files changed, 40 insertions(+), 67 deletions(-)
diff --git a/src/mds/mds_c_sndrcv.c b/src/mds/mds_c_sndrcv.c index 703bc8e..7850ac7 100644 --- a/src/mds/mds_c_sndrcv.c +++ b/src/mds/mds_c_sndrcv.c @@ -4496,8 +4496,7 @@ static uint32_t mcm_pvt_process_svc_bcast_common( info_result->key.vdest_id, req, 0, info_result->key.adest, pri); if ((svc_cb->subtn_info->prev_ver_sub_count == 0) && - (tipc_mode_enabled) && (tipc_mcast_enabled) && - (to_msg.bcast_buff_len < MDS_DIRECT_BUF_MAXSIZE)) { + (tipc_mode_enabled) && (tipc_mcast_enabled)) { m_MDS_LOG_DBG( "MDTM: Break while(1) prev_ver_sub_count: %d svc_id =%s(%d) to_msg.bcast_buff_len: %d ", svc_cb->subtn_info->prev_ver_sub_count, diff --git a/src/mds/mds_dt_tipc.c b/src/mds/mds_dt_tipc.c index a3abff5..d8f8c78 100644 --- a/src/mds/mds_dt_tipc.c +++ b/src/mds/mds_dt_tipc.c @@ -2856,6 +2856,7 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_REQ *req, uint32_t seq_num, uint16_t frag_val = 0; uint32_t sum_mds_hdr_plus_mdtm_hdr_plus_len; int version = req->msg_arch_word & 0x7; + uint32_t ret = NCSCC_RC_SUCCESS; if (version > 1) { sum_mds_hdr_plus_mdtm_hdr_plus_len = @@ -2914,95 +2915,66 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_REQ *req, uint32_t seq_num, frag_val = NO_FRAG_BIT | i; } { + uint32_t hdr_plus = (i == 1) ? + sum_mds_hdr_plus_mdtm_hdr_plus_len : MDTM_FRAG_HDR_PLUS_LEN_2; uint8_t *body = NULL; body = calloc(1, len_buf); + p8 = (uint8_t *)m_MMGR_DATA_AT_START(usrbuf, len_buf - hdr_plus, + (char *)(body + hdr_plus)); + if (p8 != (body + hdr_plus)) + memcpy((body + hdr_plus), p8, len_buf - hdr_plus); if (i == 1) { - p8 = (uint8_t *)m_MMGR_DATA_AT_START( - usrbuf, - (len_buf - - sum_mds_hdr_plus_mdtm_hdr_plus_len), - (char - *)(body + - sum_mds_hdr_plus_mdtm_hdr_plus_len)); - - if (p8 != - (body + sum_mds_hdr_plus_mdtm_hdr_plus_len)) - memcpy( - (body + - sum_mds_hdr_plus_mdtm_hdr_plus_len), - p8, - (len_buf - - sum_mds_hdr_plus_mdtm_hdr_plus_len)); - if (NCSCC_RC_SUCCESS != mdtm_add_mds_hdr(body, req)) { m_MDS_LOG_ERR( "MDTM: frg MDS hdr addition failed\n"); - free(body); - m_MMGR_FREE_BUFR_LIST(usrbuf); - return NCSCC_RC_FAILURE; - } - - if (NCSCC_RC_SUCCESS != - mdtm_add_frag_hdr(body, len_buf, seq_num, - frag_val)) { - m_MDS_LOG_ERR( - "MDTM: Frag hdr addition failed\n"); m_MMGR_FREE_BUFR_LIST(usrbuf); free(body); return NCSCC_RC_FAILURE; } + } + if (NCSCC_RC_SUCCESS != + mdtm_add_frag_hdr(body, len_buf, seq_num, + frag_val)) { + m_MDS_LOG_ERR( + "MDTM: Frag hde addition failed\n"); + m_MMGR_FREE_BUFR_LIST(usrbuf); + free(body); + return NCSCC_RC_FAILURE; + } + if (((req->snd_type == MDS_SENDTYPE_RBCAST) || + (req->snd_type == MDS_SENDTYPE_BCAST)) && + (version > 0) && (tipc_mcast_enabled)) { m_MDS_LOG_DBG( - "MDTM:Sending message with Service Seqno=%d, Fragment Seqnum=%d, frag_num=%d, TO Dest_Tipc_id=<0x%08x:%u>", + "MDTM:Send Multicast message with Service Seqno=%d, Fragment Seqnum=%d, frag_num=%d " + "From svc_id = %s(%d) TO svc_id = %s(%d)", req->svc_seq_num, seq_num, frag_val, - id.node, id.ref); - mdtm_sendto(body, len_buf, id); - m_MMGR_REMOVE_FROM_START( - &usrbuf, - len_buf - - sum_mds_hdr_plus_mdtm_hdr_plus_len); - free(body); - len = - len - (len_buf - - sum_mds_hdr_plus_mdtm_hdr_plus_len); + get_svc_names(req->src_svc_id), req->src_svc_id, + get_svc_names(req->dest_svc_id), req->dest_svc_id); + ret = mdtm_mcast_sendto(body, len_buf, req); } else { - p8 = (uint8_t *)m_MMGR_DATA_AT_START( - usrbuf, len_buf - MDTM_FRAG_HDR_PLUS_LEN_2, - (char *)(body + MDTM_FRAG_HDR_PLUS_LEN_2)); - if (p8 != (body + MDTM_FRAG_HDR_PLUS_LEN_2)) - memcpy( - (body + MDTM_FRAG_HDR_PLUS_LEN_2), - p8, - len_buf - MDTM_FRAG_HDR_PLUS_LEN_2); - - if (NCSCC_RC_SUCCESS != - mdtm_add_frag_hdr(body, len_buf, seq_num, - frag_val)) { - m_MDS_LOG_ERR( - "MDTM: Frag hde addition failed\n"); - m_MMGR_FREE_BUFR_LIST(usrbuf); - free(body); - return NCSCC_RC_FAILURE; - } m_MDS_LOG_DBG( "MDTM:Sending message with Service Seqno=%d, Fragment Seqnum=%d, frag_num=%d, TO Dest_Tipc_id=<0x%08x:%u>", req->svc_seq_num, seq_num, frag_val, id.node, id.ref); - mdtm_sendto(body, len_buf, id); - m_MMGR_REMOVE_FROM_START( - &usrbuf, - (len_buf - MDTM_FRAG_HDR_PLUS_LEN_2)); + ret = mdtm_sendto(body, len_buf, id); + } + if (ret != NCSCC_RC_SUCCESS) { + // Failed to send a fragmented msg, stop sending + m_MMGR_FREE_BUFR_LIST(usrbuf); free(body); - len = - len - (len_buf - MDTM_FRAG_HDR_PLUS_LEN_2); - if (len == 0) - break; + break; } + m_MMGR_REMOVE_FROM_START(&usrbuf, len_buf - hdr_plus); + free(body); + len = len - (len_buf - hdr_plus); + if (len == 0) + break; } i++; frag_val = 0; } - return NCSCC_RC_SUCCESS; + return ret; } /********************************************************* @@ -3134,6 +3106,8 @@ static uint32_t mdtm_mcast_sendto(void *buffer, size_t size, m_MDS_LOG_INFO("MDTM: Successfully sent message"); return NCSCC_RC_SUCCESS; } else { + m_MDS_LOG_ERR("MDTM: Failed to send Multicast message err :%s", + strerror(errno)); return NCSCC_RC_FAILURE; } } -- 2.7.4 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel