# HG changeset patch
# User Lars Ellenberg <l...@linbit.com>
# Date 1285685263 -7200
# Node ID beedb189b8a9c47c793f898755d0e301aacce4d4
# Parent  94f4ee6025502c7ef710775d458ef766c51ad6db
Medium: adjust socket buffers when adjusting ipc queue length

If a channel adjusts its ipc queue length,
it is probably a good idea to also change
the socket buffers on the system level.

The scaling qlen -> buffsize is somewhat arbitrary.

diff -r 94f4ee602550 -r beedb189b8a9 lib/clplumbing/ipcsocket.c
--- a/lib/clplumbing/ipcsocket.c        Tue Sep 28 16:01:48 2010 +0200
+++ b/lib/clplumbing/ipcsocket.c        Tue Sep 28 16:47:43 2010 +0200
@@ -1715,6 +1715,36 @@
        return socket_get_recv_fd(ch);
 }
 
+static void
+socket_adjust_buf(struct IPC_CHANNEL *ch, int optname, unsigned q_len)
+{
+       const char *direction = optname == SO_SNDBUF ? "snd" : "rcv";
+       int fd = socket_get_send_fd(ch);
+       unsigned byte;
+
+       /* Arbitrary scaling.
+        * DEFAULT_MAX_QLEN is 64, default socket buf is often 64k to 128k,
+        * at least on those linux I checked.
+        * Keep that ratio, and allow for some overhead. */
+       if (qlen == 0)
+               /* client does not want anything,
+                * reduce system buffers as well */
+               byte = 4096;
+       else if (q_len < 512)
+               byte = (32 + q_len) * 1024;
+       else
+               byte = q_len * 1024;
+
+       if (0 == setsockopt(fd, SOL_SOCKET, optname, &byte, sizeof(byte))) {
+               cl_log(LOG_DEBUG, "adjusted %sbuf size to %u", direction, 
bytes);
+       } else {
+               /* If this fails, you may need to adjust net.core.rmem_max,
+                * ...wmem_max, or equivalent */
+               cl_log(LOG_DEBUG, "adjust %sbuf size to %u failed: %s",
+                       direction, byte, strerror(errno));
+       }
+}
+
 static int
 socket_set_send_qlen (struct IPC_CHANNEL* ch, int q_len)
 {
@@ -1722,9 +1752,9 @@
   if (ch->send_queue == NULL) {
     return IPC_FAIL;
   }
+  socket_adjust_buf(ch, SO_SNDBUF, q_len);
   ch->send_queue->max_qlen = q_len;
-  return IPC_OK;  
- 
+  return IPC_OK;
 }
 
 static int
@@ -1734,7 +1764,7 @@
   if (ch->recv_queue == NULL) {
     return IPC_FAIL;
   }
-  
+  socket_adjust_buf(ch, SO_RCVBUF, q_len);
   ch->recv_queue->max_qlen = q_len;
   return IPC_OK;
 }
_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to