]> git.proxmox.com Git - pve-common.git/commitdiff
Daemon: add helper to create sockets
authorDietmar Maurer <dietmar@proxmox.com>
Thu, 1 Jan 2015 14:41:19 +0000 (15:41 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 1 Jan 2015 14:41:19 +0000 (15:41 +0100)
Those sockets are not closed and reopened at restart.

data/PVE/Daemon.pm

index 9ba05dc20949225d63fb49ad3e81058ae9f5cbcf..b219c73f716caf13aff581e334c3b2e4c4c63118 100644 (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;