Skip to content

Commit 5b84979

Browse files
committed
Make a new connection to CSI driver before dispatch any gRPC call
1 parent 4dc55d3 commit 5b84979

File tree

2 files changed

+27
-23
lines changed

2 files changed

+27
-23
lines changed

cmd/livenessprobe/livenessprobe_test.go

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,14 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"flag"
2021
"net/http"
2122
"net/http/httptest"
2223
"testing"
2324

2425
csi "github.com/container-storage-interface/spec/lib/go/csi"
2526
"github.com/golang/mock/gomock"
26-
connlib "github.com/kubernetes-csi/csi-lib-utils/connection"
2727
"github.com/kubernetes-csi/csi-test/driver"
28-
"google.golang.org/grpc"
2928
)
3029

3130
const (
@@ -37,9 +36,7 @@ func createMockServer(t *testing.T) (
3736
*driver.MockCSIDriver,
3837
*driver.MockIdentityServer,
3938
*driver.MockControllerServer,
40-
*driver.MockNodeServer,
41-
*grpc.ClientConn,
42-
error) {
39+
*driver.MockNodeServer) {
4340
// Start the mock server
4441
mockController := gomock.NewController(t)
4542
identityServer := driver.NewMockIdentityServer(mockController)
@@ -52,24 +49,16 @@ func createMockServer(t *testing.T) (
5249
})
5350
drv.Start()
5451

55-
// Create a client connection to it
56-
addr := drv.Address()
57-
csiConn, err := connlib.Connect(addr)
58-
if err != nil {
59-
return nil, nil, nil, nil, nil, nil, err
60-
}
61-
62-
return mockController, drv, identityServer, controllerServer, nodeServer, csiConn, nil
52+
return mockController, drv, identityServer, controllerServer, nodeServer
6353
}
6454

6555
func TestProbe(t *testing.T) {
66-
mockController, driver, idServer, _, _, csiConn, err := createMockServer(t)
67-
if err != nil {
68-
t.Fatal(err)
69-
}
56+
mockController, driver, idServer, _, _ := createMockServer(t)
7057
defer mockController.Finish()
7158
defer driver.Stop()
72-
defer csiConn.Close()
59+
60+
flag.Set("csi-address", driver.Address())
61+
flag.Parse()
7362

7463
var injectedErr error
7564

@@ -78,7 +67,6 @@ func TestProbe(t *testing.T) {
7867
idServer.EXPECT().Probe(gomock.Any(), inProbe).Return(outProbe, injectedErr).Times(1)
7968

8069
hp := &healthProbe{
81-
conn: csiConn,
8270
driverName: driverName,
8371
}
8472

cmd/livenessprobe/main.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,24 @@ var (
3939
)
4040

4141
type healthProbe struct {
42-
conn *grpc.ClientConn
4342
driverName string
4443
}
4544

4645
func (h *healthProbe) checkProbe(w http.ResponseWriter, req *http.Request) {
4746
ctx, cancel := context.WithTimeout(req.Context(), *probeTimeout)
4847
defer cancel()
4948

49+
conn, err := acquireConnection()
50+
if err != nil {
51+
w.WriteHeader(http.StatusInternalServerError)
52+
w.Write([]byte(err.Error()))
53+
klog.Errorf("failed to establish connection to CSI driver: %v", err)
54+
return
55+
}
56+
defer conn.Close()
57+
5058
klog.V(5).Infof("Sending probe request to CSI driver %q", h.driverName)
51-
ready, err := rpc.Probe(ctx, h.conn)
59+
ready, err := rpc.Probe(ctx, conn)
5260
if err != nil {
5361
w.WriteHeader(http.StatusInternalServerError)
5462
w.Write([]byte(err.Error()))
@@ -68,12 +76,20 @@ func (h *healthProbe) checkProbe(w http.ResponseWriter, req *http.Request) {
6876
klog.V(5).Infof("Health check succeeded")
6977
}
7078

79+
// acquireConnection wraps the connlib.Connect func.
80+
//
81+
// NOTE: always open a new connection to avoid the issue reported at
82+
// https://github.com/kubernetes-csi/livenessprobe/issues/68.
83+
func acquireConnection() (*grpc.ClientConn, error) {
84+
return connlib.Connect(*csiAddress)
85+
}
86+
7187
func main() {
7288
klog.InitFlags(nil)
7389
flag.Set("logtostderr", "true")
7490
flag.Parse()
7591

76-
csiConn, err := connlib.Connect(*csiAddress)
92+
csiConn, err := acquireConnection()
7793
if err != nil {
7894
// connlib should retry forever so a returned error should mean
7995
// the grpc client is misconfigured rather than an error on the network
@@ -82,13 +98,13 @@ func main() {
8298

8399
klog.Infof("calling CSI driver to discover driver name")
84100
csiDriverName, err := rpc.GetDriverName(context.Background(), csiConn)
101+
csiConn.Close()
85102
if err != nil {
86103
klog.Fatalf("failed to get CSI driver name: %v", err)
87104
}
88105
klog.Infof("CSI driver name: %q", csiDriverName)
89106

90107
hp := &healthProbe{
91-
conn: csiConn,
92108
driverName: csiDriverName,
93109
}
94110

0 commit comments

Comments
 (0)