Great to see the performance improvement but seriously... This patch does the same thing my previous patch did in a more intrusive, more complex and non scalable way.
Compare: 4 files changed, 51 insertions(+), 25 deletions(-) With: 11 files changed, 374 insertions(+), 29 deletions(-) And for scalability, publishing an extra cluster wide port just for the purpose of understanding peer capabilities? I had solved that in a much more elegant way. I never got any feedback for that patch. I can not ack this patch. I propose you go back and test and review my original patch. Thanks, Hans On 01/29/2014 12:28 PM, mahesh.va...@oracle.com wrote: > osaf/libs/core/include/mds_papi.h | 4 +- > osaf/libs/core/include/ncsusrbuf.h | 17 ++- > osaf/libs/core/mds/include/mds_core.h | 25 +++ > osaf/libs/core/mds/include/mds_dt.h | 25 +++- > osaf/libs/core/mds/include/mds_dt2c.h | 1 + > osaf/libs/core/mds/include/mds_dt_tipc.h | 2 + > osaf/libs/core/mds/mds_c_api.c | 20 +++ > osaf/libs/core/mds/mds_c_db.c | 83 ++++++++++++ > osaf/libs/core/mds/mds_c_sndrcv.c | 2 +- > osaf/libs/core/mds/mds_dt_tipc.c | 206 > ++++++++++++++++++++++++++++-- > osaf/libs/core/mds/mds_dt_trans.c | 18 +- > 11 files changed, 374 insertions(+), 29 deletions(-) > > > 1) MDS fragmentation value changed from 1400 to MDS_DIRECT_BUF_MAXSIZE (65535 > maximum packet size)-(56 MDS header) , > #defined MDTM_NORMAL_MSG_FRAG_SIZE_MAX MDS_DIRECT_BUF_MAXSIZE . > > 2) MDS MDS_DIRECT_BUF_MAXSIZE value changed from 8000 to (65535 maximum > packet size)-(56 MDS header) , > #defined MDTM_NORMAL_MSG_FRAG_SIZE_MAX (65535 maximum packet size)-(56 MDS > header) > > 3) This PAYLOAD_BUF_SIZE value is suppose to be equal to > MDS_DIRECT_BUF_MAXSIZE > (65535 maximum packet size)-(56 MDS header) ,but in the previous releases of > Opensaf the value of TIPC inbuf size of MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) > TIPC was limited to(8000+MDS header ) , we have in-service Upgrade issue, > so it is not possible to send the new MDS_DIRECT_BUF_MAXSIZE (65535 maximum > packet size)-(56 MDS header) > value previous Opensaf version nodes , so for the current release it is > limited to 8000, > possibly adjust this in the future Opensaf releases to MDS_DIRECT_BUF_MAXSIZE. > > > 4) To support in-service MDS TIPC Upgrade issue MDTM_NORMAL_MSG_FRAG_SIZE_MIN > is provide, and this fragment size is used to send to previous version of > Opensaf Node > while in-service Upgrade. > > In the previous releases of Opensaf the value of TIPC inbuf size of > MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS header) , > we have in-service Upgrade issue, so it is not possible to send the new > MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet size)-(56 MDS header) > value previous Opensaf version nodes , so for the current release it is > limited to 8000, > possibly this will be removed in the future Opensaf releases . > > 5) To handle in-service Upgrade of fragmentation changes , New node do > install & subscribe its Node Mds version. > the MDTM_NORMAL_MSG_FRAG_SIZE_MIN fragment size is used to send to previous > version of Opensaf > Node while in-service Upgrade ,and the old nodes will not publishes so we > need to fragment to MDTM_NORMAL_MSG_FRAG_SIZE_MIN > size.mds_mdtm_node_info_install_tipc() & mds_mdtm_node_info_subscribe_tipc() > > diff --git a/osaf/libs/core/include/mds_papi.h > b/osaf/libs/core/include/mds_papi.h > --- a/osaf/libs/core/include/mds_papi.h > +++ b/osaf/libs/core/include/mds_papi.h > @@ -57,6 +57,8 @@ extern "C" { > 1) Basic data type > \**********************************************************************/ > > +/* The NODE version of MDS */ > +#define MDS_NODE_VERSION 1 > /* The version of MDS that this header ships with */ > #define MDS_MAJOR_VERSION 2 > #define MDS_MINOR_VERSION 1 > @@ -208,7 +210,7 @@ extern "C" { > #define NCSMDS_MAX_VDEST 32767 > #define NCSMDS_MAX_SVCS 1023 > > -#define MDS_DIRECT_BUF_MAXSIZE 8000 > +#define MDS_DIRECT_BUF_MAXSIZE (65535 - 56) /*(65535 maximum packet > size)-(56 MDS header)*/ > typedef uint8_t *MDS_DIRECT_BUFF; > #define m_MDS_ALLOC_DIRECT_BUFF(size) mds_alloc_direct_buff(size) > #define m_MDS_FREE_DIRECT_BUFF(x) mds_free_direct_buff(x) > diff --git a/osaf/libs/core/include/ncsusrbuf.h > b/osaf/libs/core/include/ncsusrbuf.h > --- a/osaf/libs/core/include/ncsusrbuf.h > +++ b/osaf/libs/core/include/ncsusrbuf.h > @@ -47,8 +47,23 @@ > #ifdef __cplusplus > extern "C" { > #endif > + /* This PAYLOAD_BUF_SIZE value is suppose to be equal to > MDS_DIRECT_BUF_MAXSIZE , > + but in the previous releases of Opensaf the value of TIPC inbuf > size of > + MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS > header ) , > + we have in-service Upgrade issue, so it is not possible to send the > new > + MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet size)-(56 MDS header) > + value previous Opensaf version nodes , so for the current release > it is limited to 8000, > + possibly adjust this in the future Opensaf releases to > MDS_DIRECT_BUF_MAXSIZE. > > -#define PAYLOAD_BUF_SIZE 1400 /* default size of packet_data bufrs */ > + IMP TCP Note : Their is NO issue with TCP in-service Upgrade ,The > value of > + SO_RCVBUF & SO_SNDBUF of TCP sockets was set to 64000 ( > MDS_SND_RCV_SIZE) > + using setsockopt() ,the kernel doubles this value ,and this doubled > value is returned by > + getsockopt(). > + Replace PAYLOAD_BUF_SIZE 8000 value with MDS_DIRECT_BUF_MAXSIZE > (65535 maximum packet size)-(56 MDS header) , > + after one cycle of in-service upgrade (below 4.4.FC Opensaf rpms ) > #define PAYLOAD_BUF_SIZE (65535 - 56) > + */ > + > +#define PAYLOAD_BUF_SIZE 8000 > > > /***************************************************************************** > > diff --git a/osaf/libs/core/mds/include/mds_core.h > b/osaf/libs/core/mds/include/mds_core.h > --- a/osaf/libs/core/mds/include/mds_core.h > +++ b/osaf/libs/core/mds/include/mds_core.h > @@ -240,6 +240,19 @@ typedef struct mds_vdest_info { > > } MDS_VDEST_INFO; > > +typedef struct mds_node_info { > + > + /* Indexing info */ > + NCS_PATRICIA_NODE node; > + > + /* Node info */ > + NODE_ID node_id; /* Serves as Node ID. Key for Patricia node */ > + uint16_t node_mds_ver; /* Node MDS version */ > + /* PWE and service list */ > + MDS_PWE_INFO *pwe_list; > + > +} MDS_NODE_INFO; > + > typedef struct mds_svc_info { > > /* Indexing info */ > @@ -284,6 +297,7 @@ typedef struct mds_mcm_cb { > NCS_PATRICIA_TREE subtn_results; > NCS_PATRICIA_TREE svc_list; /* Tree of MDS_SVC_INFO information */ > NCS_PATRICIA_TREE vdest_list; /* Tree of MDS_VDEST_INFO information */ > + NCS_PATRICIA_TREE node_list; /* Tree of MDS_NODE_INFO information */ > } MDS_MCM_CB; > > /* Global MDSCB */ > @@ -376,6 +390,11 @@ extern uint32_t mds_vdest_tbl_get_subtn_ > extern uint32_t mds_vdest_tbl_get_vdest_info_cb(MDS_VDEST_ID vdest_id, > MDS_VDEST_INFO **vdest_info); > extern uint32_t mds_vdest_tbl_cleanup(void); > > +/* NODE TABLE Operations */ > +extern uint32_t mds_node_tbl_add(NODE_ID node_id, uint16_t node_mds_ver); > +extern uint32_t mds_node_tbl_del(NODE_ID node_id); > +extern uint32_t mds_node_tbl_query(NODE_ID node_id); > + > /* PWE TABLE Operations */ > > extern uint32_t mds_pwe_tbl_add(MDS_VDEST_HDL vdest_hdl, PW_ENV_ID pwe_id, > MDS_PWE_HDL *pwe_hdl); > @@ -512,6 +531,12 @@ extern uint32_t mds_mcm_free_msg_uba_sta > #define m_MMGR_FREE_VDEST_INFO(p) m_NCS_MEM_FREE(p, > NCS_MEM_REGION_TRANSIENT, \ > NCS_SERVICE_ID_MDS, MDS_MEM_VDEST_INFO) > > +#define m_MMGR_ALLOC_NODE_INFO (MDS_NODE_INFO > *)m_NCS_MEM_ALLOC(sizeof(MDS_NODE_INFO), \ > + NCS_MEM_REGION_TRANSIENT, NCS_SERVICE_ID_MDS, MDS_MEM_NODE_INFO) > + > +#define m_MMGR_FREE_NODE_INFO(p) m_NCS_MEM_FREE(p, > NCS_MEM_REGION_TRANSIENT, \ > + NCS_SERVICE_ID_MDS, MDS_MEM_NODE_INFO) > + > #define m_MMGR_ALLOC_PWE_INFO (MDS_PWE_INFO > *)m_NCS_MEM_ALLOC(sizeof(MDS_PWE_INFO), \ > NCS_MEM_REGION_TRANSIENT, \ > NCS_SERVICE_ID_MDS, MDS_MEM_PWE_INFO) > diff --git a/osaf/libs/core/mds/include/mds_dt.h > b/osaf/libs/core/mds/include/mds_dt.h > --- a/osaf/libs/core/mds/include/mds_dt.h > +++ b/osaf/libs/core/mds/include/mds_dt.h > @@ -109,10 +109,28 @@ typedef struct mdtm_reassembly_queue { > > #define MDTM_MAX_DIRECT_BUFF_SIZE MDTM_MAX_SEGMENT_SIZE > > -#define MDTM_NORMAL_MSG_FRAG_SIZE 1400 > +/* To support in-service Upgrade issue MDTM_NORMAL_MSG_FRAG_SIZE_MIN > + is provide, and this fragment size is used to send to previous version of > Opensaf Node > + while in-service Upgrade. > > -#define MDTM_RECV_BUFFER_SIZE > ((MDS_DIRECT_BUF_MAXSIZE>MDTM_NORMAL_MSG_FRAG_SIZE)? \ > - > (MDS_DIRECT_BUF_MAXSIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN):(MDTM_NORMAL_MSG_FRAG_SIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN)) > + In the previous releases of Opensaf the value of TIPC inbuf size of > + MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS > header) , > + we have in-service Upgrade issue, so it is not possible to send the new > + MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet size)-(56 MDS header) > + value previous Opensaf version nodes , so for the current release it is > limited to 8000, > + possibly adjust this in the future Opensaf releases to > MDS_DIRECT_BUF_MAXSIZE. > + > + IMP TCP Note : Their is NO issue with TCP in-service Upgrade ,The value > of > + SO_RCVBUF & SO_SNDBUF of TCP sockets was set to 64000 ( MDS_SND_RCV_SIZE) > + using setsockopt() ,the kernel doubles this value ,and this doubled > value is returned by > + getsockopt(). So MDTM_NORMAL_MSG_FRAG_SIZE_MAX size is used to send for > + for both previous & current versitions of Opensaf nodes which are using > MDS TCP as transport*/ > +#define MDTM_NORMAL_MSG_FRAG_SIZE_MIN 8000 > + > +#define MDTM_NORMAL_MSG_FRAG_SIZE_MAX MDS_DIRECT_BUF_MAXSIZE > + > +#define MDTM_RECV_BUFFER_SIZE > ((MDS_DIRECT_BUF_MAXSIZE>MDTM_NORMAL_MSG_FRAG_SIZE_MAX)? \ > + > (MDS_DIRECT_BUF_MAXSIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN):(MDTM_NORMAL_MSG_FRAG_SIZE_MAX+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN)) > > /* Prefixes and defines regarding to the MDS_TIPC*/ > > @@ -124,6 +142,7 @@ typedef enum { > MDS_PCON_INST_TYPE = 0x00030000, > MDS_NODE_INST_TYPE = 0x00000000, > MDS_PROCESS_INST_TYPE = 0x00050000, > + MDS_NODE_INFO_TYPE = 0x00060000, > } MDS_MDTM_INST_TYPES; > > /* Common to TCP and TIPC */ > diff --git a/osaf/libs/core/mds/include/mds_dt2c.h > b/osaf/libs/core/mds/include/mds_dt2c.h > --- a/osaf/libs/core/mds/include/mds_dt2c.h > +++ b/osaf/libs/core/mds/include/mds_dt2c.h > @@ -223,6 +223,7 @@ typedef enum { > MDS_MEM_HDL_LIST, > MDS_MEM_CACHED_EVENTS_LIST, > MDS_MEM_BCAST_BUFF_LIST, > + MDS_MEM_NODE_INFO, > } MDS_MEM_SUB_ID; > > /* ******************************************** */ > diff --git a/osaf/libs/core/mds/include/mds_dt_tipc.h > b/osaf/libs/core/mds/include/mds_dt_tipc.h > --- a/osaf/libs/core/mds/include/mds_dt_tipc.h > +++ b/osaf/libs/core/mds/include/mds_dt_tipc.h > @@ -92,6 +92,8 @@ extern uint32_t mds_mdtm_vdest_subscribe > extern uint32_t mds_mdtm_vdest_unsubscribe_tipc(MDS_VDEST_ID vdest_id, > MDS_SUBTN_REF_VAL subtn_ref_val); > extern uint32_t mds_mdtm_tx_hdl_register_tipc(MDS_DEST adest); > extern uint32_t mds_mdtm_tx_hdl_unregister_tipc(MDS_DEST adest); > +extern uint32_t mds_mdtm_node_info_install_tipc(); > +extern uint32_t mds_mdtm_node_info_subscribe_tipc(MDS_SUBTN_REF_VAL > *subtn_ref_val); > > extern uint32_t mds_mdtm_send_tipc(MDTM_SEND_REQ *req); > > diff --git a/osaf/libs/core/mds/mds_c_api.c b/osaf/libs/core/mds/mds_c_api.c > --- a/osaf/libs/core/mds/mds_c_api.c > +++ b/osaf/libs/core/mds/mds_c_api.c > @@ -3782,6 +3782,23 @@ uint32_t mds_mcm_init(void) > return NCSCC_RC_FAILURE; > } > > + /* NODE TREE */ > + memset(&pat_tree_params, 0, sizeof(NCS_PATRICIA_PARAMS)); > + pat_tree_params.key_size = sizeof(NODE_ID); > + if (NCSCC_RC_SUCCESS != > ncs_patricia_tree_init(&gl_mds_mcm_cb->node_list, &pat_tree_params)) { > + m_MDS_LOG_ERR("MCM_API : patricia_tree_init: subscription: > failure, L mds_mcm_init"); > + if (NCSCC_RC_SUCCESS != > ncs_patricia_tree_destroy(&gl_mds_mcm_cb->svc_list)) { > + m_MDS_LOG_ERR("MCM_API : patricia_tree_destroy: service > :failure, L mds_mcm_init"); > + } > + if (NCSCC_RC_SUCCESS != > ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list)) { > + m_MDS_LOG_ERR("MCM_API : patricia_tree_destroy: vdest > :failure, L mds_mcm_init"); > + } > + if (NCSCC_RC_SUCCESS != > ncs_patricia_tree_destroy(&gl_mds_mcm_cb->subtn_results)) { > + m_MDS_LOG_ERR("MCM_API : patricia_tree_destroy: > subtn_results :failure, L mds_mcm_init"); > + } > + return NCSCC_RC_FAILURE; > + } > + > /* Add VDEST for ADEST entry in tree */ > vdest_for_adest_node = m_MMGR_ALLOC_VDEST_INFO; > memset(vdest_for_adest_node, 0, sizeof(MDS_VDEST_INFO)); > @@ -3824,6 +3841,9 @@ uint32_t mds_mcm_destroy(void) > /* VDEST TREE */ > ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list); > > + /* NODE TREE */ > + ncs_patricia_tree_destroy(&gl_mds_mcm_cb->node_list); > + > /* Free MCM control block */ > m_MMGR_FREE_MCM_CB(gl_mds_mcm_cb); > > diff --git a/osaf/libs/core/mds/mds_c_db.c b/osaf/libs/core/mds/mds_c_db.c > --- a/osaf/libs/core/mds/mds_c_db.c > +++ b/osaf/libs/core/mds/mds_c_db.c > @@ -376,6 +376,89 @@ uint32_t mds_vdest_tbl_cleanup(void) > > /* ******************************************** */ > /* ******************************************** */ > +/* NODE TABLE Operations */ > +/* ******************************************** */ > +/* ******************************************** */ > +/********************************************************* > + Function NAME: mds_node_tbl_add > + *********************************************************/ > +uint32_t mds_node_tbl_add(NODE_ID node_id, uint16_t node_mds_ver) > +{ > + MDS_NODE_INFO *node_info; > + > + m_MDS_LOG_DBG("MCM_DB : Entering : mds_node_tbl_add"); > + > + /* Check if node is not already created */ > + if (ncs_patricia_tree_get(&gl_mds_mcm_cb->node_list, (uint8_t > *)&node_id) != NULL) { > + m_MDS_LOG_DBG("MCM_DB : Leaving : F : mds_node_tbl_add : VDEST > already present"); > + return NCSCC_RC_FAILURE; > + } > + > + > + node_info = m_MMGR_ALLOC_NODE_INFO; > + memset(node_info, 0, sizeof(MDS_NODE_INFO)); > + > + node_info->node_id = node_id; > + node_info->node_mds_ver = node_mds_ver; > + > + > + m_MDS_LOG_DBG("node_id=%d node_mds_ver=%d", node_info->node_id, > node_info->node_mds_ver); > + node_info->node.key_info = (uint8_t *)&node_info->node_id; > + > + ncs_patricia_tree_add(&gl_mds_mcm_cb->node_list, (NCS_PATRICIA_NODE > *)&node_info->node); > + > + m_MDS_LOG_DBG("MCM_DB : Leaving : S : mds_node_tbl_added node_id : > %d",node_id); > + return NCSCC_RC_SUCCESS; > +} > + > +/********************************************************* > + Function NAME: mds_node_tbl_del > + *********************************************************/ > +uint32_t mds_node_tbl_del(NODE_ID node_id) > +{ > + MDS_NODE_INFO *node_info = NULL; > + > + m_MDS_LOG_DBG("MCM_DB : Entering : mds_node_tbl_del"); > + > + /* Check if node is already created */ > + node_info = (MDS_NODE_INFO > *)ncs_patricia_tree_get(&gl_mds_mcm_cb->node_list, (uint8_t *)&node_id); > + if (node_info == NULL) { > + m_MDS_LOG_DBG("MCM_DB : Leaving : F : mds_node_tbl_del : > NODE_ID not present"); > + return NCSCC_RC_FAILURE; > + } else { > + > + ncs_patricia_tree_del(&gl_mds_mcm_cb->node_list, > (NCS_PATRICIA_NODE *)node_info); > + > + /* Free memory of NODE_INFO */ > + m_MMGR_FREE_NODE_INFO(node_info); > + } > + m_MDS_LOG_DBG("MCM_DB : Leaving : S : mds_node_tbl_del"); > + return NCSCC_RC_SUCCESS; > +} > + > +/********************************************************* > + Function NAME: mds_node_tbl_query > + *********************************************************/ > +uint32_t mds_node_tbl_query(NODE_ID node_id) > +{ > + MDS_NODE_INFO *node_info = NULL; > + > + m_MDS_LOG_DBG("MCM_DB : Entering : mds_node_tbl_query"); > + > + /* Check if node is already created */ > + node_info = (MDS_NODE_INFO > *)ncs_patricia_tree_get(&gl_mds_mcm_cb->node_list, (uint8_t *)&node_id); > + if (node_info == NULL) { > + m_MDS_LOG_DBG("MCM_DB : Leaving : F : mds_node_tbl_query : > NODE_ID not present"); > + return NCSCC_RC_FAILURE; > + } else { > + m_MDS_LOG_DBG("MCM_DB : Leaving : S : mds_node_tbl_query"); > + return NCSCC_RC_SUCCESS; > + } > + > +} > + > +/* ******************************************** */ > +/* ******************************************** */ > /* PWE TABLE Operations */ > /* ******************************************** */ > /* ******************************************** */ > diff --git a/osaf/libs/core/mds/mds_c_sndrcv.c > b/osaf/libs/core/mds/mds_c_sndrcv.c > --- a/osaf/libs/core/mds/mds_c_sndrcv.c > +++ b/osaf/libs/core/mds/mds_c_sndrcv.c > @@ -34,7 +34,7 @@ > 2. Direct send in which the user provides MDS with a flat buffer > pointer and length > of the buffer. Memory will be allocated to the flat buffer by > using the MDS api > m_MDS_ALLOC_DIRECT_BUFF(size) (where size is the number of bytes > of memory to be > - allocated and is limited to 8000 bytes). As buffer pointer is > allocated by MDS, in all the > + allocated and is limited to MDS_DIRECT_BUF_MAXSIZE bytes). As > buffer pointer is allocated by MDS, in all the > cases of success and failure of DIRECT sends, memory will be > freed by the MDS and application > should not free the memory. > > diff --git a/osaf/libs/core/mds/mds_dt_tipc.c > b/osaf/libs/core/mds/mds_dt_tipc.c > --- a/osaf/libs/core/mds/mds_dt_tipc.c > +++ b/osaf/libs/core/mds/mds_dt_tipc.c > @@ -85,6 +85,8 @@ uint32_t mds_mdtm_vdest_install_tipc(MDS > uint32_t mds_mdtm_vdest_uninstall_tipc(MDS_VDEST_ID vdest_id); > uint32_t mds_mdtm_vdest_subscribe_tipc(MDS_VDEST_ID vdest_id, > MDS_SUBTN_REF_VAL *subtn_ref_val); > uint32_t mds_mdtm_vdest_unsubscribe_tipc(MDS_VDEST_ID vdest_id, > MDS_SUBTN_REF_VAL subtn_ref_val); > +uint32_t mds_mdtm_node_info_install_tipc(); > +uint32_t mds_mdtm_node_info_subscribe_tipc(MDS_SUBTN_REF_VAL *subtn_ref_val); > uint32_t mds_mdtm_tx_hdl_register_tipc(MDS_DEST adest); > uint32_t mds_mdtm_tx_hdl_unregister_tipc(MDS_DEST adest); > > @@ -128,6 +130,10 @@ static MDS_SUBTN_REF_VAL handle; > static uint16_t num_subscriptions; > > uint32_t mdtm_global_frag_num; > +#define MDTM_MAX_SEND_PKT_SIZE > (MDTM_NORMAL_MSG_FRAG_SIZE_MAX+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN) /* > Includes the 30 header bytes(2+8+20) */ > +static uint32_t msg_frag_size = MDTM_NORMAL_MSG_FRAG_SIZE_MAX; > +static uint32_t max_send_pkt_size = MDTM_MAX_SEND_PKT_SIZE; > + > /********************************************************* > > Function NAME: mdtm_tipc_init > @@ -158,6 +164,7 @@ uint32_t mdtm_tipc_init(NODE_ID nodeid, > num_subscriptions = 0; > handle = 0; > mdtm_global_frag_num = 0; > + MDS_SUBTN_REF_VAL subtn_ref_ptr; > > /* REASSEMBLY TREE */ > memset(&pat_tree_params, 0, sizeof(pat_tree_params)); > @@ -307,6 +314,21 @@ uint32_t mdtm_tipc_init(NODE_ID nodeid, > } else { > m_MDS_LOG_INFO("MDTM: Successfully set default socket > option TIPC_IMP = %d", TIPCIMPORTANCE); > } > + /* To handle in-service Upgrade of fragmentation changes , > theMDTM_NORMAL_MSG_FRAG_SIZE_MIN > + fragment size is used to send to previous version of Opensaf Node > while in-service Upgrade , > + so the only new node do install & subscribe its Node Mds version > + ( old nodes will not publishes so we need to fragment to > MDTM_NORMAL_MSG_FRAG_SIZE_MIN size. > + > + In the previous releases of Opensaf the value of TIPC inbuf size of > + MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was limited to(8000+MDS > header) */ > + if (mds_mdtm_node_info_install_tipc() != NCSCC_RC_SUCCESS) { > + LOG_ER("MDTM: Can't mds_mdtm_node_info_install_tipc TIPC_IMP > err \n"); > + osafassert(0); > + } > + if (mds_mdtm_node_info_subscribe_tipc(&subtn_ref_ptr) != > NCSCC_RC_SUCCESS) { > + LOG_ER("MDTM: Can't mds_mdtm_node_info_subscribe_tipc TIPC_IMP > err \n"); > + osafassert(0); > + } > > return NCSCC_RC_SUCCESS; > } > @@ -1016,11 +1038,43 @@ static uint32_t mdtm_process_discovery_e > > } > break; > - > - default: > + case MDS_NODE_INFO_TYPE: > + { > + /* To handle in-service Upgrade of fragmentation > changes , > + theMDTM_NORMAL_MSG_FRAG_SIZE_MIN fragment size is > used to send > + to previous version of Opensaf Node while > in-service Upgrade , > + so the only new node publishes its Node Mds version > + ( old nodes will not publishes so we need to > fragment to > + MDTM_NORMAL_MSG_FRAG_SIZE_MIN size. > + > + In the previous releases of Opensaf the value of > TIPC inbuf size of > + MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC was > limited to(8000+MDS header) */ > + > + uint32_t node_status = 0; > + NODE_ID node_id = 0; > + uint32_t node_ver = 0; > + > + node_ver = (uint32_t)lower; > + > + m_MDS_LOG_INFO("MDTM: Received NODE event"); > + > + node_status = m_MDS_CHECK_TIPC_NODE_ID_RANGE(node); > + > + if (NCSCC_RC_SUCCESS == node_status) { > + node_id = > ((NODE_ID)(m_MDS_GET_NCS_NODE_ID_FROM_TIPC_NODE_ID(node))); > + > + } else { > + LOG_ER("MDTM: Dropping the node event,as the > TIPC NODE_ID is not in the prescribed range=0x%08x, Event type=%d", > + node, discovery_event); > + return NCSCC_RC_FAILURE; > + } > + mds_node_tbl_add(node_id,node_ver); > + } > + break; > + default: > { > m_MDS_LOG_ERR > - ("MDTM: TIPC EVENT UNSUPPORTED (default). If this > case comes this should assert as there no other events being processed"); > + ("MDTM: TIPC EVENT UNSUPPORTED (default). If > this case comes this should assert as there no other events being processed"); > return NCSCC_RC_FAILURE; > } > break; > @@ -1530,6 +1584,107 @@ uint32_t mds_mdtm_svc_subscribe_tipc(PW_ > } > > /********************************************************* > + Function NAME: mds_mdtm_node_info_install_tipc > + > + DESCRIPTION: > + > + ARGUMENTS: > + > + RETURNS: 1 - NCSCC_RC_SUCCESS > + 2 - NCSCC_RC_FAILURE > + > +*********************************************************/ > +uint32_t mds_mdtm_node_info_install_tipc() > +{ > + /* > + STEP 1: Bind to socket BSRSock with Tipc name sequence > + TIPC Name: > + <MDS-prefix, MDS_NODE_INFO_TYPE, 0> > + TIPC Range: > + <0,ROLE=0,POLICY=0,NODE_VERSION > to > + <0,ROLE=0,POLICY=0,NODE_VERSION > > + */ > + struct sockaddr_tipc server_addr; > + uint32_t server_type = 0, server_inst = 0; > + > + memset(&server_addr, 0, sizeof(server_addr)); > + server_addr.family = AF_TIPC; > + > + server_addr.addrtype = TIPC_ADDR_NAMESEQ; > + > + server_type = server_type | MDS_TIPC_PREFIX | MDS_NODE_INFO_TYPE; > + server_inst |= MDS_NODE_VERSION; > + > + server_addr.addr.nameseq.type = server_type; > + server_addr.addr.nameseq.lower = server_inst; > + server_addr.addr.nameseq.upper = server_inst; > + server_addr.scope = TIPC_CLUSTER_SCOPE; > + > + if (0 != bind(tipc_cb.BSRsock, (struct sockaddr *)&server_addr, > sizeof(server_addr))) { > + m_MDS_LOG_ERR("MDTM: MDS-NODE-INFO-INSTALL Failure err :%s\n", > strerror(errno)); > + return NCSCC_RC_FAILURE; > + } > + return NCSCC_RC_SUCCESS; > +} > + > +/********************************************************* > + > + Function NAME: mds_mdtm_node_info_subscribe_tipc > + > + DESCRIPTION: > + > + ARGUMENTS: > + > + RETURNS: 1 - NCSCC_RC_SUCCESS > + 2 - NCSCC_RC_FAILURE > + > +*********************************************************/ > +uint32_t mds_mdtm_node_info_subscribe_tipc(MDS_SUBTN_REF_VAL *subtn_ref_val) > +{ > + /* > + STEP 1: Subscribe to socket DSock with Tipc name sequence > + TIPC Name: > + <MDS-prefix, VDEST_INST_TYPE, 0> > + TIPC Range: > + <0,ROLE=0,POLICY=0,VDEST_ID > to > + <0,ROLE=0,POLICY=0,VDEST_ID > > + */ > + > + uint32_t inst = 0, server_type = 0; > + struct tipc_subscr subscr; > + > + if (num_subscriptions > MAX_SUBSCRIPTIONS) { > + m_MDS_LOG_ERR("MDTM: SYSTEM CRITICAL Crossing =%d > subscriptions\n", num_subscriptions); > + if (num_subscriptions > MAX_SUBSCRIPTIONS_RETURN_ERROR) { > + m_MDS_LOG_ERR > + ("MDTM: SYSTEM has crossed the max =%d > subscriptions , Returning failure to the user", > + MAX_SUBSCRIPTIONS_RETURN_ERROR); > + return NCSCC_RC_FAILURE; > + } > + } > + > + server_type = server_type | MDS_TIPC_PREFIX | MDS_NODE_INFO_TYPE; > + inst |= MDS_NODE_VERSION; > + memset(&subscr, 0, sizeof(subscr)); > + subscr.seq.type = HTONL(server_type); > + subscr.seq.lower = HTONL(inst); > + subscr.seq.upper = HTONL(inst); > + subscr.timeout = HTONL(FOREVER); > + subscr.filter = HTONL(TIPC_SUB_PORTS); > + *subtn_ref_val = 0; > + *subtn_ref_val = ++handle; > + *((uint64_t *)subscr.usr_handle) = *subtn_ref_val; > + > + if (send(tipc_cb.Dsock, &subscr, sizeof(subscr), 0) != sizeof(subscr)) { > + m_MDS_LOG_ERR("MDTM: MDS-NODE-INFO-SUBSCRIBE Failure\n"); > + return NCSCC_RC_FAILURE; > + } > + ++num_subscriptions; > + > + return NCSCC_RC_SUCCESS; > +} > + > +/********************************************************* > > Function NAME: mds_mdtm_node_subscribe_tipc > > @@ -2034,12 +2189,32 @@ uint32_t mds_mdtm_send_tipc(MDTM_SEND_RE > { > uint32_t len = 0; > len = m_MMGR_LINK_DATA_LEN(usrbuf); /* > Getting total len */ > - > - m_MDS_LOG_INFO("MDTM: User Sending Data > lenght=%d Fr_svc=%d to_svc=%d\n", len, > - req->src_svc_id, > req->dest_svc_id); > - > - if (len > MDTM_NORMAL_MSG_FRAG_SIZE) { > - /* Packet needs to be fragmented and > send */ > + /* To support in-service Upgrade issue > MDTM_NORMAL_MSG_FRAG_SIZE_MIN > + is provide, and this fragment size is used > to send to previous version of Opensaf Node > + while in-service Upgrade. > + > + In the previous releases of Opensaf the > value of TIPC inbuf size of > + MDTM_RECV_BUFFER_SIZE (mds_dt_tipc.c) TIPC > was limited to(8000+MDS header) , > + we have in-service Upgrade issue, so it is > not possible to send the new > + MDS_DIRECT_BUF_MAXSIZE (65535 maximum packet > size)-(56 MDS header) > + value previous Opensaf version nodes , so > for the current release it is limited to 8000, > + possibly adjust this in the future Opensaf > releases to MDS_DIRECT_BUF_MAXSIZE. > + > + IMP TCP Note : Their is NO issue with TCP > in-service Upgrade ,The value of > + SO_RCVBUF & SO_SNDBUF of TCP sockets was > set to 64000 ( MDS_SND_RCV_SIZE) > + using setsockopt() ,the kernel doubles this > value ,and this doubled value is returned by > + getsockopt(). So > MDTM_NORMAL_MSG_FRAG_SIZE_MAX size is used to send for > + for both previous & current versitions of > Opensaf nodes which are using MDS TCP as transport*/ > + if (len > MDTM_NORMAL_MSG_FRAG_SIZE_MIN) { > + if > (mds_node_tbl_query(m_MDS_GET_NODE_ID_FROM_ADEST(req->adest)) != > NCSCC_RC_SUCCESS) { > + msg_frag_size = > MDTM_NORMAL_MSG_FRAG_SIZE_MIN; > + max_send_pkt_size = > (MDTM_NORMAL_MSG_FRAG_SIZE_MIN+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN); > + m_MDS_LOG_DBG("MDTM:Sending > message TO node_id=%d with msg_frag_size = %d max_send_pkt_size = %d", > + > m_MDS_GET_NODE_ID_FROM_ADEST(req->adest), msg_frag_size, max_send_pkt_size); > + } > + } > + > + if (len > msg_frag_size) { > status = mdtm_frag_and_send(req, > frag_seq_num, tipc_id); > return status; > > @@ -2155,7 +2330,6 @@ uint32_t mds_mdtm_send_tipc(MDTM_SEND_RE > 2 - NCSCC_RC_FAILURE > > *********************************************************/ > -#define MDTM_MAX_SEND_PKT_SIZE > (MDTM_NORMAL_MSG_FRAG_SIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN) /* > Includes the 30 header bytes(2+8+20) */ > > #ifdef MDS_CHECKSUM_ENABLE_FLAG > #define MDTM_FRAG_HDR_PLUS_LEN_2 13 > @@ -2187,22 +2361,22 @@ uint32_t mdtm_frag_and_send(MDTM_SEND_RE > > len = m_MMGR_LINK_DATA_LEN(usrbuf); /* Getting total len */ > > - if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE)) { /* We have 15 > bits for frag number so 2( pow 15) -1=32767 */ > + if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX)) { /* We have 15 > bits for frag number so 2( pow 15) -1=32767 */ > m_MDS_LOG_CRITICAL > ("MDTM: App. is trying to send data more than MDTM Can > fragment and send, Max size is =%d\n", > - 32767 * MDTM_NORMAL_MSG_FRAG_SIZE); > + 32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX); > m_MMGR_FREE_BUFR_LIST(usrbuf); > return NCSCC_RC_FAILURE; > } > > while (len != 0) { > - if (len > MDTM_NORMAL_MSG_FRAG_SIZE) { > + if (len > msg_frag_size) { > if (i == 1) { > - len_buf = MDTM_MAX_SEND_PKT_SIZE; > + len_buf = max_send_pkt_size; > frag_val = MORE_FRAG_BIT | i; > } else { > - if ((len + MDTM_FRAG_HDR_PLUS_LEN_2) > > MDTM_MAX_SEND_PKT_SIZE) { > - len_buf = MDTM_MAX_SEND_PKT_SIZE; > + if ((len + MDTM_FRAG_HDR_PLUS_LEN_2) > > max_send_pkt_size) { > + len_buf = max_send_pkt_size; > frag_val = MORE_FRAG_BIT | i; > } else { > len_buf = len + > MDTM_FRAG_HDR_PLUS_LEN_2; > diff --git a/osaf/libs/core/mds/mds_dt_trans.c > b/osaf/libs/core/mds/mds_dt_trans.c > --- a/osaf/libs/core/mds/mds_dt_trans.c > +++ b/osaf/libs/core/mds/mds_dt_trans.c > @@ -41,7 +41,7 @@ > > #define SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN_TCP ((2 + MDS_SEND_ADDRINFO_TCP > + MDTM_FRAG_HDR_LEN_TCP + MDS_HDR_LEN_TCP)) > > -#define MDTM_MAX_SEND_PKT_SIZE_TCP > (MDTM_NORMAL_MSG_FRAG_SIZE+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN_TCP) /* > Includes the 30 header bytes(2+8+20) */ > +#define MDTM_MAX_SEND_PKT_SIZE_TCP > (MDTM_NORMAL_MSG_FRAG_SIZE_MAX+SUM_MDS_HDR_PLUS_MDTM_HDR_PLUS_LEN_TCP) /* > Includes the 30 header bytes(2+8+20) */ > > uint32_t mdtm_global_frag_num_tcp; > extern struct pollfd pfd[2]; > @@ -363,16 +363,16 @@ static uint32_t mdtm_frag_and_send_tcp(M > > len = m_MMGR_LINK_DATA_LEN(usrbuf); /* Getting total len */ > > - if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE)) { /* We have 15 > bits for frag number so 2( pow 15) -1=32767 */ > + if (len > (32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX)) { /* We have 15 > bits for frag number so 2( pow 15) -1=32767 */ > m_MDS_LOG_CRITICAL > ("MDTM: App. is trying to send data more than MDTM Can > fragment and send, Max size is =%d\n", > - 32767 * MDTM_NORMAL_MSG_FRAG_SIZE); > + 32767 * MDTM_NORMAL_MSG_FRAG_SIZE_MAX); > m_MMGR_FREE_BUFR_LIST(usrbuf); > return NCSCC_RC_FAILURE; > } > > while (len != 0) { > - if (len > MDTM_NORMAL_MSG_FRAG_SIZE) { > + if (len > MDTM_NORMAL_MSG_FRAG_SIZE_MAX) { > if (i == 1) { > len_buf = MDTM_MAX_SEND_PKT_SIZE_TCP; > frag_val = MORE_FRAG_BIT | i; > @@ -551,8 +551,12 @@ uint32_t mds_mdtm_send_tcp(MDTM_SEND_REQ > > m_MDS_LOG_INFO("MDTM: User Sending Data > lenght=%d Fr_svc=%d to_svc=%d\n", len, > req->src_svc_id, > req->dest_svc_id); > - > - if (len > MDTM_NORMAL_MSG_FRAG_SIZE) { > + /*Their is NO implication on TCP in-service > Upgrade because of > + MDTM_NORMAL_MSG_FRAG_SIZE_MAX (65535 maximum > packet size)-(56 MDS header) change , > + The value of SO_RCVBUF & SO_SNDBUF of TCP > sockets was set to 64000 ( MDS_SND_RCV_SIZE) > + using setsockopt() ,the kernel doubles this > value ,and this doubled value is returned by > + getsockopt().*/ > + if (len > MDTM_NORMAL_MSG_FRAG_SIZE_MAX) { > /* Packet needs to be fragmented and > send */ > status = mdtm_frag_and_send_tcp(req, > frag_seq_num, id); > return status; > @@ -678,7 +682,7 @@ void mdtm_process_poll_recv_data_tcp(voi > /* Receive all incoming data on this socket */ > > /*******************************************************/ > > - recd_bytes = recv(tcp_cb->DBSRsock, tcp_cb->len_buff, > 2, 0); > + recd_bytes = recv(tcp_cb->DBSRsock, tcp_cb->len_buff, > 2, MSG_NOSIGNAL); > if (0 == recd_bytes) { > LOG_ER("MDTM:socket_recv() = %d, conn lost with > dh server, exiting library err :%s", recd_bytes, strerror(errno)); > close(tcp_cb->DBSRsock); > > ------------------------------------------------------------------------------ Managing the Performance of Cloud-Based Applications Take advantage of what the Cloud has to offer - Avoid Common Pitfalls. Read the Whitepaper. http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel