mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-01-18 02:39:30 +00:00
Merge pull request #136 from ceph/devel
Sync downstream devel with upstream devel
This commit is contained in:
commit
b01e71d0ef
2
.github/workflows/stale.yaml
vendored
2
.github/workflows/stale.yaml
vendored
@ -18,7 +18,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'ceph/ceph-csi'
|
||||
steps:
|
||||
- uses: actions/stale@v5
|
||||
- uses: actions/stale@v6
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
days-before-issue-stale: 30
|
||||
|
@ -27,7 +27,7 @@ GOLANGCI_VERSION=v1.47.3
|
||||
|
||||
# external snapshotter version
|
||||
# Refer: https://github.com/kubernetes-csi/external-snapshotter/releases
|
||||
SNAPSHOT_VERSION=v6.0.1
|
||||
SNAPSHOT_VERSION=v6.1.0
|
||||
|
||||
# "go test" configuration
|
||||
# set to stdout or html to enable coverage reporting, disabled by default
|
||||
@ -49,9 +49,9 @@ ROOK_CEPH_CLUSTER_IMAGE=quay.io/ceph/ceph:v17
|
||||
|
||||
# CSI sidecar version
|
||||
CSI_ATTACHER_VERSION=v4.0.0
|
||||
CSI_SNAPSHOTTER_VERSION=v6.0.1
|
||||
CSI_SNAPSHOTTER_VERSION=v6.1.0
|
||||
CSI_RESIZER_VERSION=v1.6.0
|
||||
CSI_PROVISIONER_VERSION=v3.2.1
|
||||
CSI_PROVISIONER_VERSION=v3.3.0
|
||||
CSI_NODE_DRIVER_REGISTRAR_VERSION=v2.5.1
|
||||
|
||||
# e2e settings
|
||||
|
@ -112,7 +112,7 @@ charts and their default values.
|
||||
| `provisioner.enableHostNetwork` | Specifies whether hostNetwork is enabled for provisioner pod. | `false` |
|
||||
| `provisioner.profiling.enabled` | Specifies whether profiling should be enabled | `false` |
|
||||
| `provisioner.provisioner.image.repository` | Specifies the csi-provisioner image repository URL | `registry.k8s.io/sig-storage/csi-provisioner` |
|
||||
| `provisioner.provisioner.image.tag` | Specifies image tag | `v3.2.1` |
|
||||
| `provisioner.provisioner.image.tag` | Specifies image tag | `v3.3.0` |
|
||||
| `provisioner.provisioner.image.pullPolicy` | Specifies pull policy | `IfNotPresent` |
|
||||
| `provisioner.resizer.image.repository` | Specifies the csi-resizer image repository URL | `registry.k8s.io/sig-storage/csi-resizer` |
|
||||
| `provisioner.resizer.image.tag` | Specifies image tag | `v1.6.0` |
|
||||
@ -120,7 +120,7 @@ charts and their default values.
|
||||
| `provisioner.resizer.name` | Specifies the name of csi-resizer sidecar | `resizer` |
|
||||
| `provisioner.resizer.enabled` | Specifies whether resizer sidecar is enabled | `true` |
|
||||
| `provisioner.snapshotter.image.repository` | Specifies the csi-snapshotter image repository URL | `registry.k8s.io/sig-storage/csi-snapshotter` |
|
||||
| `provisioner.snapshotter.image.tag` | Specifies image tag | `v6.0.1` |
|
||||
| `provisioner.snapshotter.image.tag` | Specifies image tag | `v6.1.0` |
|
||||
| `provisioner.snapshotter.image.pullPolicy` | Specifies pull policy | `IfNotPresent` |
|
||||
| `provisioner.nodeSelector` | Specifies the node selector for provisioner deployment | `{}` |
|
||||
| `provisioner.tolerations` | Specifies the tolerations for provisioner deployment | `{}` |
|
||||
|
@ -171,7 +171,7 @@ provisioner:
|
||||
provisioner:
|
||||
image:
|
||||
repository: registry.k8s.io/sig-storage/csi-provisioner
|
||||
tag: v3.2.1
|
||||
tag: v3.3.0
|
||||
pullPolicy: IfNotPresent
|
||||
resources: {}
|
||||
|
||||
@ -190,7 +190,7 @@ provisioner:
|
||||
snapshotter:
|
||||
image:
|
||||
repository: registry.k8s.io/sig-storage/csi-snapshotter
|
||||
tag: v6.0.1
|
||||
tag: v6.1.0
|
||||
pullPolicy: IfNotPresent
|
||||
resources: {}
|
||||
|
||||
|
@ -118,7 +118,7 @@ charts and their default values.
|
||||
| `provisioner.enableHostNetwork` | Specifies whether hostNetwork is enabled for provisioner pod. | `false` |
|
||||
| `provisioner.profiling.enabled` | Specifies whether profiling should be enabled | `false` |
|
||||
| `provisioner.provisioner.image.repository` | Specifies the csi-provisioner image repository URL | `registry.k8s.io/sig-storage/csi-provisioner` |
|
||||
| `provisioner.provisioner.image.tag` | Specifies image tag | `v3.2.1` |
|
||||
| `provisioner.provisioner.image.tag` | Specifies image tag | `v3.3.0` |
|
||||
| `provisioner.provisioner.image.pullPolicy` | Specifies pull policy | `IfNotPresent` |
|
||||
| `provisioner.attacher.image.repository` | Specifies the csi-attacher image repository URL | `registry.k8s.io/sig-storage/csi-attacher` |
|
||||
| `provisioner.attacher.image.tag` | Specifies image tag | `v4.0.0` |
|
||||
@ -131,7 +131,7 @@ charts and their default values.
|
||||
| `provisioner.resizer.name` | Specifies the name of csi-resizer sidecar | `resizer` |
|
||||
| `provisioner.resizer.enabled` | Specifies whether resizer sidecar is enabled | `true` |
|
||||
| `provisioner.snapshotter.image.repository` | Specifies the csi-snapshotter image repository URL | `registry.k8s.io/sig-storage/csi-snapshotter` |
|
||||
| `provisioner.snapshotter.image.tag` | Specifies image tag | `v6.0.1` |
|
||||
| `provisioner.snapshotter.image.tag` | Specifies image tag | `v6.1.0` |
|
||||
| `provisioner.snapshotter.image.pullPolicy` | Specifies pull policy | `IfNotPresent` |
|
||||
| `provisioner.nodeSelector` | Specifies the node selector for provisioner deployment | `{}` |
|
||||
| `provisioner.tolerations` | Specifies the tolerations for provisioner deployment | `{}` |
|
||||
|
@ -204,7 +204,7 @@ provisioner:
|
||||
provisioner:
|
||||
image:
|
||||
repository: gcr.io/k8s-staging-sig-storage/csi-provisioner
|
||||
tag: v3.2.1
|
||||
tag: v3.3.0
|
||||
pullPolicy: IfNotPresent
|
||||
resources: {}
|
||||
|
||||
@ -232,7 +232,7 @@ provisioner:
|
||||
snapshotter:
|
||||
image:
|
||||
repository: registry.k8s.io/sig-storage/csi-snapshotter
|
||||
tag: v6.0.1
|
||||
tag: v6.1.0
|
||||
pullPolicy: IfNotPresent
|
||||
resources: {}
|
||||
|
||||
|
@ -43,7 +43,7 @@ spec:
|
||||
priorityClassName: system-cluster-critical
|
||||
containers:
|
||||
- name: csi-provisioner
|
||||
image: registry.k8s.io/sig-storage/csi-provisioner:v3.2.1
|
||||
image: registry.k8s.io/sig-storage/csi-provisioner:v3.3.0
|
||||
args:
|
||||
- "--csi-address=$(ADDRESS)"
|
||||
- "--v=1"
|
||||
@ -79,7 +79,7 @@ spec:
|
||||
- name: socket-dir
|
||||
mountPath: /csi
|
||||
- name: csi-snapshotter
|
||||
image: registry.k8s.io/sig-storage/csi-snapshotter:v6.0.1
|
||||
image: registry.k8s.io/sig-storage/csi-snapshotter:v6.1.0
|
||||
args:
|
||||
- "--csi-address=$(ADDRESS)"
|
||||
- "--v=1"
|
||||
|
@ -40,7 +40,7 @@ spec:
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
containers:
|
||||
- name: csi-provisioner
|
||||
image: registry.k8s.io/sig-storage/csi-provisioner:v3.2.1
|
||||
image: registry.k8s.io/sig-storage/csi-provisioner:v3.3.0
|
||||
args:
|
||||
- "--csi-address=$(ADDRESS)"
|
||||
- "--v=1"
|
||||
@ -73,7 +73,7 @@ spec:
|
||||
- name: socket-dir
|
||||
mountPath: /csi
|
||||
- name: csi-snapshotter
|
||||
image: registry.k8s.io/sig-storage/csi-snapshotter:v6.0.1
|
||||
image: registry.k8s.io/sig-storage/csi-snapshotter:v6.1.0
|
||||
args:
|
||||
- "--csi-address=$(ADDRESS)"
|
||||
- "--v=1"
|
||||
|
@ -47,7 +47,7 @@ spec:
|
||||
priorityClassName: system-cluster-critical
|
||||
containers:
|
||||
- name: csi-provisioner
|
||||
image: k8s.gcr.io/sig-storage/csi-provisioner:v3.2.1
|
||||
image: registry.k8s.io/sig-storage/csi-provisioner:v3.3.0
|
||||
args:
|
||||
- "--csi-address=$(ADDRESS)"
|
||||
- "--v=1"
|
||||
@ -69,7 +69,7 @@ spec:
|
||||
- name: socket-dir
|
||||
mountPath: /csi
|
||||
- name: csi-snapshotter
|
||||
image: registry.k8s.io/sig-storage/csi-snapshotter:v6.0.1
|
||||
image: registry.k8s.io/sig-storage/csi-snapshotter:v6.1.0
|
||||
args:
|
||||
- "--csi-address=$(ADDRESS)"
|
||||
- "--v=1"
|
||||
|
@ -24,7 +24,6 @@ import (
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/ceph/ceph-csi/internal/util"
|
||||
@ -70,18 +69,6 @@ const (
|
||||
schedulingStartTimeKey = "schedulingStartTime"
|
||||
)
|
||||
|
||||
type operation string
|
||||
|
||||
var (
|
||||
// pool+"/"+key to check dummy image is created.
|
||||
dummyImageCreated operation = "dummyImageCreated"
|
||||
// Read write lock to ensure that only one operation is happening at a time.
|
||||
operationLock = sync.Map{}
|
||||
|
||||
// Lock to serialize operations on the dummy image to tickle RBD snapshot schedule.
|
||||
dummyImageOpsLock sync.Mutex
|
||||
)
|
||||
|
||||
// ReplicationServer struct of rbd CSI driver with supported methods of Replication
|
||||
// controller server spec.
|
||||
type ReplicationServer struct {
|
||||
@ -269,11 +256,6 @@ func (rs *ReplicationServer) EnableVolumeReplication(ctx context.Context,
|
||||
return nil, status.Error(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
err = createDummyImage(ctx, rbdVol)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to create dummy image %s", err.Error())
|
||||
}
|
||||
|
||||
if mirroringInfo.State != librbd.MirrorImageEnabled {
|
||||
err = rbdVol.enableImageMirroring(mirroringMode)
|
||||
if err != nil {
|
||||
@ -286,117 +268,6 @@ func (rs *ReplicationServer) EnableVolumeReplication(ctx context.Context,
|
||||
return &replication.EnableVolumeReplicationResponse{}, nil
|
||||
}
|
||||
|
||||
// getDummyImageName returns the csi-vol-dummy+cluster FSID as the image name.
|
||||
// each cluster should have a unique dummy image created. choosing the cluster
|
||||
// FSID for the same reason.
|
||||
func getDummyImageName(conn *util.ClusterConnection) (string, error) {
|
||||
id, err := conn.GetFSID()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return fmt.Sprintf("csi-vol-dummy-%s", id), nil
|
||||
}
|
||||
|
||||
// getOperationName returns the operation name for the given operation type
|
||||
// combined with the pool name.
|
||||
func getOperationName(poolName string, optName operation) string {
|
||||
return fmt.Sprintf("%s/%s", poolName, optName)
|
||||
}
|
||||
|
||||
// createDummyImage creates a dummy image as a workaround for the rbd
|
||||
// scheduling problem.
|
||||
func createDummyImage(ctx context.Context, rbdVol *rbdVolume) error {
|
||||
var err error
|
||||
var imgName string
|
||||
|
||||
dummyImageOpsLock.Lock()
|
||||
defer dummyImageOpsLock.Unlock()
|
||||
optName := getOperationName(rbdVol.Pool, dummyImageCreated)
|
||||
if _, ok := operationLock.Load(optName); !ok {
|
||||
// create a dummy image
|
||||
imgName, err = getDummyImageName(rbdVol.conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dummyVol := *rbdVol
|
||||
dummyVol.RbdImageName = imgName
|
||||
// dummyVol holds rbdVol details, reset ImageID or else dummy image cannot be
|
||||
// deleted from trash during repair operation.
|
||||
dummyVol.ImageID = ""
|
||||
f := []string{
|
||||
librbd.FeatureNameLayering,
|
||||
librbd.FeatureNameObjectMap,
|
||||
librbd.FeatureNameExclusiveLock,
|
||||
librbd.FeatureNameFastDiff,
|
||||
}
|
||||
features := librbd.FeatureSetFromNames(f)
|
||||
dummyVol.ImageFeatureSet = features
|
||||
// create 1MiB dummy image. 1MiB=1048576 bytes
|
||||
dummyVol.VolSize = 1048576
|
||||
err = createImage(ctx, &dummyVol, dummyVol.conn.Creds)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "File exists") {
|
||||
err = repairDummyImage(ctx, &dummyVol)
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
operationLock.Store(optName, true)
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// repairDummyImage deletes and recreates the dummy image.
|
||||
func repairDummyImage(ctx context.Context, dummyVol *rbdVolume) error {
|
||||
// instead of checking the images features and than adding missing image
|
||||
// features, updating the image size to 1Mib. We will delete the image
|
||||
// and recreate it.
|
||||
|
||||
// deleting and recreating the dummy image will not impact anything as its
|
||||
// a workaround to fix the scheduling problem.
|
||||
err := dummyVol.deleteImage(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return createImage(ctx, dummyVol, dummyVol.conn.Creds)
|
||||
}
|
||||
|
||||
// tickleMirroringOnDummyImage disables and reenables mirroring on the dummy image, and sets a
|
||||
// schedule of a minute for the dummy image, to force a schedule refresh for other mirrored images
|
||||
// within a minute.
|
||||
func tickleMirroringOnDummyImage(rbdVol *rbdVolume, mirroringMode librbd.ImageMirrorMode) error {
|
||||
imgName, err := getDummyImageName(rbdVol.conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dummyVol := *rbdVol
|
||||
dummyVol.RbdImageName = imgName
|
||||
|
||||
dummyImageOpsLock.Lock()
|
||||
defer dummyImageOpsLock.Unlock()
|
||||
err = dummyVol.disableImageMirroring(false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = dummyVol.enableImageMirroring(mirroringMode)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if mirroringMode == librbd.ImageMirrorModeSnapshot {
|
||||
err = dummyVol.addSnapshotScheduling(admin.Interval("1m"), admin.NoStartTime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DisableVolumeReplication extracts the RBD volume information from the
|
||||
// volumeID, If the image is present and the mirroring is enabled on the RBD
|
||||
// image it will disable the mirroring.
|
||||
@ -588,12 +459,6 @@ func (rs *ReplicationServer) PromoteVolume(ctx context.Context,
|
||||
}
|
||||
}
|
||||
|
||||
var mode librbd.ImageMirrorMode
|
||||
mode, err = getMirroringMode(ctx, req.GetParameters())
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to get mirroring mode %s", err.Error())
|
||||
}
|
||||
|
||||
interval, startTime := getSchedulingDetails(req.GetParameters())
|
||||
if interval != admin.NoInterval {
|
||||
err = rbdVol.addSnapshotScheduling(interval, startTime)
|
||||
@ -608,12 +473,6 @@ func (rs *ReplicationServer) PromoteVolume(ctx context.Context,
|
||||
rbdVol)
|
||||
}
|
||||
|
||||
log.DebugLog(ctx, "attempting to tickle dummy image for restarting RBD schedules")
|
||||
err = tickleMirroringOnDummyImage(rbdVol, mode)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to enable mirroring on dummy image %s", err.Error())
|
||||
}
|
||||
|
||||
return &replication.PromoteVolumeResponse{}, nil
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user