[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