@@ -146,12 +146,16 @@ func (r *Restore) exit(ctx context.Context, err error) {
146146
147147// resolveNamespace resolves final namespace(s) based on the backup namespace,
148148// restore namespace, cloning options and option whether we should restore users&roles
149- func resolveNamespace (nssBackup , nssRestore []string , cloneNS snapshot.CloneNS , usingUsersAndRoles bool ) []string {
149+ func resolveNamespace (
150+ nssBackup , nssRestore []string ,
151+ cloneNS snapshot.CloneNS ,
152+ usingUsersAndRolesBackup , usingUsersAndRolesRestore bool ,
153+ ) []string {
150154 if cloneNS .IsSpecified () {
151155 return []string {cloneNS .FromNS }
152156 }
153157 if util .IsSelective (nssRestore ) {
154- if usingUsersAndRoles {
158+ if usingUsersAndRolesRestore {
155159 var nss []string
156160 nss = append (nss , nssRestore ... )
157161 nss = append (nss ,
@@ -164,23 +168,34 @@ func resolveNamespace(nssBackup, nssRestore []string, cloneNS snapshot.CloneNS,
164168 return nssRestore
165169 }
166170
171+ // Full restore from selective backup should include users & roles
172+ if util .IsSelective (nssBackup ) && usingUsersAndRolesBackup {
173+ var nss []string
174+ nss = append (nss , nssBackup ... )
175+ nss = append (nss ,
176+ defs .DB + "." + defs .TmpUsersCollection ,
177+ defs .DB + "." + defs .TmpRolesCollection ,
178+ )
179+ return nss
180+ }
181+
167182 return nssBackup
168183}
169184
170185// shouldRestoreUsersAndRoles determines whether user&roles should be restored from the backup
171186func shouldRestoreUsersAndRoles (
172187 nssBackup , nssRestore []string ,
173188 cloneNS snapshot.CloneNS ,
174- usingUsersAndRoles bool ,
189+ usingUsersAndRolesBackup , usingUsersAndRolesRestore bool ,
175190) restoreUsersAndRolesOption {
176191 if cloneNS .IsSpecified () {
177192 return false
178193 }
179- if util .IsSelective (nssBackup ) {
194+ if util .IsSelective (nssBackup ) && ! usingUsersAndRolesBackup {
180195 return false
181196 }
182197 if util .IsSelective (nssRestore ) {
183- return restoreUsersAndRolesOption (usingUsersAndRoles )
198+ return restoreUsersAndRolesOption (usingUsersAndRolesRestore )
184199 }
185200
186201 return true
@@ -218,11 +233,13 @@ func (r *Restore) Snapshot(
218233 bcp .Namespaces ,
219234 cmd .Namespaces ,
220235 cloneNS ,
236+ bcp .SelUsersAndRoles ,
221237 cmd .UsersAndRoles )
222238 usersAndRolesOpt := shouldRestoreUsersAndRoles (
223239 bcp .Namespaces ,
224240 cmd .Namespaces ,
225241 cloneNS ,
242+ bcp .SelUsersAndRoles ,
226243 cmd .UsersAndRoles )
227244
228245 err = setRestoreBackup (ctx , r .leadConn , r .name , cmd .BackupName , nss )
@@ -362,11 +379,13 @@ func (r *Restore) PITR(
362379 bcp .Namespaces ,
363380 cmd .Namespaces ,
364381 cloneNS ,
382+ bcp .SelUsersAndRoles ,
365383 cmd .UsersAndRoles )
366384 usersAndRolesOpt := shouldRestoreUsersAndRoles (
367385 bcp .Namespaces ,
368386 cmd .Namespaces ,
369387 cloneNS ,
388+ bcp .SelUsersAndRoles ,
370389 cmd .UsersAndRoles )
371390
372391 if r .nodeInfo .IsLeader () {
0 commit comments