Skip to content

Commit 497e91b

Browse files
Merge pull request #197 from cybozu-go/5672-lock-volume-3
implement rbd lock related commands
2 parents 2a7e91c + 2e04e9e commit 497e91b

File tree

20 files changed

+873
-64
lines changed

20 files changed

+873
-64
lines changed

Makefile

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,12 @@ clean-test:
9292
rm -f $(TEST_XFS_IMG); \
9393
fi
9494

95+
.PHONY: mock
96+
mock: mockgen
97+
$(MOCKGEN) -source=internal/infrastructure/ceph/command.go -destination=internal/infrastructure/ceph/command_mock.go -package=ceph
98+
9599
.PHONY: test
96-
test: manifests generate fmt vet envtest ## Run tests.
100+
test: manifests generate fmt vet envtest mock ## Run tests.
97101
$(MAKE) prepare-test
98102
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" \
99103
TEST_BLOCK_DEV=$(TEST_BLOCK_DEV) \
@@ -197,7 +201,8 @@ KUBECTL ?= kubectl
197201
KUSTOMIZE ?= $(LOCALBIN)/kustomize-$(KUSTOMIZE_VERSION)
198202
CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen-$(CONTROLLER_TOOLS_VERSION)
199203
ENVTEST ?= $(LOCALBIN)/setup-envtest-$(ENVTEST_VERSION)
200-
GOLANGCI_LINT = $(LOCALBIN)/golangci-lint-$(GOLANGCI_LINT_VERSION)
204+
GOLANGCI_LINT ?= $(LOCALBIN)/golangci-lint-$(GOLANGCI_LINT_VERSION)
205+
MOCKGEN ?= $(LOCALBIN)/mockgen-$(MOCKGEN_VERSION)
201206

202207
.PHONY: kustomize
203208
kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary.
@@ -217,7 +222,12 @@ $(ENVTEST): $(LOCALBIN)
217222
.PHONY: golangci-lint
218223
golangci-lint: $(GOLANGCI_LINT) ## Download golangci-lint locally if necessary.
219224
$(GOLANGCI_LINT): $(LOCALBIN)
220-
$(call go-install-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/v2/cmd/golangci-lint,${GOLANGCI_LINT_VERSION})
225+
$(call go-install-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/v2/cmd/golangci-lint,$(GOLANGCI_LINT_VERSION))
226+
227+
.PHONY: mockgen
228+
mockgen: $(MOCKGEN) ## Download mockgen locally if necessary.
229+
$(MOCKGEN): $(LOCALBIN)
230+
$(call go-install-tool,$(MOCKGEN),go.uber.org/mock/mockgen,$(MOCKGEN_VERSION))
221231

222232
# go-install-tool will 'go install' any package with custom target and name of binary, if it doesn't exist
223233
# $1 - target path with name of binary (ideally with version)

