Skip to content

Commit 17a5206

Browse files
authored
fix: check if target is already mounted in NodePublishVolume (juicedata#1402)
1 parent 957ba59 commit 17a5206

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

pkg/driver/fakes.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package driver
1818

1919
import (
2020
"k8s.io/client-go/kubernetes/fake"
21+
testingexec "k8s.io/utils/exec/testing"
22+
"k8s.io/utils/mount"
2123

2224
"github.com/juicedata/juicefs-csi-driver/pkg/config"
2325
"github.com/juicedata/juicefs-csi-driver/pkg/juicefs"
@@ -30,6 +32,14 @@ import (
3032
func NewFakeDriver(endpoint string, fakeProvider juicefs.Interface) *Driver {
3133
registerer, _ := util.NewPrometheus(config.NodeName)
3234
metrics := newNodeMetrics(registerer)
35+
mp := make([]mount.MountPoint, 0)
36+
mp = append(mp, mount.MountPoint{
37+
Path: "/tmp/csi-mount/target",
38+
})
39+
fakeMounter := mount.SafeFormatAndMount{
40+
Interface: mount.NewFakeMounter(mp),
41+
Exec: &testingexec.FakeExec{},
42+
}
3343
return &Driver{
3444
endpoint: endpoint,
3545
controllerService: controllerService{
@@ -38,11 +48,12 @@ func NewFakeDriver(endpoint string, fakeProvider juicefs.Interface) *Driver {
3848
quotaPool: dispatch.NewPool(defaultQuotaPoolNum),
3949
},
4050
nodeService: nodeService{
41-
quotaPool: dispatch.NewPool(defaultQuotaPoolNum),
42-
juicefs: fakeProvider,
43-
nodeID: "fake-node-id",
44-
k8sClient: &k8sclient.K8sClient{Interface: fake.NewSimpleClientset()},
45-
metrics: metrics,
51+
quotaPool: dispatch.NewPool(defaultQuotaPoolNum),
52+
juicefs: fakeProvider,
53+
nodeID: "fake-node-id",
54+
k8sClient: &k8sclient.K8sClient{Interface: fake.NewSimpleClientset()},
55+
metrics: metrics,
56+
SafeFormatAndMount: fakeMounter,
4657
},
4758
}
4859
}

pkg/driver/node.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ package driver
1818

1919
import (
2020
"context"
21+
"errors"
2122
"fmt"
23+
"os"
2224
"path"
2325
"reflect"
2426
"strconv"
@@ -140,6 +142,15 @@ func (d *nodeService) NodePublishVolume(ctx context.Context, req *csi.NodePublis
140142
return nil, status.Error(codes.InvalidArgument, "Volume capability not supported")
141143
}
142144

145+
notMnt, notMntErr := d.IsLikelyNotMountPoint(target)
146+
if notMntErr != nil && !errors.Is(notMntErr, os.ErrNotExist) {
147+
return nil, status.Errorf(codes.Internal, "Could not check if %q is a mount point: %v", target, notMntErr)
148+
}
149+
if !notMnt {
150+
log.Info("Volume already published at target path", "volumeId", volumeID, "target", target)
151+
return &csi.NodePublishVolumeResponse{}, nil
152+
}
153+
143154
log.Info("creating dir", "target", target)
144155
if err := d.juicefs.CreateTarget(ctxWithLog, target); err != nil {
145156
return nil, status.Errorf(codes.Internal, "Could not create dir %q: %v", target, err)

pkg/driver/node_test.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,16 @@ var _ = Describe("nodeService", func() {
5353
registerer, _ := util.NewPrometheus(config.NodeName)
5454
metrics := newNodeMetrics(registerer)
5555
var juicefsDriver *nodeService
56+
mounter := &mount.SafeFormatAndMount{
57+
Interface: mount.New(""),
58+
Exec: k8sexec.New(),
59+
}
5660
BeforeEach(func() {
5761
juicefsDriver = &nodeService{
58-
nodeID: "fake_node_id",
59-
k8sClient: &k8s.K8sClient{Interface: fake.NewSimpleClientset()},
60-
metrics: metrics,
62+
nodeID: "fake_node_id",
63+
k8sClient: &k8s.K8sClient{Interface: fake.NewSimpleClientset()},
64+
metrics: metrics,
65+
SafeFormatAndMount: *mounter,
6166
}
6267
})
6368

0 commit comments

Comments
 (0)