Hi Thuan,

Ack with minor comments below.

Regards, Vu

> -----Original Message-----
> From: thuan.tran <thuan.t...@dektech.com.au>
> Sent: Wednesday, April 24, 2019 6:06 PM
> To: 'Vu Minh Nguyen' <vu.m.ngu...@dektech.com.au>;
> hans.nordeb...@ericsson.com; Minh Hon Chau
> <minh.c...@dektech.com.au>
> Cc: opensaf-devel@lists.sourceforge.net; thuan.tran
> <thuan.t...@dektech.com.au>
> Subject: [PATCH 1/1] mds: support multicast fragmented messages [#3033]
> 
> - 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) {
[Vu] is it better if we combine these 02 if into one, as:
If ((i === 1) && NCSCC_RC_SUCCESS != mdtm_add_mds_hdr(body, req)) {
        // error handling.
}
> -                             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");
[Vu] fix typo: hde = hdr?
> +                             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);
[Vu] can do return from here?
> -                             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

Reply via email to