Skip to content

Commit caf4c25

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

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
@@ -104,10 +104,10 @@ func NewCmdBackup() *cobra.Command {
104104
RunE: func(cmd *cobra.Command, args []string) error {
105105
defer cleanup()
106106

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

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

190+
cmd.Flags().StringVar(&opt.storageSecret.Name, "storage-secret-name", opt.storageSecret.Name, "Name of the storage secret")
191+
cmd.Flags().StringVar(&opt.storageSecret.Namespace, "storage-secret-namespace", opt.storageSecret.Namespace, "Namespace of the storage secret")
192+
cmd.Flags().StringVar(&opt.authenticationDatabase, "authentication-database", "admin", "Specify the authentication database")
191193
cmd.Flags().StringVar(&opt.defaultBackupOptions.Host, "hostname", opt.defaultBackupOptions.Host, "Name of the host machine")
192194

193195
cmd.Flags().Int64Var(&opt.defaultBackupOptions.RetentionPolicy.KeepLast, "retention-keep-last", opt.defaultBackupOptions.RetentionPolicy.KeepLast, "Specify value for retention strategy")
@@ -206,6 +208,12 @@ func NewCmdBackup() *cobra.Command {
206208
}
207209

208210
func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic.BackupOutput, error) {
211+
var err error
212+
opt.setupOptions.StorageSecret, err = opt.kubeClient.CoreV1().Secrets(opt.storageSecret.Namespace).Get(context.TODO(), opt.storageSecret.Name, metav1.GetOptions{})
213+
if err != nil {
214+
return nil, err
215+
}
216+
209217
// if any pre-backup actions has been assigned to it, execute them
210218
actionOptions := api_util.ActionOptions{
211219
StashClient: opt.stashClient,
@@ -214,7 +222,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
214222
BackupSessionName: opt.backupSessionName,
215223
Namespace: opt.namespace,
216224
}
217-
err := api_util.ExecutePreBackupActions(actionOptions)
225+
err = api_util.ExecutePreBackupActions(actionOptions)
218226
if err != nil {
219227
return nil, err
220228
}
@@ -233,25 +241,32 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
233241
return nil, err
234242
}
235243

236-
// get app binding
237244
appBinding, err := opt.catalogClient.AppcatalogV1alpha1().AppBindings(opt.namespace).Get(context.TODO(), opt.appBindingName, metav1.GetOptions{})
238245
if err != nil {
239246
return nil, err
240247
}
241-
// get secret
248+
242249
appBindingSecret, err := opt.kubeClient.CoreV1().Secrets(opt.namespace).Get(context.TODO(), appBinding.Spec.Secret.Name, metav1.GetOptions{})
243250
if err != nil {
244251
return nil, err
245252
}
246253

247-
// transform secret
248254
err = appBinding.TransformSecret(opt.kubeClient, appBindingSecret.Data)
249255
if err != nil {
250256
return nil, err
251257
}
252258

253-
// wait for DB ready
254-
waitForDBReady(appBinding.Spec.ClientConfig.Service.Name, appBinding.Spec.ClientConfig.Service.Port, opt.waitTimeout)
259+
hostname, err := appBinding.Hostname()
260+
if err != nil {
261+
return nil, err
262+
}
263+
264+
port, err := appBinding.Port()
265+
if err != nil {
266+
return nil, err
267+
}
268+
269+
waitForDBReady(hostname, port, opt.waitTimeout)
255270

256271
// unmarshal parameter is the field has value
257272
parameters := v1alpha1.MongoDBConfiguration{}
@@ -347,7 +362,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
347362
userAuth := []interface{}{
348363
"--username", string(appBindingSecret.Data[MongoUserKey]),
349364
"--password", string(appBindingSecret.Data[MongoPasswordKey]),
350-
"--authenticationDatabase", "admin",
365+
"--authenticationDatabase", opt.authenticationDatabase,
351366
}
352367
mongoCreds = append(mongoCreds, userAuth...)
353368
dumpCreds = append(dumpCreds, userAuth...)
@@ -373,7 +388,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
373388
userArgs := strings.Fields(opt.mongoArgs)
374389

375390
if isStandalone {
376-
backupCmd.Args = append(backupCmd.Args, "--port="+fmt.Sprint(appBinding.Spec.ClientConfig.Service.Port))
391+
backupCmd.Args = append(backupCmd.Args, fmt.Sprintf("--port=%d", port))
377392
} else {
378393
// - port is already added in mongoDSN with replicasetName/host:port format.
379394
// - oplog is enabled automatically for replicasets.
@@ -449,17 +464,16 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
449464
}
450465

451466
// sharded cluster. so disable the balancer first. then perform the 'usual' tasks.
452-
453467
primary, secondary, err := getPrimaryNSecondaryMember(parameters.ConfigServer)
454468
if err != nil {
455469
return nil, err
456470
}
457471

458472
// connect to mongos to disable/enable balancer
459-
err = disabelBalancer(appBinding.Spec.ClientConfig.Service.Name)
473+
err = disabelBalancer(hostname)
460474
cleanupFuncs = append(cleanupFuncs, func() error {
461475
// even if error occurs, try to enable the balancer on exiting the program.
462-
return enableBalancer(appBinding.Spec.ClientConfig.Service.Name)
476+
return enableBalancer(hostname)
463477
})
464478
if err != nil {
465479
return nil, err
@@ -473,14 +487,15 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
473487
}
474488

475489
err = lockConfigServer(parameters.ConfigServer, secondary)
490+
476491
cleanupFuncs = append(cleanupFuncs, func() error {
477492
// even if error occurs, try to unlock the server
478493
return unlockSecondaryMember(secondary)
479494
})
480495
if err != nil {
496+
klog.Errorf("error while locking config server. error: %v", err)
481497
return nil, err
482498
}
483-
484499
opt.backupOptions = append(opt.backupOptions, getBackupOpt(backupHost, MongoConfigSVRHostKey, false))
485500
}
486501

