[lxc-devel] [lxd/master] lxd: Rework listening logic
stgraber on Github
lxc-bot at linuxcontainers.org
Fri Feb 16 22:55:25 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180216/ded39242/attachment.bin>
-------------- next part --------------
From b0bbe25d99c72860464e25dd8accd54847a0ee1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Feb 2018 17:53:35 -0500
Subject: [PATCH] lxd: Rework listening logic
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes #4256
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/endpoints/endpoints.go | 1 +
lxd/endpoints/network.go | 46 +++++++++++++++++++++++++++++++++++-----------
2 files changed, 36 insertions(+), 11 deletions(-)
diff --git a/lxd/endpoints/endpoints.go b/lxd/endpoints/endpoints.go
index d1b82859b..75894398a 100644
--- a/lxd/endpoints/endpoints.go
+++ b/lxd/endpoints/endpoints.go
@@ -166,6 +166,7 @@ func (e *Endpoints) up(config *Config) error {
logger.Infof("Replacing inherited TCP socket with configured one")
listener.Close()
}
+
// Errors here are not fatal and are just logged.
e.listeners[network] = networkCreateListener(config.NetworkAddress, e.cert)
}
diff --git a/lxd/endpoints/network.go b/lxd/endpoints/network.go
index 01c169b0f..1e4eadb6c 100644
--- a/lxd/endpoints/network.go
+++ b/lxd/endpoints/network.go
@@ -43,36 +43,60 @@ func (e *Endpoints) NetworkUpdateAddress(address string) error {
address = util.CanonicalNetworkAddress(address)
}
- if address == e.NetworkAddress() {
+ oldAddress := e.NetworkAddress()
+ if address == oldAddress {
return nil
}
logger.Infof("Update network address")
- // First try to see if we can listen to this new port at all, so we
- // don't close the old one (if any) in case of errors.
- var listener net.Listener
- if address != "" {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+
+ // Close the previous socket
+ e.closeListener(network)
+
+ // If turning off listening, we're done
+ if address == "" {
+ return nil
+ }
+
+ // Attempt to setup the new listening socket
+ getListener := func(address string) (*net.Listener, error) {
var err error
+ var listener net.Listener
+
for i := 0; i < 10; i++ { // Ten retries over a second seems reasonable.
listener, err = net.Listen("tcp", address)
if err == nil {
break
}
+
time.Sleep(100 * time.Millisecond)
}
+
if err != nil {
- return fmt.Errorf("cannot listen on https socket: %v", err)
+ return nil, fmt.Errorf("cannot listen on https socket: %v", err)
}
+
+ return &listener, nil
}
- e.mu.Lock()
- defer e.mu.Unlock()
+ // If setting a new address, setup the listener
+ if address != "" {
+ listener, err := getListener(address)
+ if err != nil {
+ // Attempt to revert to the previous address
+ listener, err1 := getListener(oldAddress)
+ if err1 == nil {
+ e.listeners[network] = networkTLSListener(*listener, e.cert)
+ e.serveHTTP(network)
+ }
- e.closeListener(network)
+ return err
+ }
- if address != "" {
- e.listeners[network] = networkTLSListener(listener, e.cert)
+ e.listeners[network] = networkTLSListener(*listener, e.cert)
e.serveHTTP(network)
}
More information about the lxc-devel
mailing list