5
0
mirror of git://git.proxmox.com/git/pve-common.git synced 2025-01-12 17:17:35 +03:00

Daemon: add helper to create sockets

Those sockets are not closed and reopened at restart.
This commit is contained in:
Dietmar Maurer 2015-01-01 15:41:19 +01:00
parent ce0ae1edec
commit 517c11257c

View File

@ -20,6 +20,9 @@ use PVE::INotify;
use POSIX ":sys_wait_h";
use Fcntl ':flock';
use Socket qw(IPPROTO_TCP TCP_NODELAY SOMAXCONN);
use IO::Socket::INET;
use Getopt::Long;
use Time::HiRes qw (gettimeofday);
@ -755,5 +758,49 @@ sub register_status_command {
}});
}
# some useful helper
sub create_reusable_socket {
my ($self, $port, $host) = @_;
die "no port specifed" if !$port;
my ($socket, $sockfd);
if (defined($sockfd = $ENV{"PVE_DAEMON_SOCKET_$port"}) &&
$self->{env_restart_pve_daemon}) {
die "unable to parse socket fd '$sockfd'\n"
if $sockfd !~ m/^(\d+)$/;
$sockfd = $1; # untaint
$socket = IO::Socket::INET->new;
$socket->fdopen($sockfd, 'w') ||
die "cannot fdopen file descriptor '$sockfd' - $!\n";
} else {
$socket = IO::Socket::INET->new(
LocalAddr => $host,
LocalPort => $port,
Listen => SOMAXCONN,
Proto => 'tcp',
ReuseAddr => 1) ||
die "unable to create socket - $@\n";
# we often observe delays when using Nagle algorithm,
# so we disable that to maximize performance
setsockopt($socket, IPPROTO_TCP, TCP_NODELAY, 1);
$ENV{"PVE_DAEMON_SOCKET_$port"} = $socket->fileno;
}
# remove FD_CLOEXEC bit to reuse on exec
$socket->fcntl(Fcntl::F_SETFD(), 0);
return $socket;
}
1;