@@ -522,7 +537,7 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
522537
// if parameters.ReplicaSets is nil, then the mongodb database doesn't have replicasets or sharded replicasets.
523538
// In this case, perform normal backup with clientconfig.Service.Name mongo dsn
524539
if parameters.ReplicaSets == nil {
525-
opt.backupOptions = append(opt.backupOptions, getBackupOpt(appBinding.Spec.ClientConfig.Service.Name, restic.DefaultHost, true))
540+
opt.backupOptions = append(opt.backupOptions, getBackupOpt(hostname, restic.DefaultHost, true))
526541
}
527542

528543
klog.Infoln("processing backup.")
@@ -534,7 +549,6 @@ func (opt *mongoOptions) backupMongoDB(targetRef api_v1beta1.TargetRef) (*restic
534549
// hide password, don't print cmd
535550
resticWrapper.HideCMD()
536551

537-
// Run backup
538552
return resticWrapper.RunParallelBackup(opt.backupOptions, targetRef, opt.maxConcurrency)
539553
}
540554

@@ -656,12 +670,12 @@ func enableBalancer(mongosHost string) error {
656670

657671
func lockConfigServer(configSVRDSN, secondaryHost string) error {
658672
klog.Infoln("Attempting to lock configserver", configSVRDSN)
673+
659674
if secondaryHost == "" {
660675
klog.Warningln("locking configserver is skipped. secondary host is empty")
661676
return nil
662677
}
663678
v := make(map[string]interface{})
664-
665679
// findAndModify BackupControlDocument. skip single quote inside single quote: https://stackoverflow.com/a/28786747/4628962
666680
args := append([]interface{}{
667681
"config",
@@ -672,12 +686,10 @@ func lockConfigServer(configSVRDSN, secondaryHost string) error {
672686
if err := sh.Command(MongoCMD, args...).Command("/usr/bin/tail", "-1").UnmarshalJSON(&v); err != nil {
673687
return err
674688
}
675-
676689
val, ok := v["counter"].(float64)
677690
if !ok || int(val) == 0 {
678691
return fmt.Errorf("unable to modify BackupControlDocument. got response: %v", v)
679692
}
680-
681693
val2 := float64(0)
682694
timer := 0 // wait approximately 5 minutes.
683695
for timer < 60 && (int(val2) == 0 || int(val) != int(val2)) {
@@ -687,17 +699,17 @@ func lockConfigServer(configSVRDSN, secondaryHost string) error {
687699
"config",
688700
"--host", secondaryHost,
689701
"--quiet",
690-
"--eval", "rs.slaveOk(); db.BackupControl.find({ '_id' : 'BackupControlDocument' }).readConcern('majority');",
691-
}, mongoCreds...)
692-
if err := sh.Command(MongoCMD, args...).Command("/usr/bin/tail", "-1").UnmarshalJSON(&v); err != nil {
702+
"--eval", "rs.secondaryOk(); db.BackupControl.find({ '_id' : 'BackupControlDocument' }).readConcern('majority');",
703+
}, adminCreds...)
704+
705+
if err := sh.Command(MongoCMD, args...).UnmarshalJSON(&v); err != nil {
693706
return err
694707
}
695708

696709
val2, ok = v["counter"].(float64)
697710
if !ok {
698711
return fmt.Errorf("unable to get BackupControlDocument. got response: %v", v)
699712
}
700-
701713
if int(val) != int(val2) {
702714
klog.V(5).Infof("BackupDocument counter in secondary is not same. Expected %v, but got %v. Full response: %v", val, val2, v)
703715
time.Sleep(time.Second * 5)
@@ -706,7 +718,6 @@ func lockConfigServer(configSVRDSN, secondaryHost string) error {
706718
if timer >= 60 {
707719
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)
708720
}
709-
710721
// lock secondary
711722
return lockSecondaryMember(secondaryHost)
712723
}

0 commit comments

Comments
 (0)