cmd/controller.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ func controllerMain(args []string) error {
162162
// Register custom metrics
163163
finmetrics.Register()
164164

165-
snapRepo := ceph.NewRBDRepository()
165+
rbdRepo := ceph.NewRBDRepository()
166166
maxPartSize, err := resource.ParseQuantity(os.Getenv("MAX_PART_SIZE"))
167167
if err != nil {
168168
return fmt.Errorf("failed to parse MAX_PART_SIZE environment variable: %w", err)
@@ -173,7 +173,8 @@ func controllerMain(args []string) error {
173173
os.Getenv("POD_NAMESPACE"),
174174
os.Getenv("POD_IMAGE"),
175175
&maxPartSize,
176-
snapRepo,
176+
rbdRepo,
177+
rbdRepo,
177178
rawImgExpansionUnitSize,
178179
)
179180
if err = finBackupReconciler.SetupWithManager(mgr); err != nil {

go.mod

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ module github.com/cybozu-go/fin
33
go 1.24
44

55
require (
6+
github.com/cespare/xxhash/v2 v2.3.0
67
github.com/google/uuid v1.6.0
78
github.com/mattn/go-sqlite3 v1.14.28
89
github.com/onsi/ginkgo/v2 v2.23.4
910
github.com/onsi/gomega v1.37.0
1011
github.com/prometheus/client_golang v1.22.0
1112
github.com/spf13/cobra v1.9.1
1213
github.com/stretchr/testify v1.10.0
13-
golang.org/x/sys v0.32.0
14+
go.uber.org/mock v0.6.0
15+
golang.org/x/sys v0.35.0
1416
k8s.io/api v0.32.7
1517
k8s.io/apimachinery v0.32.7
1618
k8s.io/client-go v0.32.7
@@ -22,7 +24,6 @@ require (
2224

2325
require (
2426
github.com/beorn7/perks v1.0.1 // indirect
25-
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2627
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
2728
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
2829
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
@@ -59,13 +60,13 @@ require (
5960
go.uber.org/multierr v1.11.0 // indirect
6061
go.uber.org/zap v1.27.0 // indirect
6162
go.yaml.in/yaml/v2 v2.4.2 // indirect
62-
golang.org/x/net v0.38.0 // indirect
63+
golang.org/x/net v0.43.0 // indirect
6364
golang.org/x/oauth2 v0.27.0 // indirect
64-
golang.org/x/sync v0.12.0 // indirect
65-
golang.org/x/term v0.30.0 // indirect
66-
golang.org/x/text v0.23.0 // indirect
65+
golang.org/x/sync v0.16.0 // indirect
66+
golang.org/x/term v0.34.0 // indirect
67+
golang.org/x/text v0.28.0 // indirect
6768
golang.org/x/time v0.9.0 // indirect
68-
golang.org/x/tools v0.31.0 // indirect
69+
golang.org/x/tools v0.36.0 // indirect
6970
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
7071
google.golang.org/protobuf v1.36.5 // indirect
7172
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect

go.sum

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
123123
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
124124
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
125125
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
126+
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
127+
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
126128
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
127129
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
128130
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -140,34 +142,34 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
140142
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
141143
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
142144
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
143-
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
144-
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
145+
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
146+
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
145147
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
146148
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
147149
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
148150
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
149151
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
150-
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
151-
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
152+
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
153+
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
152154
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
153155
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
154156
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
155-
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
156-
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
157-
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
158-
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
157+
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
158+
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
159+
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
160+
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
159161
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
160162
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
161-
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
162-
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
163+
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
164+
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
163165
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
164166
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
165167
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
166168
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
167169
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
168170
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
169-
golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
170-
golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
171+
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
172+
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
171173
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
172174
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
173175
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/controller/finbackup_controller.go

Lines changed: 95 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const (
4545
labelComponentDeletionJob = "deletion-job"
4646

4747
// Annotations
48-
annotationBackupTargetRBDImage = "fin.cybozu.io/backup-target-rbd-image"
48+
AnnotationBackupTargetRBDImage = "fin.cybozu.io/backup-target-rbd-image"
4949
annotationDiffFrom = "fin.cybozu.io/diff-from"
5050
annotationFinBackupName = "fin.cybozu.io/finbackup-name"
5151
annotationFinBackupNamespace = "fin.cybozu.io/finbackup-namespace"
@@ -68,6 +68,7 @@ const (
6868
var (
6969
errNonRetryableReconcile = errors.New("non retryable reconciliation error; " +
7070
"reconciliation must not keep going nor be retried")
71+
errVolumeLockedByAnother = errors.New("the volume is locked by another process")
7172
)
7273

7374
// FinBackupReconciler reconciles a FinBackup object
@@ -78,6 +79,7 @@ type FinBackupReconciler struct {
7879
podImage string
7980
maxPartSize *resource.Quantity
8081
snapRepo model.RBDSnapshotRepository
82+
imageLocker model.RBDImageLocker
8183
rawImgExpansionUnitSize uint64
8284
}
8385

@@ -88,6 +90,7 @@ func NewFinBackupReconciler(
8890
podImage string,
8991
maxPartSize *resource.Quantity,
9092
snapRepo model.RBDSnapshotRepository,
93+
imageLocker model.RBDImageLocker,
9194
rawImgExpansionUnitSize uint64,
9295
) *FinBackupReconciler {
9396
return &FinBackupReconciler{
@@ -97,6 +100,7 @@ func NewFinBackupReconciler(
97100
podImage: podImage,
98101
maxPartSize: maxPartSize,
99102
snapRepo: snapRepo,
103+
imageLocker: imageLocker,
100104
rawImgExpansionUnitSize: rawImgExpansionUnitSize,
101105
}
102106
}
@@ -386,7 +390,7 @@ func (r *FinBackupReconciler) createSnapshot(ctx context.Context, backup *finv1.
386390
if annotations == nil {
387391
annotations = map[string]string{}
388392
}
389-
annotations[annotationBackupTargetRBDImage] = rbdImage
393+
annotations[AnnotationBackupTargetRBDImage] = rbdImage
390394
annotations[annotationRBDPool] = rbdPool
391395
backup.SetAnnotations(annotations)
392396

@@ -396,8 +400,13 @@ func (r *FinBackupReconciler) createSnapshot(ctx context.Context, backup *finv1.
396400
return ctrl.Result{}, err
397401
}
398402

399-
snap, err := r.createSnapshotIfNeeded(rbdPool, rbdImage, snapshotName(backup))
403+
snap, err := r.createSnapshotIfNeeded(rbdPool, rbdImage, snapshotName(backup), lockID(backup))
400404
if err != nil {
405+
if errors.Is(err, errVolumeLockedByAnother) {
406+
logger.Info("the volume is locked by another process", "uid", string(backup.GetUID()))
407+
// FIXME: The following "requeue after" is temporary code.
408+
return ctrl.Result{RequeueAfter: 5 * time.Second}, nil
409+
}
401410
logger.Error(err, "failed to create or get snapshot")
402411
return ctrl.Result{}, err
403412
}
@@ -571,12 +580,20 @@ func (r *FinBackupReconciler) reconcileDelete(
571580
return ctrl.Result{}, nil
572581
}
573582

574-
func (r *FinBackupReconciler) createSnapshotIfNeeded(rbdPool, rbdImage, snapName string) (*model.RBDSnapshot, error) {
583+
func (r *FinBackupReconciler) createSnapshotIfNeeded(rbdPool, rbdImage, snapName, lockID string) (*model.RBDSnapshot, error) {
575584
snap, err := findSnapshot(r.snapRepo, rbdPool, rbdImage, snapName)
576585
if err != nil {
577586
if !errors.Is(err, model.ErrNotFound) {
578587
return nil, fmt.Errorf("failed to get snapshot: %w", err)
579588
}
589+
590+
lockSuccess, err := r.lockVolume(rbdPool, rbdImage, lockID)
591+
if err != nil {
592+
return nil, fmt.Errorf("failed to lock image: %w", err)
593+
}
594+
if !lockSuccess {
595+
return nil, errVolumeLockedByAnother
596+
}
580597
err = r.snapRepo.CreateSnapshot(rbdPool, rbdImage, snapName)
581598
if err != nil {
582599
return nil, fmt.Errorf("failed to create snapshot: %w", err)
@@ -586,6 +603,10 @@ func (r *FinBackupReconciler) createSnapshotIfNeeded(rbdPool, rbdImage, snapName
586603
return nil, fmt.Errorf("failed to get snapshot after creation: %w", err)
587604
}
588605
}
606+
if err := r.unlockVolume(rbdPool, rbdImage, lockID); err != nil {
607+
return nil, fmt.Errorf("failed to unlock image: %w", err)
608+
}
609+
589610
return snap, nil
590611
}
591612

@@ -613,6 +634,70 @@ func (r *FinBackupReconciler) removeSnapshot(ctx context.Context, backup *finv1.
613634
return nil
614635
}
615636

637+
// lockVolume adds a lock to the specified RBD volume if the lock is not already held.
638+
// It returns true if the lock is held by this caller, false if another lock is held or an error occurs.
639+
func (r *FinBackupReconciler) lockVolume(
640+
poolName, imageName, lockID string,
641+
) (bool, error) {
642+
// Add a lock.
643+
if errAdd := r.imageLocker.LockAdd(poolName, imageName, lockID); errAdd != nil {
644+
locks, errLs := r.imageLocker.LockLs(poolName, imageName)
645+
if errLs != nil {
646+
return false, fmt.Errorf("failed to add a lock and list locks on volume %s/%s: %w", poolName, imageName, errors.Join(errAdd, errLs))
647+
}
648+
649+
switch len(locks) {
650+
case 0:
651+
// It may have been unlocked after the lock failed, but since other causes are also possible, an error is returned.
652+
return false, fmt.Errorf("failed to add a lock to the volume %s/%s: %w", poolName, imageName, errAdd)
653+
654+
case 1:
655+
if locks[0].LockID == lockID {
656+
// Already locked by this FB.
657+
return true, nil
658+
}
659+
// Locked by another process.
660+
return false, nil
661+
662+
default:
663+
// Multiple locks found; unexpected state.
664+
return false, fmt.Errorf("multiple locks found on volume %s/%s after failed lock attempt(%v)", poolName, imageName, locks)
665+
}
666+
}
667+
668+
// Locked
669+
return true, nil
670+
}
671+
672+
// unlockVolume removes the specified lock from the RBD volume if the lock is held.
673+
// No action is taken if the lock is not found.
674+
func (r *FinBackupReconciler) unlockVolume(
675+
poolName, imageName, lockID string,
676+
) error {
677+
// List up locks to check if the lock is held.
678+
locks, err := r.imageLocker.LockLs(poolName, imageName)
679+
if err != nil {
680+
return fmt.Errorf("failed to list locks of the volume %s/%s: %w", poolName, imageName, err)
681+
}
682+
683+
if len(locks) >= 2 {
684+
return fmt.Errorf("multiple locks found on volume %s/%s when unlocking (%v)", poolName, imageName, locks)
685+
}
686+
687+
for _, lock := range locks {
688+
if lock.LockID == lockID {
689+
// Unlock
690+
if err := r.imageLocker.LockRm(poolName, imageName, lock); err != nil {
691+
return fmt.Errorf("failed to remove the lock from the volume %s/%s: %w", poolName, imageName, err)
692+
}
693+
return nil
694+
}
695+
}
696+
697+
// Already unlocked.
698+
return nil
699+
}
700+
616701
func (r *FinBackupReconciler) getRBDPoolAndImageFromPVC(
617702
ctx context.Context,
618703
pvc *corev1.PersistentVolumeClaim,
@@ -637,7 +722,7 @@ func (r *FinBackupReconciler) getRBDPoolAndImageFromPVC(
637722

638723
func (r *FinBackupReconciler) getRBDPoolAndImage(ctx context.Context, backup *finv1.FinBackup) (string, string, error) {
639724
rbdPool := backup.GetAnnotations()[annotationRBDPool]
640-
rbdImage := backup.GetAnnotations()[annotationBackupTargetRBDImage]
725+
rbdImage := backup.GetAnnotations()[AnnotationBackupTargetRBDImage]
641726
if rbdPool != "" && rbdImage != "" {
642727
return rbdPool, rbdImage, nil
643728
}
@@ -733,6 +818,10 @@ func cleanupJobName(backup *finv1.FinBackup) string {
733818
return "fin-cleanup-" + string(backup.GetUID())
734819
}
735820

821+
func lockID(backup *finv1.FinBackup) string {
822+
return string(backup.GetUID())
823+
}
824+
736825
func (r *FinBackupReconciler) createOrUpdateBackupJob(
737826
ctx context.Context, backup *finv1.FinBackup, diffFrom string,
738827
backupTargetPVCUID string, maxPartSize *resource.Quantity,
@@ -794,7 +883,7 @@ func (r *FinBackupReconciler) createOrUpdateBackupJob(
794883
},
795884
{
796885
Name: "RBD_IMAGE_NAME",
797-
Value: backup.GetAnnotations()[annotationBackupTargetRBDImage],
886+
Value: backup.GetAnnotations()[AnnotationBackupTargetRBDImage],
798887
},
799888
{
800889
Name: "BACKUP_SNAPSHOT_ID",

0 commit comments

Comments
 (0)