From bd0ad1ba43e71278addc0374aba8c4055e3bacfa Mon Sep 17 00:00:00 2001 From: Pythagoras Watson Date: Tue, 16 Jul 2019 10:06:58 -0700 Subject: [PATCH] Reduce maximum socket buffer size so select works The maximum socket receive buffer size (SO_RCVBUF) is set from the value in /proc/sys/net/core/rmem_max. When this value is close to INT_MAX, the select() system call used by IO::Select->can_read() never returns true. This causes packets to never be read. Therefore, reduce the maximum socket receive buffer size to a value which works. --- perl-xCAT/xCAT/SLP.pm | 5 +++++ xCAT-server/lib/perl/xCAT/IPMI.pm | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/perl-xCAT/xCAT/SLP.pm b/perl-xCAT/xCAT/SLP.pm index 446844071..698bc571c 100755 --- a/perl-xCAT/xCAT/SLP.pm +++ b/perl-xCAT/xCAT/SLP.pm @@ -64,6 +64,11 @@ sub dodiscover { my $sysctl; open($sysctl, "<", "/proc/sys/net/core/rmem_max"); my $maxrcvbuf = <$sysctl>; + # select() on a socket will never succeed if the buffer is too large (i.e. near INT_MAX) + my $cap_maxrcvbuf = 2047*1024*1024; + if ($maxrcvbuf > $cap_maxrcvbuf) { + $maxrcvbuf = $cap_maxrcvbuf; + } my $rcvbuf = $args{'socket'}->sockopt(SO_RCVBUF); if ($maxrcvbuf > $rcvbuf) { $args{'socket'}->sockopt(SO_RCVBUF, $maxrcvbuf / 2); diff --git a/xCAT-server/lib/perl/xCAT/IPMI.pm b/xCAT-server/lib/perl/xCAT/IPMI.pm index 95491cf00..76810de40 100644 --- a/xCAT-server/lib/perl/xCAT/IPMI.pm +++ b/xCAT-server/lib/perl/xCAT/IPMI.pm @@ -209,6 +209,11 @@ sub new { my $sysctl; open($sysctl, "<", "/proc/sys/net/core/rmem_max"); my $maxrcvbuf = <$sysctl>; + # select() on a socket will never succeed if the buffer is too large (i.e. near INT_MAX) + my $cap_maxrcvbuf = 2047*1024*1024; + if ($maxrcvbuf > $cap_maxrcvbuf) { + $maxrcvbuf = $cap_maxrcvbuf; + } my $rcvbuf = $socket->sockopt(SO_RCVBUF); if ($maxrcvbuf > $rcvbuf) { $socket->sockopt(SO_RCVBUF, $maxrcvbuf / 2);