osaf/libs/core/mds/include/mds_dt_tcp_disc.h |   1 -
 osaf/libs/core/mds/mds_dt_tcp.c              |  46 +++++++++++++++++++++++++--
 osaf/libs/core/mds/mds_dt_trans.c            |  14 ++++----
 3 files changed, 49 insertions(+), 12 deletions(-)


Upgraded the fragment size from ~8000 (MDTM_NORMAL_MSG_FRAG_SIZE) to ~65479 
(MDS_DIRECT_BUF_MAXSIZE)
so that fewer message sent and the congestion risk is reduced.

Removed hardcode 64000 SO_RCVBUF/SO_SNDBUF socket values, now by default 
setsockopt() is not set
so that socket can use system wide tuning the standard way using sysctl 
(wmem_default/rmem_default).
In case of system wide tuning sysctl has less values than 
MDS_DIRECT_BUF_MAXSIZE size ,
the default value of 65536 (fragment size) set using  setsockopt().

An environment variable is  provided to set rcvbuf and sndbuf to higher value
where user dont want change system wide wmem_default/rmem_default ( to all 
application on that system),
and exclusely give higher  SO_RCVBUF/SO_SNDBUF  Opensaf & Opensaf applcation by 
increaseing rmem_max/wmem_max
values using sysctl.


Note:
-----
Increasing the fragment size has  NO issue with MDS TCP in-service Upgrade ,
In the current code  SO_RCVBUF & SO_SNDBUF of TCP sockets was already set to 
64000 (MDS_SND_RCV_SIZE)
using setsockopt() ,the kernel doubles this value ,and this doubled  value is 
returned by getsockopt().
So MDS_DIRECT_BUF_MAXSIZE size is used to send for for both    previous & 
current versions of
Opensaf nodes which are using MDS TCP as transport.

diff --git a/osaf/libs/core/mds/include/mds_dt_tcp_disc.h 
b/osaf/libs/core/mds/include/mds_dt_tcp_disc.h
--- a/osaf/libs/core/mds/include/mds_dt_tcp_disc.h
+++ b/osaf/libs/core/mds/include/mds_dt_tcp_disc.h
@@ -70,7 +70,6 @@ server_instance_upper + sub_ref_val + su
 #define MDS_SND_VERSION 1
 #define MDS_RCV_IDENTIFIRE 0x56123456
 #define MDS_RCV_VERSION 1
-#define DTM_INTRANODE_MSG_SIZE 1500
 #define DTM_INTRANODE_UNSENT_MSG 200
 
 #define MDS_MDTM_LOWER_INSTANCE 0x00000000
diff --git a/osaf/libs/core/mds/mds_dt_tcp.c b/osaf/libs/core/mds/mds_dt_tcp.c
--- a/osaf/libs/core/mds/mds_dt_tcp.c
+++ b/osaf/libs/core/mds/mds_dt_tcp.c
@@ -38,7 +38,6 @@
 #include <configmake.h>
 
 #define MDS_MDTM_SUN_PATH 255
-#define MDS_SND_RCV_SIZE 64000
 #define MDS_MDTM_CONNECT_PATH PKGLOCALSTATEDIR "/osaf_dtm_intra_server"
 
 #ifndef MDS_PORT_NUMBER
@@ -53,6 +52,9 @@
 /* Send_buffer_size + MDS_MDTM_DTM_PID_BUFFER_SIZE   */
 #define MDS_MDTM_DTM_PID_BUFFER_SIZE (2 + MDS_MDTM_DTM_PID_SIZE)
 
+/* The default value is set by the rmem_default/wmem_default  */
+#define MDS_SOCK_SND_RCV_BUF_SIZE 65536  
+ 
 extern uint32_t mdtm_num_subscriptions;
 extern MDS_SUBTN_REF_VAL mdtm_handle;
 extern uint32_t mdtm_global_frag_num_tcp;
