mirror of
https://github.com/kubernetes-csi/csi-driver-nvmf.git
synced 2025-09-01 05:08:53 +00:00
fix: add creating/deleting check to ensure idemponent
Signed-off-by: Meinhard Zhou <zhouenhua@bytedance.com>
This commit is contained in:
@@ -33,6 +33,12 @@ import (
|
|||||||
// the map of VolumeName to PvName for idempotency.
|
// the map of VolumeName to PvName for idempotency.
|
||||||
var createdVolumeMap = map[string]*csi.Volume{}
|
var createdVolumeMap = map[string]*csi.Volume{}
|
||||||
|
|
||||||
|
// the map of DeleteVolumeReq for idempotency
|
||||||
|
var deletingVolumeReqMap = map[string]*csi.DeleteVolumeRequest{}
|
||||||
|
|
||||||
|
// the map of CreateVolumeReq for idempotency
|
||||||
|
var creatingVolumeReqMap = map[string]*csi.CreateVolumeRequest{}
|
||||||
|
|
||||||
type ControllerServer struct {
|
type ControllerServer struct {
|
||||||
Driver *driver
|
Driver *driver
|
||||||
}
|
}
|
||||||
@@ -84,7 +90,17 @@ func (c *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolu
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. if not created, request backend controller to create a new volume
|
// 3. if creating, return error
|
||||||
|
_, ok = creatingVolumeReqMap[req.GetName()]
|
||||||
|
if ok {
|
||||||
|
klog.Warningf("CreateVolume: volume %s has been creating in other req", req.GetName())
|
||||||
|
//maybe return err?
|
||||||
|
return &csi.CreateVolumeResponse{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
creatingVolumeReqMap[req.GetName()] = req
|
||||||
|
|
||||||
|
// 4. if not created, request backend controller to create a new volume
|
||||||
createVolReq.Name = req.GetName()
|
createVolReq.Name = req.GetName()
|
||||||
createVolReq.SizeByte = req.GetCapacityRange().RequiredBytes
|
createVolReq.SizeByte = req.GetCapacityRange().RequiredBytes
|
||||||
|
|
||||||
@@ -124,6 +140,7 @@ func (c *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolu
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Warningf("CreateVolume: create volume %s success, but persistent error: %s", req.GetName(), err)
|
klog.Warningf("CreateVolume: create volume %s success, but persistent error: %s", req.GetName(), err)
|
||||||
}
|
}
|
||||||
|
delete(creatingVolumeReqMap, req.GetName())
|
||||||
|
|
||||||
return &csi.CreateVolumeResponse{Volume: tmpVolume}, nil
|
return &csi.CreateVolumeResponse{Volume: tmpVolume}, nil
|
||||||
}
|
}
|
||||||
@@ -147,7 +164,16 @@ func (c *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolu
|
|||||||
|
|
||||||
volumeMapFilePath := filepath.Join(c.Driver.volumeMapDir, req.GetVolumeId())
|
volumeMapFilePath := filepath.Join(c.Driver.volumeMapDir, req.GetVolumeId())
|
||||||
|
|
||||||
volume, ok := createdVolumeMap[req.GetVolumeId()]
|
// 2. if deleting, return error
|
||||||
|
_, ok := deletingVolumeReqMap[req.GetVolumeId()]
|
||||||
|
if ok {
|
||||||
|
klog.Warningf("DeleteVolume: vol-%s has been deleting in other req", req.GetVolumeId())
|
||||||
|
// maybe return error?
|
||||||
|
return &csi.DeleteVolumeResponse{}, nil
|
||||||
|
}
|
||||||
|
deletingVolumeReqMap[req.GetVolumeId()] = req
|
||||||
|
|
||||||
|
volume, ok = createdVolumeMap[req.GetVolumeId()]
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("DeleteVolume: can't find the vol-%s in driver cache", req.GetVolumeId())
|
klog.Errorf("DeleteVolume: can't find the vol-%s in driver cache", req.GetVolumeId())
|
||||||
volume, err = GetVolumeInfoFromFile(volumeMapFilePath)
|
volume, err = GetVolumeInfoFromFile(volumeMapFilePath)
|
||||||
@@ -183,6 +209,7 @@ func (c *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolu
|
|||||||
klog.Warningf("DeleteVolume: can't remove vol-%s mapping file %s for error: %s.", volume.VolumeId, volumeMapFilePath, err)
|
klog.Warningf("DeleteVolume: can't remove vol-%s mapping file %s for error: %s.", volume.VolumeId, volumeMapFilePath, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete(deletingVolumeReqMap, volume.GetVolumeId())
|
||||||
klog.Infof("DeleteVolume: delete vol-%s success.", volume.VolumeId)
|
klog.Infof("DeleteVolume: delete vol-%s success.", volume.VolumeId)
|
||||||
|
|
||||||
return &csi.DeleteVolumeResponse{}, nil
|
return &csi.DeleteVolumeResponse{}, nil
|
||||||
|
@@ -5,7 +5,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/container-storage-interface/spec/lib/go/csi"
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
"github.com/kubernetes-csi/csi-driver-nvmf/pkg/client"
|
"github.com/kubernetes-csi/csi-driver-nvmf/pkg/client"
|
||||||
@@ -16,7 +15,6 @@ type CreateVolumeRequest struct {
|
|||||||
Name string
|
Name string
|
||||||
SizeByte int64
|
SizeByte int64
|
||||||
// AllowHostNqn string
|
// AllowHostNqn string
|
||||||
ReadOnly bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteVolumeRequest struct {
|
type DeleteVolumeRequest struct {
|
||||||
@@ -26,19 +24,6 @@ type DeleteVolumeRequest struct {
|
|||||||
func ParseCreateVolumeParameters(parameters map[string]string) (volReq *CreateVolumeRequest, err error) {
|
func ParseCreateVolumeParameters(parameters map[string]string) (volReq *CreateVolumeRequest, err error) {
|
||||||
//todo: need more parameters for nvmf
|
//todo: need more parameters for nvmf
|
||||||
|
|
||||||
// readonly
|
|
||||||
readonly, ok := parameters["readonly"]
|
|
||||||
if !ok {
|
|
||||||
volReq.ReadOnly = false
|
|
||||||
} else {
|
|
||||||
readonly = strings.ToLower(readonly)
|
|
||||||
if readonly == "yes" || readonly == "true" || readonly == "1" {
|
|
||||||
volReq.ReadOnly = true
|
|
||||||
} else {
|
|
||||||
volReq.ReadOnly = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return volReq, nil
|
return volReq, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user