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