- 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel