Skip to content

Commit c564646

Browse files
1gtmhmsayem
andauthored
Add support for backup and restore from different namespace (#1354) (#1362)
/cherry-pick Signed-off-by: hmsayem hmsayem@appscode.com Co-authored-by: Hossain Mahmud <hmsayem@appscode.com>
1 parent 23386af commit c564646

File tree

127 files changed

+27234
-11234
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+27234
-11234
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,3 +362,10 @@ release:
362362
.PHONY: clean
363363
clean:
364364
rm -rf .go bin
365+
366+
# make and load docker image to kind cluster
367+
.PHONY: push-to-kind
368+
push-to-kind: container
369+
@echo "Loading docker image into kind cluster...."
370+
@kind load docker-image $(REGISTRY)/stash-mongodb:$(TAG)
371+
@echo "Image has been pushed successfully into kind cluster."

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ require (
1515
k8s.io/apimachinery v0.21.1
1616
k8s.io/client-go v0.21.1
1717
k8s.io/klog/v2 v2.8.0
18-
kmodules.xyz/custom-resources v0.0.0-20211122142737-3bf3dbd8ac52
18+
kmodules.xyz/client-go v0.0.0-20220108081101-27afc2ac4ebe
19+
kmodules.xyz/custom-resources v0.0.0-20220104123914-3c036dd7c1cd
1920
kmodules.xyz/offshoot-api v0.0.0-20211103060642-3e217667cf41
2021
kubedb.dev/apimachinery v0.23.0
21-
stash.appscode.dev/apimachinery v0.17.0
22+
stash.appscode.dev/apimachinery v0.17.1-0.20220113052814-7da4b19c88a3
2223
)
2324

2425
replace bitbucket.org/ww/goautoneg => gomodules.xyz/goautoneg v0.0.0-20120707110453-a547fc61f48d

go.sum

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -605,9 +605,7 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
605605
github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI=
606606
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
607607
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
608-
github.com/robfig/cron v1.1.0 h1:jk4/Hud3TTdcrJgUOBgsqrZBarcxl6ADIjSC2iniwLY=
609608
github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
610-
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
611609
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
612610
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
613611
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -928,8 +926,9 @@ golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5f
928926
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
929927
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
930928
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
931-
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
932929
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
930+
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
931+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
933932
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
934933
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
935934
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1104,6 +1103,7 @@ k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRV
11041103
k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
11051104
k8s.io/code-generator v0.21.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
11061105
k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
1106+
k8s.io/component-base v0.21.1 h1:iLpj2btXbR326s/xNQWmPNGu0gaYSjzn7IN/5i28nQw=
11071107
k8s.io/component-base v0.21.1/go.mod h1:NgzFZ2qu4m1juby4TnrmpR8adRk6ka62YdH5DkIIyKA=
11081108
k8s.io/component-helpers v0.21.0/go.mod h1:tezqefP7lxfvJyR+0a+6QtVrkZ/wIkyMLK4WcQ3Cj8U=
11091109
k8s.io/component-helpers v0.21.1/go.mod h1:FtC1flbiQlosHQrLrRUulnKxE4ajgWCGy/67fT2GRlQ=
@@ -1147,13 +1147,14 @@ kmodules.xyz/client-go v0.0.0-20210928133955-8df5bb467db6/go.mod h1:0gkPeALtYjB2
11471147
kmodules.xyz/client-go v0.0.0-20211013093146-1fbfd52e78c9/go.mod h1:0gkPeALtYjB27OHt4rd6+ZmMgoVTHVLtEJQeU23/gtA=
11481148
kmodules.xyz/client-go v0.0.0-20211107190155-5bb4090d2728/go.mod h1:ENUu8pPK19xzBkVpAJHoGCI2QRvb1SqffWRt0K2sV5I=
11491149
kmodules.xyz/client-go v0.0.0-20211110065417-091bd089a92d/go.mod h1:ENUu8pPK19xzBkVpAJHoGCI2QRvb1SqffWRt0K2sV5I=
1150-
kmodules.xyz/client-go v0.0.0-20211122091731-6c471b24a4ea h1:z5Li57oxum0018ryWpI5w5HYVFgI2S2cVj27R76IRnU=
1151-
kmodules.xyz/client-go v0.0.0-20211122091731-6c471b24a4ea/go.mod h1:ENUu8pPK19xzBkVpAJHoGCI2QRvb1SqffWRt0K2sV5I=
1150+
kmodules.xyz/client-go v0.0.0-20220104114408-2a3a05dbe89f/go.mod h1:xxl1ve1Obe4xaW+XjXsNHyLTni4QPIvHn9TfnYEoQRo=
1151+
kmodules.xyz/client-go v0.0.0-20220108081101-27afc2ac4ebe h1:EZE/eC9UF5/wcdHiinzQDVshOceIP9uRxT7qM4BnUQg=
1152+
kmodules.xyz/client-go v0.0.0-20220108081101-27afc2ac4ebe/go.mod h1:xxl1ve1Obe4xaW+XjXsNHyLTni4QPIvHn9TfnYEoQRo=
11521153
kmodules.xyz/constants v0.0.0-20210218100002-2c304bfda278/go.mod h1:DbiFk1bJ1KEO94t1SlAn7tzc+Zz95rSXgyUKa2nzPmY=
11531154
kmodules.xyz/crd-schema-fuzz v0.0.0-20210618002152-fae23aef5fb4/go.mod h1:IIkUctlfoptoci0BOrsUf8ya+MOG5uaeh1PE4uzaIbA=
11541155
kmodules.xyz/custom-resources v0.0.0-20211007080833-72bd9e8cae6e/go.mod h1:pGabego8q4oi/2sNjhdtFkgVaVw4AyGv14GO6VtAjTw=
1155-
kmodules.xyz/custom-resources v0.0.0-20211122142737-3bf3dbd8ac52 h1:UWVpU7y5znTUusU+JhPB+ojh26f6K2v8sNb37U1DolQ=
1156-
kmodules.xyz/custom-resources v0.0.0-20211122142737-3bf3dbd8ac52/go.mod h1:yHLFe4wVYxepTnN00CFUf29xH+jEHDokq6d2fbp9pks=
1156+
kmodules.xyz/custom-resources v0.0.0-20220104123914-3c036dd7c1cd h1:EMcK5eA42CO9Cn290VOy2WIt2YSEbQItlMq8lU+831M=
1157+
kmodules.xyz/custom-resources v0.0.0-20220104123914-3c036dd7c1cd/go.mod h1:/XjDeILFV2wBota5kHo21DMvOt08nSAk1vm6buCuwt4=
11571158
kmodules.xyz/monitoring-agent-api v0.0.0-20210928135619-38ca075a2dbd/go.mod h1:08pBqfEuy29EjhaMrHB2XFy2iekoFi7AjaXcJS+xAck=
11581159
kmodules.xyz/objectstore-api v0.0.0-20210928135706-fdf68f88ea6e/go.mod h1:Tkcf9uTplnrJ6C8o0zlw2kpgS1SaWAiMO5P2YgLjTo8=
11591160
kmodules.xyz/objectstore-api v0.0.0-20211116180107-8720be0c9bf7 h1:JIAEFjN3GDhLEG1Fh1zYpy/QFyyN337mJTM+ODEGosg=
@@ -1167,6 +1168,7 @@ kmodules.xyz/prober v0.0.0-20210618020259-5836fb959027/go.mod h1:H4NcvS1RQxeXtQO
11671168
kmodules.xyz/resource-metadata v0.6.4/go.mod h1:KWf68Ado/hgYpb/msYNvhYSLWvS/bJcVAAHO1/q9nNg=
11681169
kmodules.xyz/resource-metrics v0.0.3/go.mod h1:6Dv63HDgp83DhA+lZNB7GIQR6PLjNrYW6ghQKioQzII=
11691170
kmodules.xyz/resource-metrics v0.0.5/go.mod h1:6Dv63HDgp83DhA+lZNB7GIQR6PLjNrYW6ghQKioQzII=
1171+
kmodules.xyz/resource-metrics v0.0.6/go.mod h1:M7rWuo2qh3BpHhogiEVPnvGY9Xx4Pfygqn1Rex8YbgM=
11701172
kmodules.xyz/webhook-runtime v0.0.0-20210928141616-7f73c2ab318a/go.mod h1:MFZFmJk9IXNHwq8JlF/mukwBDbopFQj4swaB2MWHc/U=
11711173
kubedb.dev/apimachinery v0.23.0 h1:K0dKXx7XJINv3Py75D/up6V3zl8XfX/e/rvspNejXNA=
11721174
kubedb.dev/apimachinery v0.23.0/go.mod h1:x8UBaJPIBCD6S58VQ+38+QxFUXCYdvFrmP9FnOuPOaI=
@@ -1204,5 +1206,5 @@ software.sslmate.com/src/go-pkcs12 v0.0.0-20180114231543-2291e8f0f237/go.mod h1:
12041206
software.sslmate.com/src/go-pkcs12 v0.0.0-20200830195227-52f69702a001/go.mod h1:/xvNRWUqm0+/ZMiF4EX00vrSCMsE4/NHb+Pt3freEeQ=
12051207
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
12061208
stash.appscode.dev/apimachinery v0.16.0/go.mod h1:unpV/YyHVECNrAdFjFg/SetmPeUjfvc2+P8cnGjih/U=
1207-
stash.appscode.dev/apimachinery v0.17.0 h1:v0razjOko1K0npOwRzvtymdMByL/cWSNQBgaIq7KaoU=
1208-
stash.appscode.dev/apimachinery v0.17.0/go.mod h1:hmxBy6Ei6RjBLgXw4A1hE4eyEgsa43H2LCs1yDfI3GM=
1209+
stash.appscode.dev/apimachinery v0.17.1-0.20220113052814-7da4b19c88a3 h1:jWOAWMKDc15vVPqq4pToYyRkitlGh6Y2+1V5QgGZsYY=
1210+
stash.appscode.dev/apimachinery v0.17.1-0.20220113052814-7da4b19c88a3/go.mod h1:BGM/ztGKtXZrtz/voZzRqop8KbbZ+pFI4YeSLVb2MB0=

pkg/backup.go

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ func NewCmdBackup() *cobra.Command {
101101
RunE: func(cmd *cobra.Command, args []string) error {
102102
defer cleanup()
103103

104-
flags.EnsureRequiredFlags(cmd, "appbinding", "provider", "secret-dir")
104+
flags.EnsureRequiredFlags(cmd, "appbinding", "provider", "storage-secret-name", "storage-secret-namespace")
105105

106106
// catch sigkill signals and gracefully terminate so that cleanup functions are executed.
107-
sigChan := make(chan os.Signal)
107+
sigChan := make(chan os.Signal, 1)
108108
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
109109
go func() {
110110
rcvSig := <-sigChan
@@ -180,11 +180,13 @@ func NewCmdBackup() *cobra.Command {
180180
cmd.Flags().StringVar(&opt.setupOptions.Endpoint, "endpoint", opt.setupOptions.Endpoint, "Endpoint for s3/s3 compatible backend or REST server URL")
181181
cmd.Flags().StringVar(&opt.setupOptions.Region, "region", opt.setupOptions.Region, "Region for s3/s3 compatible backend")
182182
cmd.Flags().StringVar(&opt.setupOptions.Path, "path", opt.setupOptions.Path, "Directory inside the bucket where backup will be stored")
183-
cmd.Flags().StringVar(&opt.setupOptions.SecretDir, "secret-dir", opt.setupOptions.SecretDir, "Directory where storage secret has been mounted")
184183
cmd.Flags().StringVar(&opt.setupOptions.ScratchDir, "scratch-dir", opt.setupOptions.ScratchDir, "Temporary directory")
185184
cmd.Flags().BoolVar(&opt.setupOptions.EnableCache, "enable-cache", opt.setupOptions.EnableCache, "Specify whether to enable caching for restic")
186185
cmd.Flags().Int64Var(&opt.setupOptions.MaxConnections, "max-connections", opt.setupOptions.MaxConnections, "Specify maximum concurrent connections for GCS, Azure and B2 backend")
187186

187+
cmd.Flags().StringVar(&opt.storageSecret.Name, "storage-secret-name", opt.storageSecret.Name, "Name of the storage secret")
188+
cmd.Flags().StringVar(&opt.storageSecret.Namespace, "storage-secret-namespace", opt.storageSecret.Namespace, "Namespace of the storage secret")
189+
cmd.Flags().StringVar(&opt.authenticationDatabase, "authentication-database", "admin", "Specify the authentication database")
188190
cmd.Flags().StringVar(&opt.defaultBackupOptions.Host, "hostname", opt.defaultBackupOptions.Host, "Name of the host machine")
189191

190192
cmd.Flags().Int64Var(&opt.defaultBackupOptions.RetentionPolicy.KeepLast, "retention-keep-last", opt.defaultBackupOptions.RetentionPolicy.KeepLast, "Specify value for retention strategy")
@@ -203,6 +205,12 @@ func NewCmdBackup() *cobra.Command {
203205
}
204206

205207
func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic.BackupOutput, error) {
208+
var err error
209+
opt.setupOptions.StorageSecret, err = opt.kubeClient.CoreV1().Secrets(opt.storageSecret.Namespace).Get(context.TODO(), opt.storageSecret.Name, metav1.GetOptions{})
210+
if err != nil {
211+
return nil, err
212+
}
213+
206214
// if any pre-backup actions has been assigned to it, execute them
207215
actionOptions := api_util.ActionOptions{
208216
StashClient: opt.stashClient,
@@ -211,7 +219,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
211219
BackupSessionName: opt.backupSessionName,
212220
Namespace: opt.namespace,
213221
}
214-
err := api_util.ExecutePreBackupActions(actionOptions)
222+
err = api_util.ExecutePreBackupActions(actionOptions)
215223
if err != nil {
216224
return nil, err
217225
}
@@ -230,25 +238,32 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
230238
return nil, err
231239
}
232240

233-
// get app binding
234241
appBinding, err := opt.catalogClient.AppcatalogV1alpha1().AppBindings(opt.namespace).Get(context.TODO(), opt.appBindingName, metav1.GetOptions{})
235242
if err != nil {
236243
return nil, err
237244
}
238-
// get secret
245+
239246
appBindingSecret, err := opt.kubeClient.CoreV1().Secrets(opt.namespace).Get(context.TODO(), appBinding.Spec.Secret.Name, metav1.GetOptions{})
240247
if err != nil {
241248
return nil, err
242249
}
243250

244-
// transform secret
245251
err = appBinding.TransformSecret(opt.kubeClient, appBindingSecret.Data)
246252
if err != nil {
247253
return nil, err
248254
}
249255

250-
// wait for DB ready
251-
waitForDBReady(appBinding.Spec.ClientConfig.Service.Name, appBinding.Spec.ClientConfig.Service.Port, opt.waitTimeout)
256+
hostname, err := appBinding.Hostname()
257+
if err != nil {
258+
return nil, err
259+
}
260+
261+
port, err := appBinding.Port()
262+
if err != nil {
263+
return nil, err
264+
}
265+
266+
waitForDBReady(hostname, port, opt.waitTimeout)
252267

253268
// unmarshal parameter is the field has value
254269
parameters := v1alpha1.MongoDBConfiguration{}
@@ -344,7 +359,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
344359
userAuth := []interface{}{
345360
"--username", string(appBindingSecret.Data[MongoUserKey]),
346361
"--password", string(appBindingSecret.Data[MongoPasswordKey]),
347-
"--authenticationDatabase", "admin",
362+
"--authenticationDatabase", opt.authenticationDatabase,
348363
}
349364
mongoCreds = append(mongoCreds, userAuth...)
350365
dumpCreds = append(dumpCreds, userAuth...)
@@ -370,7 +385,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
370385
userArgs := strings.Fields(opt.mongoArgs)
371386

372387
if isStandalone {
373-
backupCmd.Args = append(backupCmd.Args, "--port="+fmt.Sprint(appBinding.Spec.ClientConfig.Service.Port))
388+
backupCmd.Args = append(backupCmd.Args, fmt.Sprintf("--port=%d", port))
374389
} else {
375390
// - port is already added in mongoDSN with replicasetName/host:port format.
376391
// - oplog is enabled automatically for replicasets.
@@ -415,17 +430,16 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
415430

416431
if parameters.ConfigServer != "" {
417432
// sharded cluster. so disable the balancer first. then perform the 'usual' tasks.
418-
419433
primary, secondary, err := getPrimaryNSecondaryMember(parameters.ConfigServer)
420434
if err != nil {
421435
return nil, err
422436
}
423437

424438
// connect to mongos to disable/enable balancer
425-
err = disabelBalancer(appBinding.Spec.ClientConfig.Service.Name)
439+
err = disabelBalancer(hostname)
426440
cleanupFuncs = append(cleanupFuncs, func() error {
427441
// even if error occurs, try to enable the balancer on exiting the program.
428-
return enableBalancer(appBinding.Spec.ClientConfig.Service.Name)
442+
return enableBalancer(hostname)
429443
})
430444
if err != nil {
431445
return nil, err
@@ -439,14 +453,15 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
439453
}
440454

441455
err = lockConfigServer(parameters.ConfigServer, secondary)
456+
442457
cleanupFuncs = append(cleanupFuncs, func() error {
443458
// even if error occurs, try to unlock the server
444459
return unlockSecondaryMember(secondary)
445460
})
446461
if err != nil {
462+
klog.Errorf("error while locking config server. error: %v", err)
447463
return nil, err
448464
}
449-
450465
opt.backupOptions = append(opt.backupOptions, getBackupOpt(backupHost, MongoConfigSVRHostKey, false))
451466
}
452467

@@ -481,7 +496,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
481496
// if parameters.ReplicaSets is nil, then the mongodb database doesn't have replicasets or sharded replicasets.
482497
// In this case, perform normal backup with clientconfig.Service.Name mongo dsn
483498
if parameters.ReplicaSets == nil {
484-
opt.backupOptions = append(opt.backupOptions, getBackupOpt(appBinding.Spec.ClientConfig.Service.Name, restic.DefaultHost, true))
499+
opt.backupOptions = append(opt.backupOptions, getBackupOpt(hostname, restic.DefaultHost, true))
485500
}
486501

487502
klog.Infoln("processing backup.")
@@ -493,7 +508,6 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
493508
// hide password, don't print cmd
494509
resticWrapper.HideCMD()
495510

496-
// Run backup
497511
return resticWrapper.RunParallelBackup(opt.backupOptions, targetRef, opt.maxConcurrency)
498512
}
499513

@@ -615,12 +629,12 @@ func enableBalancer(mongosHost string) error {
615629

616630
func lockConfigServer(configSVRDSN, secondaryHost string) error {
617631
klog.Infoln("Attempting to lock configserver", configSVRDSN)
632+
618633
if secondaryHost == "" {
619634
klog.Warningln("locking configserver is skipped. secondary host is empty")
620635
return nil
621636
}
622637
v := make(map[string]interface{})
623-
624638
// findAndModify BackupControlDocument. skip single quote inside single quote: https://stackoverflow.com/a/28786747/4628962
625639
args := append([]interface{}{
626640
"config",
@@ -631,12 +645,10 @@ func lockConfigServer(configSVRDSN, secondaryHost string) error {
631645
if err := sh.Command(MongoCMD, args...).Command("/usr/bin/tail", "-1").UnmarshalJSON(&v); err != nil {
632646
return err
633647
}
634-
635648
val, ok := v["counter"].(float64)
636649
if !ok || int(val) == 0 {
637650
return fmt.Errorf("unable to modify BackupControlDocument. got response: %v", v)
638651
}
639-
640652
val2 := float64(0)
641653
timer := 0 // wait approximately 5 minutes.
642654
for timer < 60 && (int(val2) == 0 || int(val) != int(val2)) {
@@ -646,17 +658,17 @@ func lockConfigServer(configSVRDSN, secondaryHost string) error {
646658
"config",
647659
"--host", secondaryHost,
648660
"--quiet",
649-
"--eval", "rs.slaveOk(); db.BackupControl.find({ '_id' : 'BackupControlDocument' }).readConcern('majority');",
650-
}, mongoCreds...)
651-
if err := sh.Command(MongoCMD, args...).Command("/usr/bin/tail", "-1").UnmarshalJSON(&v); err != nil {
661+
"--eval", "rs.secondaryOk(); db.BackupControl.find({ '_id' : 'BackupControlDocument' }).readConcern('majority');",
662+
}, adminCreds...)
663+
664+
if err := sh.Command(MongoCMD, args...).UnmarshalJSON(&v); err != nil {
652665
return err
653666
}
654667

655668
val2, ok = v["counter"].(float64)
656669
if !ok {
657670
return fmt.Errorf("unable to get BackupControlDocument. got response: %v", v)
658671
}
659-
660672
if int(val) != int(val2) {
661673
klog.V(5).Infof("BackupDocument counter in secondary is not same. Expected %v, but got %v. Full response: %v", val, val2, v)
662674
time.Sleep(time.Second * 5)
@@ -665,7 +677,6 @@ func lockConfigServer(configSVRDSN, secondaryHost string) error {
665677
if timer >= 60 {
666678
return fmt.Errorf("timeout while waiting for BackupDocument counter in secondary to be same as primary. Expected %v, but got %v. Full response: %v", val, val2, v)
667679
}
668-
669680
// lock secondary
670681
return lockSecondaryMember(secondaryHost)
671682
}

0 commit comments

Comments
 (0)