@@ -79,11 +81,14 @@ uint32_t mdtm_process_recv_events_tcp(vo
 uint32_t mds_mdtm_init_tcp(NODE_ID nodeid, uint32_t *mds_tcp_ref)
 {
        uint32_t flags;
-       uint32_t size = MDS_SND_RCV_SIZE;
+       uint32_t sndbuf_size = 0; /* Send buffer size */
+       uint32_t rcvbuf_size = 0;  /* Receive buffer size */
+       socklen_t optlen; /* Option length */
        struct sockaddr_un server_addr_un, dhserver_addr_un;
        struct sockaddr_in server_addr_in;
        struct sockaddr_in6 server_addr_in6;
        uint8_t buffer[MDS_MDTM_DTM_PID_BUFFER_SIZE];
+       char *ptr;
 
        mdtm_pid = getpid();
 
@@ -125,14 +130,47 @@ uint32_t mds_mdtm_init_tcp(NODE_ID nodei
                return NCSCC_RC_FAILURE;
        }
 
+       /*  setting MDS_SOCK_SND_RCV_BUF_SIZE  from environment variable if 
given.
+           The default value is set to MDS_SOCK_SND_RCV_BUF_SIZE (126976).
+           based on application requirements user need to  export 
MDS_SOCK_SND_RCV_BUF_SIZE
+           varible.
+
+           If MDS_SOCK_SND_RCV_BUF_SIZE exported to new value
+           it is also mandatory to  change `DTM_SOCK_SND_RCV_BUF_SIZE=` with  
the same value of
+           for example if we export MDS_SOCK_SND_RCV_BUF_SIZE=126976 
+           DTM_SOCK_SND_RCV_BUF_SIZE=126976 also need to be changed in 
/etc/opensaf/dtm.conf */
+       if ((ptr = getenv("MDS_SOCK_SND_RCV_BUF_SIZE")) != NULL) {
+               sndbuf_size = rcvbuf_size = atoi(ptr);
+               if ( sndbuf_size < MDS_SOCK_SND_RCV_BUF_SIZE) {
+                       sndbuf_size = rcvbuf_size = MDS_SOCK_SND_RCV_BUF_SIZE;
+               } else {
+                       rcvbuf_size = sndbuf_size;
+               }
+       } else {
+               optlen = sizeof(rcvbuf_size);
+               getsockopt(tcp_cb->DBSRsock, SOL_SOCKET, SO_RCVBUF, 
&rcvbuf_size, &optlen);
+               if (rcvbuf_size < MDS_SOCK_SND_RCV_BUF_SIZE) {
+                       rcvbuf_size = MDS_SOCK_SND_RCV_BUF_SIZE;
+               } else {
+                       rcvbuf_size = 0;
+               } 
+               optlen = sizeof(sndbuf_size);
+               getsockopt(tcp_cb->DBSRsock, SOL_SOCKET, SO_SNDBUF, 
&sndbuf_size, &optlen);
+               if ( sndbuf_size < MDS_SOCK_SND_RCV_BUF_SIZE) {
+                       sndbuf_size = MDS_SOCK_SND_RCV_BUF_SIZE;
+               } else {
+                       sndbuf_size = 0;
+               } 
+       }
+
        /* Increase the socket buffer size */
-       if (setsockopt(tcp_cb->DBSRsock, SOL_SOCKET, SO_RCVBUF, &size, 
sizeof(size)) != 0) {
+       if ((rcvbuf_size > 0) && (setsockopt(tcp_cb->DBSRsock, SOL_SOCKET, 
SO_RCVBUF, &rcvbuf_size, sizeof(rcvbuf_size)) != 0)) {
                syslog(LOG_ERR, "MDS:MDTM:TCP Unable to set the SO_RCVBUF for 
DBSRsock  err :%s", strerror(errno));
                close(tcp_cb->DBSRsock);
                return NCSCC_RC_FAILURE;
        }
 
-       if (setsockopt(tcp_cb->DBSRsock, SOL_SOCKET, SO_SNDBUF, &size, 
sizeof(size)) != 0) {
+       if ((sndbuf_size > 0) && (setsockopt(tcp_cb->DBSRsock, SOL_SOCKET, 
SO_SNDBUF, &sndbuf_size, sizeof(sndbuf_size)) != 0)) {
                syslog(LOG_ERR, "MDS:MDTM:TCP Unable to set the SO_SNDBUF for 
DBSRsock  err :%s", strerror(errno));
                close(tcp_cb->DBSRsock);
                return NCSCC_RC_FAILURE;
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   
(MDS_DIRECT_BUF_MAXSIZE+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 * MDS_DIRECT_BUF_MAXSIZE)) {   /* 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);
+                       ("MDTM: App. is trying to send data more than MDTM Can 
fragment and send, Max size is =%d\n",
+                        32767 * MDS_DIRECT_BUF_MAXSIZE);
                m_MMGR_FREE_BUFR_LIST(usrbuf);
                return NCSCC_RC_FAILURE;
        }
 
        while (len != 0) {
-               if (len > MDTM_NORMAL_MSG_FRAG_SIZE) {
+               if (len > MDS_DIRECT_BUF_MAXSIZE) {
                        if (i == 1) {
                                len_buf = MDTM_MAX_SEND_PKT_SIZE_TCP;
                                frag_val = MORE_FRAG_BIT | i;
@@ -552,7 +552,7 @@ 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) {
+                               if (len > MDS_DIRECT_BUF_MAXSIZE) {
                                        /* Packet needs to be fragmented and 
send */
                                        status = mdtm_frag_and_send_tcp(req, 
frag_seq_num, id);
                                        return status;
@@ -678,7 +678,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);

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to