- 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 | 59 ++++++++++++++++++++++++++++++++++++++++----------
2 files changed, 49 insertions(+), 13 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..837d206 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 =
@@ -2952,11 +2953,23 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_REQ *req,
uint32_t seq_num,
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);
+ if (((req->snd_type == MDS_SENDTYPE_RBCAST) ||
+ (req->snd_type == MDS_SENDTYPE_BCAST)) &&
+ (version > 0) && (tipc_mcast_enabled)) {
+ m_MDS_LOG_DBG(
+ "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,
+ 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 {
+ 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);
+ ret = mdtm_sendto(body, len_buf, id);
+ }
m_MMGR_REMOVE_FROM_START(
&usrbuf,
len_buf -
@@ -2965,6 +2978,11 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_REQ *req, uint32_t
seq_num,
len =
len - (len_buf -
sum_mds_hdr_plus_mdtm_hdr_plus_len);
+ if (ret != NCSCC_RC_SUCCESS) {
+ // Failed to send a fragmented msg,
stop sending
+ m_MMGR_FREE_BUFR_LIST(usrbuf);
+ break;
+ }
} else {
p8 = (uint8_t *)m_MMGR_DATA_AT_START(
usrbuf, len_buf - MDTM_FRAG_HDR_PLUS_LEN_2,
@@ -2984,11 +3002,23 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_REQ *req,
uint32_t seq_num,
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);
+ if (((req->snd_type == MDS_SENDTYPE_RBCAST) ||
+ (req->snd_type == MDS_SENDTYPE_BCAST)) &&
+ (version > 0) && (tipc_mcast_enabled)) {
+ m_MDS_LOG_DBG(
+ "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,
+ 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 {
+ 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);
+ ret = mdtm_sendto(body, len_buf, id);
+ }
m_MMGR_REMOVE_FROM_START(
&usrbuf,
(len_buf - MDTM_FRAG_HDR_PLUS_LEN_2));
@@ -2997,12 +3027,17 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_REQ *req,
uint32_t seq_num,
len - (len_buf - MDTM_FRAG_HDR_PLUS_LEN_2);
if (len == 0)
break;
+ if (ret != NCSCC_RC_SUCCESS) {
+ // Failed to send a fragmented msg,
stop sending
+ m_MMGR_FREE_BUFR_LIST(usrbuf);
+ break;
+ }
}
}
i++;
frag_val = 0;
}
- return NCSCC_RC_SUCCESS;
+ return ret;
}
/*********************************************************
@@ -3134,6 +3169,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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel