[lxc-devel] [lxd/master] Don't run a connection proxy when connecting with the Go dqlite client
freeekanayaka on Github
lxc-bot at linuxcontainers.org
Wed May 13 14:00:33 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 361 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200513/5a0e5fa1/attachment-0001.bin>
-------------- next part --------------
From 7f8ca6cd271bc001f0bc780a034ece192a203779 Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanayaka at canonical.com>
Date: Wed, 13 May 2020 14:58:53 +0100
Subject: [PATCH] Don't run a connection proxy when connecting with the Go
dqlite client
Signed-off-by: Free Ekanayaka <free.ekanayaka at canonical.com>
---
lxd/cluster/gateway.go | 79 ++++++++++++++++++++++--------------------
1 file changed, 42 insertions(+), 37 deletions(-)
diff --git a/lxd/cluster/gateway.go b/lxd/cluster/gateway.go
index e46908a6fe..5e16628e32 100644
--- a/lxd/cluster/gateway.go
+++ b/lxd/cluster/gateway.go
@@ -374,7 +374,47 @@ func (g *Gateway) raftDial() client.DialFunc {
}
address = string(addr)
}
- return dqliteNetworkDial(ctx, address, g, false)
+ conn, err := dqliteNetworkDial(ctx, address, g, false)
+ if err != nil {
+ return nil, err
+ }
+
+ listener, err := net.Listen("unix", "")
+ if err != nil {
+ return nil, errors.Wrap(err, "Failed to create unix listener")
+ }
+
+ goUnix, err := net.Dial("unix", listener.Addr().String())
+ if err != nil {
+ return nil, errors.Wrap(err, "Failed to connect to unix listener")
+ }
+
+ cUnix, err := listener.Accept()
+ if err != nil {
+ return nil, errors.Wrap(err, "Failed to connect to unix listener")
+ }
+
+ listener.Close()
+
+ go func() {
+ _, err := io.Copy(eagain.Writer{Writer: goUnix}, eagain.Reader{Reader: conn})
+ if err != nil {
+ logger.Warnf("Dqlite client proxy TLS -> Unix: %v", err)
+ }
+ goUnix.Close()
+ conn.Close()
+ }()
+
+ go func() {
+ _, err := io.Copy(eagain.Writer{Writer: conn}, eagain.Reader{Reader: goUnix})
+ if err != nil {
+ logger.Warnf("Dqlite client proxy Unix -> TLS: %v", err)
+ }
+ conn.Close()
+ goUnix.Close()
+ }()
+
+ return cUnix, nil
}
}
@@ -888,41 +928,6 @@ func dqliteNetworkDial(ctx context.Context, addr string, g *Gateway, checkLeader
return nil, fmt.Errorf("Missing or unexpected Upgrade header in response")
}
- listener, err := net.Listen("unix", "")
- if err != nil {
- return nil, errors.Wrap(err, "Failed to create unix listener")
- }
-
- goUnix, err := net.Dial("unix", listener.Addr().String())
- if err != nil {
- return nil, errors.Wrap(err, "Failed to connect to unix listener")
- }
-
- cUnix, err := listener.Accept()
- if err != nil {
- return nil, errors.Wrap(err, "Failed to connect to unix listener")
- }
-
- listener.Close()
-
- go func() {
- _, err := io.Copy(eagain.Writer{Writer: goUnix}, eagain.Reader{Reader: conn})
- if err != nil {
- logger.Warnf("Dqlite client proxy TLS -> Unix: %v", err)
- }
- goUnix.Close()
- conn.Close()
- }()
-
- go func() {
- _, err := io.Copy(eagain.Writer{Writer: conn}, eagain.Reader{Reader: goUnix})
- if err != nil {
- logger.Warnf("Dqlite client proxy Unix -> TLS: %v", err)
- }
- conn.Close()
- goUnix.Close()
- }()
-
// We successfully established a connection with the leader. Maybe the
// leader is ourselves, and we were recently elected. In that case
// trigger a full heartbeat now: it will be a no-op if we aren't
@@ -931,7 +936,7 @@ func dqliteNetworkDial(ctx context.Context, addr string, g *Gateway, checkLeader
go g.heartbeat(g.ctx, true)
}
- return cUnix, nil
+ return conn, nil
}
// Create a dial function that connects to the local dqlite.
More information about the lxc-devel
mailing list