From 1bc6c6d0bf5465faa6876589a2ea97db2918e4a3 Mon Sep 17 00:00:00 2001 From: richardjcai Date: Tue, 24 May 2022 17:09:48 -0400 Subject: [PATCH] restoreccl: allow restoring system users without user ids During restore, when users in the backup did not have ids, they'll be given one. Release note: None --- pkg/ccl/backupccl/BUILD.bazel | 1 + pkg/ccl/backupccl/backup_test.go | 129 +++++----------- .../full_cluster_backup_restore_test.go | 48 ++++++ pkg/ccl/backupccl/restore_job.go | 17 ++- .../backupccl/restore_old_versions_test.go | 139 ++++++++++++++++++ pkg/ccl/backupccl/system_schema.go | 114 +++++++++++++- .../testdata/backup-restore/feature-flags | 5 + .../BACKUP-LOCK-778749314546466817 | 1 + .../2022/07/13-152350.46/BACKUP-STATISTICS | 0 .../2022/07/13-152350.46/BACKUP_MANIFEST | Bin 0 -> 2833 bytes .../07/13-152350.46/BACKUP_MANIFEST-CHECKSUM | 1 + .../13-152350.46/data/778749316061200385.sst | Bin 0 -> 1139 bytes .../13-152350.46/data/778749316187160577.sst | Bin 0 -> 1851 bytes .../13-152350.46/data/778749316254040065.sst | Bin 0 -> 1530 bytes .../22.1.3/2022/07/13-152350.46/fileinfo.sst | Bin 0 -> 1149 bytes .../22.1.3/2022/07/13-152350.46/metadata.sst | Bin 0 -> 4727 bytes ...ccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe | Bin 0 -> 2721 bytes ...1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM | 1 + ...cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe | Bin 0 -> 2681 bytes ...6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM | 1 + .../22.1.3/BACKUP-LOCK-782466617872318465 | 1 + .../22.1.3/BACKUP-STATISTICS | 0 .../22.1.3/BACKUP_MANIFEST | Bin 0 -> 2891 bytes .../22.1.3/BACKUP_MANIFEST-CHECKSUM | 1 + .../22.1.3/data/782466619668725761.sst | Bin 0 -> 1120 bytes .../22.1.3/data/782466619788066817.sst | Bin 0 -> 1139 bytes .../22.1.3/data/782466619853340673.sst | Bin 0 -> 1441 bytes .../22.1.3/data/782466620157657089.sst | Bin 0 -> 9239 bytes .../system-users-restore/22.1.3/fileinfo.sst | Bin 0 -> 1196 bytes .../system-users-restore/22.1.3/metadata.sst | Bin 0 -> 4750 bytes ...c5caced1cdc8cdcac7dfd4cfcfcfcfdfaaabbcfffe | 1 + ...cfced1c6c6c8cecbcadfd4cfcfcfcfdfaaabbcfffe | Bin 0 -> 2753 bytes ...6c8cecbcadfd4cfcfcfcfdfaaabbcfffe-CHECKSUM | 1 + ...cfced1c8c7c9ccc7c7dfd4cfcfcfcfdfaaabbcfffe | Bin 0 -> 2710 bytes ...7c9ccc7c7dfd4cfcfcfcfdfaaabbcfffe-CHECKSUM | 1 + 35 files changed, 369 insertions(+), 93 deletions(-) create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP-LOCK-778749314546466817 create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP-STATISTICS create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP_MANIFEST create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP_MANIFEST-CHECKSUM create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/data/778749316061200385.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/data/778749316187160577.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/data/778749316254040065.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/fileinfo.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/metadata.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP-LOCK-782466617872318465 create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP-STATISTICS create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP_MANIFEST create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP_MANIFEST-CHECKSUM create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466619668725761.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466619788066817.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466619853340673.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466620157657089.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/fileinfo.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/metadata.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/metadata/latest/LATEST-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5caced1cdc8cdcac7dfd4cfcfcfcfdfaaabbcfffe create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c6c6c8cecbcadfd4cfcfcfcfdfaaabbcfffe create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c6c6c8cecbcadfd4cfcfcfcfdfaaabbcfffe-CHECKSUM create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c8c7c9ccc7c7dfd4cfcfcfcfdfaaabbcfffe create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c8c7c9ccc7c7dfd4cfcfcfcfdfaaabbcfffe-CHECKSUM diff --git a/pkg/ccl/backupccl/BUILD.bazel b/pkg/ccl/backupccl/BUILD.bazel index feb2a7c57182..2424f7e75374 100644 --- a/pkg/ccl/backupccl/BUILD.bazel +++ b/pkg/ccl/backupccl/BUILD.bazel @@ -78,6 +78,7 @@ go_library( "//pkg/sql/catalog/colinfo", "//pkg/sql/catalog/dbdesc", "//pkg/sql/catalog/descbuilder", + "//pkg/sql/catalog/descidgen", "//pkg/sql/catalog/descpb", "//pkg/sql/catalog/descs", "//pkg/sql/catalog/ingesting", diff --git a/pkg/ccl/backupccl/backup_test.go b/pkg/ccl/backupccl/backup_test.go index 4d1cae2af64a..ea3cdc9b95a2 100644 --- a/pkg/ccl/backupccl/backup_test.go +++ b/pkg/ccl/backupccl/backup_test.go @@ -66,13 +66,11 @@ import ( "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/security" "github.com/cockroachdb/cockroach/pkg/security/username" - "github.com/cockroachdb/cockroach/pkg/server" "github.com/cockroachdb/cockroach/pkg/settings/cluster" "github.com/cockroachdb/cockroach/pkg/spanconfig" "github.com/cockroachdb/cockroach/pkg/sql" "github.com/cockroachdb/cockroach/pkg/sql/catalog" "github.com/cockroachdb/cockroach/pkg/sql/catalog/bootstrap" - "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkeys" "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" "github.com/cockroachdb/cockroach/pkg/sql/catalog/desctestutils" "github.com/cockroachdb/cockroach/pkg/sql/catalog/systemschema" @@ -1071,7 +1069,7 @@ func TestBackupRestoreSystemTables(t *testing.T) { // At the time this test was written, these were the only system tables that // were reasonable for a user to backup and restore into another cluster. - tables := []string{"locations", "role_members", "users", "zones", "role_id_seq"} + tables := []string{"locations", "role_members", "users", "zones"} tableSpec := "system." + strings.Join(tables, ", system.") // Take a consistent fingerprint of the original tables. @@ -1079,9 +1077,6 @@ func TestBackupRestoreSystemTables(t *testing.T) { expectedFingerprints := map[string][][]string{} err := crdb.ExecuteTx(ctx, conn, nil /* txopts */, func(tx *gosql.Tx) error { for _, table := range tables { - if table == "role_id_seq" { - continue - } rows, err := conn.Query("SHOW EXPERIMENTAL_FINGERPRINTS FROM TABLE system." + table) if err != nil { return err @@ -1107,9 +1102,6 @@ func TestBackupRestoreSystemTables(t *testing.T) { // Verify the fingerprints match. for _, table := range tables { - if table == "role_id_seq" { - continue - } a := sqlDB.QueryStr(t, "SHOW EXPERIMENTAL_FINGERPRINTS FROM TABLE system_new."+table) if e := expectedFingerprints[table]; !reflect.DeepEqual(e, a) { t.Fatalf("fingerprints between system.%[1]s and system_new.%[1]s did not match:%s\n", @@ -9555,7 +9547,6 @@ func TestExcludeDataFromBackupDoesNotHoldupGC(t *testing.T) { func TestBackupRestoreSystemUsers(t *testing.T) { defer leaktest.AfterTest(t)() defer log.Scope(t).Close(t) - skip.WithIssue(t, 78963) sqlDB, tempDir, cleanupFn := createEmptyCluster(t, singleNode) _, sqlDBRestore, cleanupEmptyCluster := backupRestoreTestSetupEmpty(t, singleNode, tempDir, InitManualReplication, base.TestClusterArgs{}) @@ -9616,18 +9607,17 @@ func TestBackupRestoreSystemUsers(t *testing.T) { defer cleanupEmptyCluster1() t.Run("restore-from-backup-with-no-system-role-members", func(t *testing.T) { sqlDBRestore1.Exec(t, "RESTORE SYSTEM USERS FROM $1", localFoo+"/3") - - sqlDBRestore1.CheckQueryResults(t, "SELECT username, \"hashedPassword\", \"isRole\" FROM system.users", [][]string{ - {"admin", "", "true"}, - {"app", "NULL", "false"}, - {"app_role", "NULL", "true"}, - {"root", "", "false"}, - {"test", "NULL", "false"}, - {"test_role", "NULL", "true"}, - }) sqlDBRestore1.CheckQueryResults(t, "SELECT \"role\", \"member\", \"isAdmin\" FROM system.role_members", [][]string{ {"admin", "root", "true"}, }) + sqlDBRestore1.CheckQueryResults(t, "SELECT username, \"hashedPassword\", \"isRole\", \"user_id\" FROM system.users", [][]string{ + {"admin", "", "true", "2"}, + {"app", "NULL", "false", "100"}, + {"app_role", "NULL", "true", "101"}, + {"root", "", "false", "1"}, + {"test", "NULL", "false", "102"}, + {"test_role", "NULL", "true", "103"}, + }) sqlDBRestore1.CheckQueryResults(t, "SHOW USERS", [][]string{ {"admin", "", "{}"}, {"app", "", "{}"}, @@ -9637,6 +9627,35 @@ func TestBackupRestoreSystemUsers(t *testing.T) { {"test_role", "", "{}"}, }) }) + _, sqlDBRestore2, cleanupEmptyCluster2 := backupRestoreTestSetupEmpty(t, singleNode, tempDir, InitManualReplication, base.TestClusterArgs{}) + defer cleanupEmptyCluster2() + t.Run("restore-from-backup-with-existing-user", func(t *testing.T) { + // Create testuser and verify that the system user ids are + // allocated properly in the restore. + sqlDBRestore2.Exec(t, "CREATE USER testuser") + sqlDBRestore2.Exec(t, "RESTORE SYSTEM USERS FROM $1", localFoo+"/3") + sqlDBRestore2.CheckQueryResults(t, "SELECT \"role\", \"member\", \"isAdmin\" FROM system.role_members", [][]string{ + {"admin", "root", "true"}, + }) + sqlDBRestore2.CheckQueryResults(t, "SELECT username, \"hashedPassword\", \"isRole\", \"user_id\" FROM system.users", [][]string{ + {"admin", "", "true", "2"}, + {"app", "NULL", "false", "101"}, + {"app_role", "NULL", "true", "102"}, + {"root", "", "false", "1"}, + {"test", "NULL", "false", "103"}, + {"test_role", "NULL", "true", "104"}, + {"testuser", "NULL", "false", "100"}, + }) + sqlDBRestore2.CheckQueryResults(t, "SHOW USERS", [][]string{ + {"admin", "", "{}"}, + {"app", "", "{}"}, + {"app_role", "", "{}"}, + {"root", "", "{admin}"}, + {"test", "", "{}"}, + {"test_role", "", "{}"}, + {"testuser", "", "{}"}, + }) + }) } // TestUserfileNormalizationIncrementalShowBackup tests to see that file @@ -10157,78 +10176,6 @@ func TestBackupNoOverwriteLatest(t *testing.T) { require.NotEqual(t, firstLatest, thirdLatest) } -// TestBackupLatestInBaseDirectory tests to see that a LATEST -// file in the base directory can be properly read when one is not found -// in metadata/latest. This can occur when an older version node creates -// the backup. -func TestBackupLatestInBaseDirectory(t *testing.T) { - defer leaktest.AfterTest(t)() - defer log.Scope(t).Close(t) - - disableUpgradeCh := make(chan struct{}) - const numAccounts = 1 - const userfile = "'userfile:///a'" - args := base.TestClusterArgs{ - ServerArgs: base.TestServerArgs{ - Knobs: base.TestingKnobs{ - Server: &server.TestingKnobs{ - BinaryVersionOverride: clusterversion.ByKey(clusterversion.BackupDoesNotOverwriteLatestAndCheckpoint - 1), - DisableAutomaticVersionUpgrade: disableUpgradeCh, - }, - }, - }, - } - - tc, sqlDB, _, cleanupFn := backupRestoreTestSetupWithParams(t, singleNode, numAccounts, InitManualReplication, args) - defer cleanupFn() - execCfg := tc.Server(0).ExecutorConfig().(sql.ExecutorConfig) - ctx := context.Background() - store, err := execCfg.DistSQLSrv.ExternalStorageFromURI(ctx, "userfile:///a", username.RootUserName()) - require.NoError(t, err) - - query := fmt.Sprintf("BACKUP INTO %s", userfile) - sqlDB.Exec(t, query) - - // Confirm that the LATEST file was written to the base directory. - r, err := store.ReadFile(ctx, backupbase.LatestFileName) - require.NoError(t, err) - r.Close(ctx) - - // Drop the system.role_seq_id so that we can perform the migration. - sqlDB.Exec(t, `INSERT INTO system.users VALUES ('node', '', false, 0)`) - sqlDB.Exec(t, `GRANT node TO root`) - sqlDB.Exec(t, `DROP SEQUENCE system.role_id_seq`) - sqlDB.Exec(t, `REVOKE node FROM root`) - - err = tc.Servers[0].DB().Del(ctx, catalogkeys.MakeDescMetadataKey(keys.SystemSQLCodec, keys.RoleIDSequenceID)) - require.NoError(t, err) - err = tc.Servers[0].DB().Del(ctx, keys.SystemSQLCodec.SequenceKey(uint32(keys.RoleIDSequenceID))) - require.NoError(t, err) - - // Close the channel so that the cluster version is upgraded. - close(disableUpgradeCh) - // Check the cluster version is bumped to newVersion. - testutils.SucceedsSoon(t, func() error { - var version string - sqlDB.QueryRow(t, "SELECT value FROM system.settings WHERE name = 'version'").Scan(&version) - var v clusterversion.ClusterVersion - if err := protoutil.Unmarshal([]byte(version), &v); err != nil { - return err - } - version = v.String() - if version != clusterversion.TestingBinaryVersion.String() { - return errors.Errorf("cluster version is still %s, should be %s", version, clusterversion.TestingBinaryVersion.String()) - } - return nil - }) - - // Take an incremental backup on the new version using the latest file - // written by the old version in the base directory. - query = fmt.Sprintf("BACKUP INTO LATEST IN %s", userfile) - sqlDB.Exec(t, query) - -} - // TestBackupRestoreTelemetryEvents tests that BACKUP and RESTORE correctly // publishes telemetry events. func TestBackupRestoreTelemetryEvents(t *testing.T) { diff --git a/pkg/ccl/backupccl/full_cluster_backup_restore_test.go b/pkg/ccl/backupccl/full_cluster_backup_restore_test.go index 4b6dd21b24bc..7d68157ce7f4 100644 --- a/pkg/ccl/backupccl/full_cluster_backup_restore_test.go +++ b/pkg/ccl/backupccl/full_cluster_backup_restore_test.go @@ -1112,3 +1112,51 @@ DROP DATABASE defaultdb; {fmt.Sprint(parentID), fmt.Sprint(parentSchemaID), name, fmt.Sprint(ID)}, }) } + +func TestFullClusterRestoreWithUserIDs(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + params := base.TestClusterArgs{ + ServerArgs: base.TestServerArgs{ + Knobs: base.TestingKnobs{ + JobsTestingKnobs: jobs.NewTestingKnobsWithShortIntervals(), + }, + }, + } + const numAccounts = 10 + _, sqlDB, tempDir, cleanupFn := backupRestoreTestSetupWithParams(t, singleNode, numAccounts, InitManualReplication, params) + _, sqlDBRestore, cleanupEmptyCluster := backupRestoreTestSetupEmpty(t, singleNode, tempDir, InitManualReplication, params) + defer cleanupFn() + defer cleanupEmptyCluster() + + sqlDB.Exec(t, `CREATE USER test1`) + sqlDB.Exec(t, `CREATE USER test2`) + sqlDB.Exec(t, `BACKUP TO $1`, localFoo) + + sqlDB.CheckQueryResults(t, `SELECT * FROM system.users ORDER BY user_id`, [][]string{ + {"root", "", "false", "1"}, + {"admin", "", "true", "2"}, + {"test1", "NULL", "false", "100"}, + {"test2", "NULL", "false", "101"}, + }) + // Ensure that the new backup succeeds. + sqlDBRestore.Exec(t, `RESTORE FROM $1`, localFoo) + + sqlDBRestore.CheckQueryResults(t, `SELECT * FROM system.users ORDER BY user_id`, [][]string{ + {"root", "", "false", "1"}, + {"admin", "", "true", "2"}, + {"test1", "NULL", "false", "100"}, + {"test2", "NULL", "false", "101"}, + }) + + sqlDBRestore.Exec(t, `CREATE USER test3`) + + sqlDBRestore.CheckQueryResults(t, `SELECT * FROM system.users ORDER BY user_id`, [][]string{ + {"root", "", "false", "1"}, + {"admin", "", "true", "2"}, + {"test1", "NULL", "false", "100"}, + {"test2", "NULL", "false", "101"}, + {"test3", "NULL", "false", "102"}, + }) +} diff --git a/pkg/ccl/backupccl/restore_job.go b/pkg/ccl/backupccl/restore_job.go index ba4deb83fabe..ecf9607b99f3 100644 --- a/pkg/ccl/backupccl/restore_job.go +++ b/pkg/ccl/backupccl/restore_job.go @@ -37,6 +37,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkeys" "github.com/cockroachdb/cockroach/pkg/sql/catalog/catpb" "github.com/cockroachdb/cockroach/pkg/sql/catalog/dbdesc" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/descidgen" "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" "github.com/cockroachdb/cockroach/pkg/sql/catalog/descs" "github.com/cockroachdb/cockroach/pkg/sql/catalog/ingesting" @@ -2400,11 +2401,25 @@ func (r *restoreResumer) restoreSystemUsers( } insertUser := `INSERT INTO system.users ("username", "hashedPassword", "isRole") VALUES ($1, $2, $3)` + if r.execCfg.Settings.Version.IsActive(ctx, clusterversion.AddSystemUserIDColumn) { + insertUser = `INSERT INTO system.users ("username", "hashedPassword", "isRole", "user_id") VALUES ($1, $2, $3, $4)` + } newUsernames := make(map[string]bool) + args := make([]interface{}, 4) for _, user := range users { newUsernames[user[0].String()] = true + args[0] = user[0] + args[1] = user[1] + args[2] = user[2] + if r.execCfg.Settings.Version.IsActive(ctx, clusterversion.AddSystemUserIDColumn) { + id, err := descidgen.GenerateUniqueRoleID(ctx, r.execCfg.DB, r.execCfg.Codec) + if err != nil { + return err + } + args[3] = id + } if _, err = executor.Exec(ctx, "insert-non-existent-users", txn, insertUser, - user[0], user[1], user[2]); err != nil { + args...); err != nil { return err } } diff --git a/pkg/ccl/backupccl/restore_old_versions_test.go b/pkg/ccl/backupccl/restore_old_versions_test.go index 2eba95834351..2baa01871024 100644 --- a/pkg/ccl/backupccl/restore_old_versions_test.go +++ b/pkg/ccl/backupccl/restore_old_versions_test.go @@ -74,6 +74,7 @@ func TestRestoreOldVersions(t *testing.T) { privilegeDirs = testdataBase + "/privileges" multiRegionDirs = testdataBase + "/multi-region" publicSchemaDirs = testdataBase + "/public-schema-remap" + systemUsersDirs = testdataBase + "/system-users-restore" ) t.Run("table-restore", func(t *testing.T) { @@ -300,6 +301,28 @@ ORDER BY object_type, object_name`, [][]string{ t.Run(dir.Name(), restoreSyntheticPublicSchemaNamespaceEntryCleanupOnFail(exportDir)) } }) + + t.Run("system-users-restore", func(t *testing.T) { + dirs, err := ioutil.ReadDir(systemUsersDirs) + require.NoError(t, err) + for _, dir := range dirs { + require.True(t, dir.IsDir()) + exportDir, err := filepath.Abs(filepath.Join(systemUsersDirs, dir.Name())) + require.NoError(t, err) + t.Run(dir.Name(), restoreSystemUsersWithoutIDs(exportDir)) + } + }) + + t.Run("full-cluster-restore-users-without-ids", func(t *testing.T) { + dirs, err := ioutil.ReadDir(systemUsersDirs) + require.NoError(t, err) + for _, dir := range dirs { + require.True(t, dir.IsDir()) + exportDir, err := filepath.Abs(filepath.Join(systemUsersDirs, dir.Name())) + require.NoError(t, err) + t.Run(dir.Name(), fullClusterRestoreUsersWithoutIDs(exportDir)) + } + }) } func restoreOldVersionTestWithInterleave(exportDir string) func(t *testing.T) { @@ -1112,3 +1135,119 @@ func restoreSyntheticPublicSchemaNamespaceEntryCleanupOnFail(exportDir string) f sqlDB.CheckQueryResults(t, `SELECT id FROM system.namespace WHERE name = 'public' AND id=29 AND "parentID"!=1`, [][]string{}) } } + +func fullClusterRestoreUsersWithoutIDs(exportDir string) func(t *testing.T) { + return func(t *testing.T) { + const numAccounts = 1000 + _, _, tmpDir, cleanupFn := backupRestoreTestSetup(t, multiNode, numAccounts, InitManualReplication) + defer cleanupFn() + + _, sqlDB, cleanup := backupRestoreTestSetupEmpty(t, singleNode, tmpDir, + InitManualReplication, base.TestClusterArgs{ + ServerArgs: base.TestServerArgs{ + Knobs: base.TestingKnobs{ + JobsTestingKnobs: jobs.NewTestingKnobsWithShortIntervals(), + }, + }}) + defer cleanup() + err := os.Symlink(exportDir, filepath.Join(tmpDir, "foo")) + require.NoError(t, err) + + sqlDB.Exec(t, fmt.Sprintf("RESTORE FROM '%s'", localFoo)) + + sqlDB.CheckQueryResults(t, `SELECT username, "hashedPassword", "isRole", user_id FROM system.users`, [][]string{ + {"admin", "", "true", "2"}, + {"root", "", "false", "1"}, + {"testrole", "NULL", "true", "100"}, + {"testuser", "NULL", "false", "101"}, + {"testuser2", "NULL", "false", "102"}, + {"testuser3", "NULL", "false", "103"}, + }) + + // Verify that the next user we create uses the next biggest ID. + sqlDB.Exec(t, "CREATE USER testuser4") + + sqlDB.CheckQueryResults(t, `SELECT username, "hashedPassword", "isRole", user_id FROM system.users`, [][]string{ + {"admin", "", "true", "2"}, + {"root", "", "false", "1"}, + {"testrole", "NULL", "true", "100"}, + {"testuser", "NULL", "false", "101"}, + {"testuser2", "NULL", "false", "102"}, + {"testuser3", "NULL", "false", "103"}, + {"testuser4", "NULL", "false", "104"}, + }) + } +} + +func restoreSystemUsersWithoutIDs(exportDir string) func(t *testing.T) { + return func(t *testing.T) { + const numAccounts = 1000 + _, _, tmpDir, cleanupFn := backupRestoreTestSetup(t, multiNode, numAccounts, InitManualReplication) + defer cleanupFn() + + _, sqlDB, cleanup := backupRestoreTestSetupEmpty(t, singleNode, tmpDir, + InitManualReplication, base.TestClusterArgs{ + ServerArgs: base.TestServerArgs{ + Knobs: base.TestingKnobs{ + JobsTestingKnobs: jobs.NewTestingKnobsWithShortIntervals(), + }, + }}) + defer cleanup() + err := os.Symlink(exportDir, filepath.Join(tmpDir, "foo")) + require.NoError(t, err) + + sqlDB.Exec(t, fmt.Sprintf("RESTORE SYSTEM USERS FROM '%s'", localFoo)) + + sqlDB.CheckQueryResults(t, `SELECT username, "hashedPassword", "isRole", user_id FROM system.users`, [][]string{ + {"admin", "", "true", "2"}, + {"root", "", "false", "1"}, + {"testrole", "NULL", "true", "100"}, + {"testuser", "NULL", "false", "101"}, + {"testuser2", "NULL", "false", "102"}, + {"testuser3", "NULL", "false", "103"}, + }) + + // Verify that the next user we create uses the next biggest ID. + sqlDB.Exec(t, "CREATE USER testuser4") + + sqlDB.CheckQueryResults(t, `SELECT username, "hashedPassword", "isRole", user_id FROM system.users`, [][]string{ + {"admin", "", "true", "2"}, + {"root", "", "false", "1"}, + {"testrole", "NULL", "true", "100"}, + {"testuser", "NULL", "false", "101"}, + {"testuser2", "NULL", "false", "102"}, + {"testuser3", "NULL", "false", "103"}, + {"testuser4", "NULL", "false", "104"}, + }) + + // Drop some users and try restoring again. + sqlDB.Exec(t, "DROP ROLE testrole") + sqlDB.Exec(t, "DROP ROLE testuser2") + sqlDB.Exec(t, "DROP ROLE testuser3") + sqlDB.Exec(t, "DROP ROLE testuser4") + + sqlDB.Exec(t, fmt.Sprintf("RESTORE SYSTEM USERS FROM '%s'", localFoo)) + + // testrole, testuser2, testuser3 should be reassigned higher ids. + sqlDB.CheckQueryResults(t, `SELECT username, "hashedPassword", "isRole", user_id FROM system.users`, [][]string{ + {"admin", "", "true", "2"}, + {"root", "", "false", "1"}, + {"testrole", "NULL", "true", "105"}, + {"testuser", "NULL", "false", "101"}, + {"testuser2", "NULL", "false", "106"}, + {"testuser3", "NULL", "false", "107"}, + }) + + // Verify that the next user we create uses the next biggest ID. + sqlDB.Exec(t, "CREATE USER testuser4") + sqlDB.CheckQueryResults(t, `SELECT username, "hashedPassword", "isRole", user_id FROM system.users`, [][]string{ + {"admin", "", "true", "2"}, + {"root", "", "false", "1"}, + {"testrole", "NULL", "true", "105"}, + {"testuser", "NULL", "false", "101"}, + {"testuser2", "NULL", "false", "106"}, + {"testuser3", "NULL", "false", "107"}, + {"testuser4", "NULL", "false", "108"}, + }) + } +} diff --git a/pkg/ccl/backupccl/system_schema.go b/pkg/ccl/backupccl/system_schema.go index a8f6e0b0a110..24686d6db2d2 100644 --- a/pkg/ccl/backupccl/system_schema.go +++ b/pkg/ccl/backupccl/system_schema.go @@ -14,14 +14,18 @@ import ( "math" "sort" + "github.com/cockroachdb/cockroach/pkg/clusterversion" "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/keys" "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/sql" "github.com/cockroachdb/cockroach/pkg/sql/catalog" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/descidgen" descpb "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" "github.com/cockroachdb/cockroach/pkg/sql/catalog/descs" "github.com/cockroachdb/cockroach/pkg/sql/catalog/systemschema" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" + "github.com/cockroachdb/cockroach/pkg/sql/sessiondata" "github.com/cockroachdb/cockroach/pkg/util/log" "github.com/cockroachdb/errors" ) @@ -83,6 +87,10 @@ type systemBackupConfiguration struct { expectMissingInSystemTenant bool } +// roleIDSequenceRestoreOrder is set to 1 since it must be after system.users +// which has the default 0. +const roleIDSequenceRestoreOrder = 1 + // defaultSystemTableRestoreFunc is how system table data is restored. This can // be overwritten with the system table's // systemBackupConfiguration.customRestoreFunc. @@ -110,6 +118,7 @@ func defaultSystemTableRestoreFunc( if _, err := executor.Exec(ctx, opName, txn, restoreQuery); err != nil { return errors.Wrapf(err, "inserting data to system.%s", systemTableName) } + return nil } @@ -152,6 +161,84 @@ func queryTableRowCount( return int64(*count), nil } +func usersRestoreFunc( + ctx context.Context, + execCfg *sql.ExecutorConfig, + txn *kv.Txn, + systemTableName, tempTableName string, +) error { + if !execCfg.Settings.Version.IsActive(ctx, clusterversion.AddSystemUserIDColumn) { + return defaultSystemTableRestoreFunc( + ctx, execCfg, txn, systemTableName, tempTableName, + ) + } + + executor := execCfg.InternalExecutor + hasIDColumnQuery := fmt.Sprintf( + `SELECT EXISTS (SELECT 1 FROM [SHOW COLUMNS FROM %s] WHERE column_name = 'user_id')`, tempTableName) + row, err := executor.QueryRow(ctx, "has-id-column", txn, hasIDColumnQuery) + if err != nil { + return err + } + hasIDColumn := tree.MustBeDBool(row[0]) + if hasIDColumn { + return defaultSystemTableRestoreFunc( + ctx, execCfg, txn, systemTableName, tempTableName, + ) + } + + deleteQuery := fmt.Sprintf("DELETE FROM system.%s WHERE true", systemTableName) + opName := systemTableName + "-data-deletion" + log.Eventf(ctx, "clearing data from system table %s with query %q", + systemTableName, deleteQuery) + + _, err = executor.Exec(ctx, opName, txn, deleteQuery) + if err != nil { + return errors.Wrapf(err, "deleting data from system.%s", systemTableName) + } + + it, err := executor.QueryIteratorEx(ctx, "query-system-users-in-backup", + txn, sessiondata.NodeUserSessionDataOverride, + fmt.Sprintf(`SELECT * FROM %s`, tempTableName)) + if err != nil { + return err + } + + for { + ok, err := it.Next(ctx) + if err != nil { + return err + } + if !ok { + break + } + + username := tree.MustBeDString(it.Cur()[0]) + password := it.Cur()[1] + isRole := tree.MustBeDBool(it.Cur()[2]) + + var id int64 + if username == "root" { + id = 1 + } else if username == "admin" { + id = 2 + } else { + id, err = descidgen.GenerateUniqueRoleID(ctx, execCfg.DB, execCfg.Codec) + if err != nil { + return err + } + } + + restoreQuery := fmt.Sprintf("INSERT INTO system.%s VALUES ($1, $2, $3, $4)", + systemTableName) + opName = systemTableName + "-data-insert" + if _, err := executor.Exec(ctx, opName, txn, restoreQuery, username, password, isRole, id); err != nil { + return errors.Wrapf(err, "inserting data to system.%s", systemTableName) + } + } + return nil +} + // When restoring the settings table, we want to make sure to not override the // version. func settingsRestoreFunc( @@ -181,6 +268,28 @@ func settingsRestoreFunc( return nil } +func roleIDSeqRestoreFunc( + ctx context.Context, + execCfg *sql.ExecutorConfig, + txn *kv.Txn, + systemTableName, tempTableName string, +) error { + if execCfg.Settings.Version.IsActive(ctx, clusterversion.AddSystemUserIDColumn) { + datums, err := execCfg.InternalExecutor.QueryRowEx( + ctx, "role-id-seq-custom-restore", txn, + sessiondata.NodeUserSessionDataOverride, + `SELECT max(user_id) FROM system.users`, + ) + if err != nil { + return err + } + max := tree.MustBeDOid(datums[0]) + return execCfg.DB.Put(ctx, execCfg.Codec.SequenceKey(keys.RoleIDSequenceID), max.Oid+1) + } + // Nothing to be done since no user ids have been assigned. + return nil +} + // systemTableBackupConfiguration is a map from every systemTable present in the // cluster to a configuration struct which specifies how it should be treated by // backup. Every system table should have a specification defined here, enforced @@ -188,6 +297,7 @@ func settingsRestoreFunc( var systemTableBackupConfiguration = map[string]systemBackupConfiguration{ systemschema.UsersTable.GetName(): { shouldIncludeInClusterBackup: optInToClusterBackup, // No desc ID columns. + customRestoreFunc: usersRestoreFunc, }, systemschema.ZonesTable.GetName(): { shouldIncludeInClusterBackup: optInToClusterBackup, // ID in "id". @@ -351,7 +461,9 @@ var systemTableBackupConfiguration = map[string]systemBackupConfiguration{ shouldIncludeInClusterBackup: optInToClusterBackup, // No desc ID columns. }, systemschema.RoleIDSequence.GetName(): { - shouldIncludeInClusterBackup: optOutOfClusterBackup, + shouldIncludeInClusterBackup: optInToClusterBackup, + customRestoreFunc: roleIDSeqRestoreFunc, + restoreInOrder: roleIDSequenceRestoreOrder, }, } diff --git a/pkg/ccl/backupccl/testdata/backup-restore/feature-flags b/pkg/ccl/backupccl/testdata/backup-restore/feature-flags index 8780ff8473ed..bc2e34597508 100644 --- a/pkg/ccl/backupccl/testdata/backup-restore/feature-flags +++ b/pkg/ccl/backupccl/testdata/backup-restore/feature-flags @@ -81,4 +81,9 @@ RESTORE TABLE d.t FROM 'nodelocal://1/deprecated'; ---- NOTICE: The `RESTORE FROM ` syntax will be removed in a future release, please switch over to using `RESTORE FROM IN ` to restore a particular backup from a collection: https://www.cockroachlabs.com/docs/stable/restore.html#view-the-backup-subdirectories +exec-sql +RESTORE SYSTEM USERS FROM 'nodelocal://1/deprecated'; +---- +NOTICE: The `RESTORE FROM ` syntax will be removed in a future release, please switch over to using `RESTORE FROM IN ` to restore a particular backup from a collection: https://www.cockroachlabs.com/docs/stable/restore.html#view-the-backup-subdirectories + subtest end diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP-LOCK-778749314546466817 b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP-LOCK-778749314546466817 new file mode 100644 index 000000000000..19104f172a34 --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP-LOCK-778749314546466817 @@ -0,0 +1 @@ +lock \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP-STATISTICS b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP-STATISTICS new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP_MANIFEST b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/BACKUP_MANIFEST new file mode 100644 index 0000000000000000000000000000000000000000..446274ecf5c852b8645f36cd2d4e2c6169ba6259 GIT binary patch literal 2833 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 J%S%7s_y@YmYl8p) literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/data/778749316187160577.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/data/778749316187160577.sst new file mode 100644 index 0000000000000000000000000000000000000000..ec3ac90009aef8560b083081370ee048562249e4 GIT binary patch literal 1851 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 B;-vrp literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/fileinfo.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/fileinfo.sst new file mode 100644 index 0000000000000000000000000000000000000000..8b761e3f1c5065823b4a383b3472319e70855af1 GIT binary patch literal 1149 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 JYe*=OA-^l;~ literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe new file mode 100644 index 0000000000000000000000000000000000000000..49b1e216643ae79245098223dbe89df3915085ab GIT binary patch literal 2721 zcmV;S3SRXeiwFP!00000|HN8fjNHT-pBdY`-nqM+vk+q3Qj8_Y#@t=Jdw;X4s>`LQ z3ICK{j!HeLa=h!gi(${+*j{pn)aoix!I6L}9v~`01d6I6mHtT)Isy;04;AVYFO{l- zR8*;=;-LkkO7K?s@7mto?A~2c@)F;8X1?F|`+f7xH{->ih}n;R{pE*$c;SQ1g90m{ zi(3-9_>}kb^p=F4_Me{FlF&2$({o!Add`1(eoI2nKkYrexFw+%{kE63B=pin@9FZE zgf9DSuWd=_HUH`LEeXAT!FzgROG0n>ZCAG>boD8zf@3Siuj!hr9hse-o1Hp3S)Ng5 z$`wVKoSU9-9Jj)-Z$OT!f(0PoQ#_7y&W7WXH4X}Q;t|Yf`kG;Kn;gH%;bBbMmgNS2 z6=~Db36CVqzW3RmF1&K_gUy2_I1lax@)Iwx!7uRvVX&Y;ry}>~qN-<11gFp@^S3G|? zZ+ZcUpac{!2j;;tXrdt*I5YgSm_+A}XOP@auTk z>prQ*oP`dGREgS#^dBMk7X+U}+Qa_^1e*vvi@?uNLe(n>Y$Nb4y6rs#K0;uV0#8y% z{sQ6uBFsEynZ)6ljz~C!k)iuB0J(Wzp_{wMz}+}kx6Bn|bpY*8P>W~MIwC`t!|}Zp zyWx7>l++6udZ1KDeMOD^3z2%tY(r|-)W1pN-_w|Ni0c~Ws>A0x*guTvLD!&+nMbuo zi}>{S>HBRw)X*IFp{B06MCT}Bgk{1Je`EaxxZkwSmkw8})uodU+;e*A*aN3JXPLkS z-{R6nlW=s#Y8TO&#UG|c_kEKC*m4q)+@APa>$geY@QC<6zRS~IQ9Y=tk4jAdRoesr z!FNXp+!2!Q2yJ&nC?b&(=@Qt6aMywJcM5+bU2hHM`X-@;3LZ&}GITDVVX@1YY0T9dnz5!j z#BmJE^oFth0nXt4!7#&gT+OT#Z(O0jxpB;ztu@tdnGT2hcb~wl7kFNOZYZl$moz-Q z_%ZCV`37+zN0Q5ta&jz+oaI|iQz>__BzF=Z$G*ui>}%)vCezF{^G&u{XyWG3juOK1 z20rL5AvJJLjo=#kI)`{5g-%P6(+X0kIXDlx!%3U=(noL8VEJW;@A7SDNK;ds`A{ex zNLg;B47VXvC8y+jBg~da{V=|TaM8zTw@jZS$HznSKhY9XRph!&%e4HF?9CQ*4I z=EQukjkQxM6yj%*DKS^z{h0C9;*ijxw$Lf05UVW2%8RU65V1Jql{34qga1n7ztFhQ zugH<;bJQ9ug-k^1{pGsZBZRy0{@+fYUFDl^Ft0Ud} zAMrq&tHA)e|9}(B;)P7^O}Zte5z8?cxot*)3hKF#{vQ?bIa~>XI00Nu;Z`HqYMUG& zBpnsfjta4(Lfg^nQz^g7;FlRZY+DVYu93AGu^s+kw_}#qW00`A8|Q*~28pLJoHv|f zKDixt90L^0J}4=)Cr49VI|6pLKc2-0lGLdFAJOjUn^)i*x*pqM10PIT3jU9`ztBkq z&Go1Sc4X}gz4N%fJ$VrDT^B-7UL<Ketujx*e3XC&mBty;sVb0QD=#>H4FF8n>W4POZ12gxcCBvWderN}jrF45bN z*>#Y-L*cimFqc`)V5hueuUEHs<6JP;Ao(o5F`)Y2_Rx#xdR)~?p~dhn;5z2B-Rx&$ zUGHdx5My-i5A>z>vK75uz}p49 j!daFTn)j!jK&`Q_B;Ugh>|q6y&hZE zKN$|UeMcj-@JDQDyaCOI_M?=rwkyEi;6e**E*;6@;JBm1>1 z@q9cdLLhQ`FV9OalTq4xS*32t<`Y#8m9{i9*RgnJi;UK ziD8rD0mdOCh(|^L$^VJP`xk%l^Iru&v8e8g1{7(QaGpY78F4^9Eq#~Oi{U$-NabF3 z9;Y*Qf?hn56NZ%Fw;U@)9kWf#aaV2Pa4Wk4fBEeT|Lz8UH3NPn2EV#H@Ufu)d^J}D z0$2d^@LulA*Wdiz_%|0`eBp_AejuE{k1YQN;=-y`o+!^wl*`5Zqm{};d16wysiIUW zN0iwk<+50ws+MP~Q`1tZQrBjurl*v8y*#5#uB^6H6Kh&|2zVZ|V&q5Al{{0rhtMC9z7xyn5 zJAU6or^Zh&9a}nidg@6JRfe8K=00960{#TLBrzHRY>qTj> literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM new file mode 100644 index 000000000000..9ffafb9bdf9e --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c6c9c9cbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM @@ -0,0 +1 @@ +œ‹ì \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe new file mode 100644 index 0000000000000000000000000000000000000000..f46f9785f2c20ae4d7b64287790bc8b8b1166caa GIT binary patch literal 2681 zcmV-<3WoI`iwFP!00000|HN8tY#hb;pPAjg+Z)^Q<{)HQ{rR)31i37>vv+=pV^x*o z6gA;ZsbebDQnlH;9Xku>-OKJCv5{K25*3&PRPh0#B1E95DpKi7ijWC>p#4yxe&S1| zsvs3rs;KzT0#YUTR_*KU%U$klhmtQ@&(6&Adw#!Xo_S{WFeqd8qhEdb;qPDgVDq5B z3h2_7gf2bhJw3f8p{M<)XSO8tjQ{l9mV}=3pPt{6(DP4wPcLps=taNnr7a1)bjf?V zvL&G_e%otX5_-*ldVNbmuV3_@-q@1R8-ClhEeTzFO1`Ij0vDVO$0chV6z;?$n9=k# z!{jzOev`w)n6@p;4gMrb@0f?Xi6fg_s!7^x}7WEj-0x_KZCy>4j;VZDff->O2FCe%I z!8Hiph2T91-iPokdN{%MrxgDw6|?RC6|ubu;ggWM>`icM2P_a`s3NR@t8fh8yrQkC zH8sav#uE`$&{g<NQ>_KCI_(PBqF&p@%7eki~hNV+3*+!3LOL`tM9U>m|+2hQIp{2_%=+u--*LZ*VL zN65yGBc@NXuJ((VZn@e@%kAOnruNsGqHj(vc@JT*<^?C;}b@+Tws;}J|hY}FlpG^g>=?nznR*EWswZKB%N1w*eK?wX_>S99CWAX#D_7aKO& zONJQ3#g?|wv^3q%56KwoVs9L?E!$ePiQ{lg|B#%*qai%CzM;C_8Z7ipLJKuKk{D&^ zTrtC9mod|rYcw@uO?8Ol7?$Y`WBUV~!TW<@hUvJP*&yDyQh#&fm^IsLs@*mn4)^aq zfmtu`y#Cx!R;Mm$czE$+*k$t#;zEujmm}rmSQI(Sx16R@&aout36Nvo+bXqiYiLIaVR-`|^p=nsIHyK%4Sk(MJdi@CrO0UoDby^S2i@VMO?&C1w`s8a zGQ@ZJwlk!uDb9Q-6c3~Ds^_Lz9cCXW)^ z&9=6Psps0XwnN5ka=uL*m*}Z?4G(&=+snf-cW0TM?==>_Jt!s&JsXixn)J&~A*5P} zs1~BdC}hJ#NQX&OUWf&;7;IymlnRCTS!62ARd_#Ue6=_v?Yh^Q>fd<`7ekb}BY)R? z_rpv``?XC6pA?#wqglP^R;cR~3p>tmlle#}wA%Hi(cnZL^o@(LR9yIbZU?>)!Vi*F zB1opx4oi`1B3+@kA+zfsd56MpQDH8#TER|v$6l{)@5Y5-u0iryd}BcMzwMzH&-b{h zl|qZ*UBC^@XS>SVO=nZJwRsgN-dMD2d7phYp}~H zce2BrUpohf{l1?VIz*85mhB(*`&~{VoH%wELBZ z<&Pmg7TgHLZe+ifMLwt<7u1k2AauM>e?d!mFC@GdLhs|tEmJRfA-7ZCl+)2q5)-^C7h=aSVkO> z&q&{4^>X-*CsMVSoyX~nouC(ww1s#sMflnF(w4eOeH!7xQ_O`n;XqfVT-f1zlTCea*n z@2Iu1Vl)h`IbJtR&E8l%us%DZ&P7)$g9li;yno^NiTfTpJ$`2C_|mB}OQ%kp@!FXl?S&rg`+BsG_GmxQqy1oycD_gZ n9X;Cb?9o2fqrKLp{ZEi(Z{Z*hMDX7L00960<97oTZY2N!DJD{) literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM new file mode 100644 index 000000000000..cc7de46ef007 --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/2022/07/13-152350.46/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5cacfd1c8c6c7cdcdcbdfd4cfcfcfcfdfaaabbcfffe-CHECKSUM @@ -0,0 +1 @@ +ƾÂ: \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP-LOCK-782466617872318465 b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP-LOCK-782466617872318465 new file mode 100644 index 000000000000..19104f172a34 --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP-LOCK-782466617872318465 @@ -0,0 +1 @@ +lock \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP-STATISTICS b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP-STATISTICS new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP_MANIFEST b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP_MANIFEST new file mode 100644 index 0000000000000000000000000000000000000000..d0098cbf4b66723c24022f7ba09f5e8ff5a28e52 GIT binary patch literal 2891 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 literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP_MANIFEST-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP_MANIFEST-CHECKSUM new file mode 100644 index 000000000000..724758f736b6 --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/BACKUP_MANIFEST-CHECKSUM @@ -0,0 +1 @@ +y<µã \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466619668725761.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466619668725761.sst new file mode 100644 index 0000000000000000000000000000000000000000..c30b1142c49ee24a9f5b32d3ec6c15a3a8f07c70 GIT binary patch literal 1120 zcmaJ=+iO%u7@t|Q?m3%dqDeN&HtJfWh;)Y}Ceauo@h;Ve5K|#|InJK*WpnDBIj1wT z+1=#HLLlDo0zQd%D?$r`7DN#A!IwfIFZ}~T(U-pTrA6?ecIIrNeQCd^`R?EM`+f5~ z^#~O|yLqlnKsksw!fj9yQ4GZ@NY#VzJX(v{;=;kl^EO5(ow{>+Q|H5MzukBK>CUgO zxFaZM_nljHb?ENP9mpwkRbtnLUQuJG=VEIC9SZwfUQLf5+Sx<->p6 zv->+*Z~joY)`odg6;5gQz})A@boPzgcV@Rd!Gj|g@Q;V527ca&jOc+8-qHL0I+R^; z3$6Lk5VUCQi4#2-xi*2CEl>C*q9h4v?c=s7E8xot+T0`}?~K$@C8i&wL?!q{(Gmj^ za35+!)nhPa^Q&0>P@*`v}|)SD+NfY$vVnu9M{_|*NtMOby?N3L{+yGC^=m0=^H9A zm6;MS!2+o1 zL{tz0vh0*k6(us5fw$Oh#=t;nT=bd}SsN^yMK#-M}c9S-J;}hM=CVPB;x=sYQ0pe$!jki9Q7e z#x0MJYjF2O74DCh*r@)DdzW1YlKlFY`x2nXO!xl?IcYg5L959e283U+lT9^HFzSU* zUtsH-J(p11$NP@W=NC#Z_+9GnwBaWSef`w~z;o87w|Jeg{l6F<-!1$(_iXoX^Zx)f Cxnjov literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466619788066817.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466619788066817.sst new file mode 100644 index 0000000000000000000000000000000000000000..c377a503da0096336cc0462713301b0cf9079817 GIT binary patch literal 1139 zcmaizPi$007{F(`#eMs_l+wal3(8`k7u}%+(m!c>K+qUZ2Dk}%nfK<~?Sy$VkD1wa zwTRmW$!^``=`TqXCZ^-P@ z-8+++>N*dWImj${LT{6osrq^Q%g>i;lnl;$=N{gQXHR6yygetsP*yXGgv5!t@^@*k{i_`js|lS~+@b9juc^5B<`Qzxn#zy&~lot2g4=cruC_6Lgw1 z$-w*R)?dF>8Z-}`l>K~YzI{UC$~|)M`QVW4QeS?yuiSq?#-hxMlzGQ;-rIvQ5=o6h znUtIuwI;jf&?;5NQVZxY-!CBKoSC47g|_Umwp7R&+n<}6q8n=lO|L=! zU+QRLUuIM{*R0KRsrpQcP+>KW4&?>6+#8!=GHZCYmSkpESFgTg!38dtG%t$&RFov9 z@F=?tti^03sq}8OHGg)csbC${>Y3Av3yUjF=P@R9`m1v*P3$xgGV@8=_uztN(|M5u zHCjpikA672U{b473p`|EUgkie+KAwuGbcA;ht|d@DDcPy+jJy)ErK2b&|D?X`2=wQ z>nM{38Ln#+XoWLV9Uabj1f^(<4#1UBNjy$_gNRIl?)WuQ+fR+nxo5k}5gn$35d^x@ zv981I#(y$CN<(F@jyLE!S6!TxV*(Tw3_3Fc_c0o$IoJ*`Q-I}KI5JhKB6i(Xs_-^C zKy^1~Wsl|D9j#X>Xm2IBO8o#upANJzCY1OIIv6Fu`Et?&Mu)4zeLxzPXBeGnp2ILj zeDLj%+xHo+f`V}EKDdl<-!fe-E~n~!Yl`!`SMQYm{WmX^pf85(|6y`9!ddZ+vW@^@ zvmOs21gQwz2M^$<<|#6{x7`J1!)ma-Pe%USw`aBWGZM@kLS|6{3>FQM=GuEH7p`~py(_f) z;A-NqFf}aM2R0KNBOxki{4o53Ga8p*6b<{Jk;Ir7{IJA7(Jf1+(Ju${-cZY?Vq0N3PA3cdTd zAh!0rzYwAXPM8T)&BM8HFNoVmZEp_GgD9L^XbJVg!#4ot!j$u;!&k@f*I)2nE!b?@ zsm(mK34GP`&ME4%q~|(#-&1QlIH?o7K=W7#cY^rMrRYz?^s5c7Jb$DUV1cUgcybe$T=u(cK8Zyb|6- z;$8N(=ZfEIzpsAHo`e2Zkbm;qPfl{~+UoPQ1EdjxbB#C7a_(xrrK`-=nnj0==E=V} zS_3FH0QvwL`*pS+T-*gHzFk-_Z)XI=UcY_bunuk^MwF;znNmVd@8hj}4NjY&>boNa zHFjde#!SkJYV=2n$|hDMOO9$-QgsEVB`cG}%wwe&B?%r;)6$5lS(vDLys5GjO^i~# zr7@iO7c6-Bn4zT-x-=puR4pT^3d_*p5`2lIOk~R-F&c~*a%?mbGj=i2v4>#OR1N)@ zE+>Y6EqiNA`(?Cv%RtTfwrKA$FbJl5<1j+s4YmFE?YRBX>V!^(n=$W z8nYtN44npsoG>jV!eGi$^?z`zvnmxvaf*mwnMIN;HGx5J+7#K6B~v|t7wt|r!Wy=y zF0@P&g#7|eQvq~Yikj;t{G9b$Is{nQ;V%ihkYCqRuAi!;6?@E@?ODJgwh3% zl7{uTH407-GDt$Uq#Yv=%21&NOkLHK*gUfopvaC`W>rPyXk6A(v{R;}V2vh>^_Zbx z1%x7$z$A_(BZ-NuD<+h34l28z(zK*SguO^lC8T_f`M#S-bReu-M8#%M+>5A995+&* zI4?g?14C2j?aFt$pi!A)XC9~;M2=DKk}fCkP6$_VCyQ-mBsvNjX2<5x02TL$keir>dC{GKbjmQ)EJeUZt38KqZP=RgNnAC+U@R{$+5R}}R q?<9>!^PvS^v2XKtSZ9tM>_%&@>P5SsVgJ9F^IID?PrdudR_<>`W4d<$ literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466620157657089.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/data/782466620157657089.sst new file mode 100644 index 0000000000000000000000000000000000000000..1ab4086ff803061a8b2367cc10f3d52b9d6a208c GIT binary patch literal 9239 zcmaKSd0bOR_xH?Q!o8QtV#)wrbtcU-6yTr|Ip=)m zoLjpV+CdCGe~!#*uXMTroDJGQSMz>XO%@9Q3lpwSZ&=20a(eEZ{AeJWm&kdNlS}6H zjs}K-Q!<7?f>hH!k0(%E0^~1TYo>GTP<)j-rrmimbk)5fW|JNQGL8;7`~jcG<)BMb z>A+-u*tr7$04R+-qUuam@8YB?y1t(X488iss2~xhrh|TmPns`G>ik*CNkyx?Y{Caa zIVn3E&^gf{;m8P24+z3Fv{Cvds`=^f&8De9p3(UIJdTf?nlFL`_txtdaR(*cQQ8Ad zyg9N`Jz35+y?7J1Pc}t^o+q#UPzC{r^}IjlZ|=;tb6fh*Jyg(TTcUltNpbwaq#p0I z(p*xQFX(nV-4&|mGoS51ji)y*g37^MJD;P><1TZ$aEs{oTHPYPEq7J~eb#`}>nEuD9uP)3w>fH?y$1(M@wr<}0?$v2+ zK)d!aXU%>U9hlPb^tLUErUT{ccP!-6d%C3S!5oq_sM^@KgWBo&yv;3mVU_?ZhRq{$N>|!(n&WRr43dDIW~^pO5#G z%Bd5%oLqB{K0^kGh5ZKi7u%;94Mt;{p;KCVM_qcRv16t|pJ8f`8^!h^@?D-Xt1Blh zEj_K=<7qFWLVHAY{nX+Y?_rjR7d|*jvx|(8kfJ4ggrbcqE-}?;ca&EY2RI<(nC6C- zpN_A(Qrkw8l-nN^PXv8)gortFH>MuXYn-uWLx}>Uh37`*<^WXEMy4q43aFLD_)j4a z<30s2#{k7MYi?Lc;k);a(%%k{0#Ms+3tWGzaaH}MO@|_iF}vHxZI?sWPjP>LHGCr4 zW&QG_xb2;%?XGvNGWA<<;BM)38byvs+@9z+)c$m?k&>upKv(0V+69x4#CfVda~pbL zKHJy04T2qU+qOJ7cy5nGS;58iEbc!*>}eis&NUCp6ASajykUid1`iT3Vb-84V7JLq z7N!2Ye&)1gAs*EII-h0@cz4)X(Vj*0hK}NC-xE58X%&dBQcaH~g&9}afjULPpVxo- z{m~C|E{(EfD}?KRzc|vY{*HN1QD{>@&;YNcF4}!z6_lu^!%F61(NUo}5k-3yJy7|| z5AGQiknSYb?)~gEp)BXbQUw&f9)F<1=kUu?Wp;_UZ!&}@nvl*h?I#U?p4 zt_0DrSEp}DVbfeZ1G%_)>9u(aUY%Q$*+niiYs!x^igPGwWVmv?946PEy7HI`Yjd{O zk)B1#=tj!3W9nS=^LwA%H%7s{y+(3BGViRRWL8N+}W|aOuXS0+$|Kw!x(rmnvM2!(|*UeYi}-r5~56xD4RZh|3_2 zwn!MejKGOu95RY=2zFdwj%&(sO$Dy05Xy0l6W2J`yiLjDfp#Xv{i-+kRbxbFGLZvv zbsTe}+k>udYo$Yg8pMPNKm`n7fO-^`aswC*yr2ryLNFVGSw>Fc^cQ2rDUi4cNOeGfHkFnxx4Qg}+zimOfGV!y!n{6b zrPWuB)d`GOY^JolX&L}p=}5T&b_cx$Xc?x#Gf2jB$O7F#3GfnLvW8-SDE+E_5u}zw zxE@LvAj8w$0>N$w4nc4Xf|C$5K{$#SW8lI$S~ir;5C|2)Ax`2A+FZ^uc$nch&M^aO zC>c#BiYlTO!r72q4*LSN`TzwqihWrkOvZ0a<>ckoN{i8A`V26b&Ybf=6p3VFH;m>G zOrttlGP_Ct=q!@S)l00E8> zF((PoOn_Pv%q9u#Q-Y&wJZ^_yHMWS6x913_T`&_26uRdTKpt10y8M`iPIUn1O9EA3w12wNLqLjwd+>UsfaaBa#KT{UI2DDFx>j$6(gfaJ|;n6a1Q z7{4PBz(&BYa_Qb?QaEZ&Eg7xl=X!CIa z?}*Dx+|>eYq}wwgIVC42XK-N=mJf5$fcyuL(Q_>AQw^^6Is{5%il_4bBvAofJSlrn z+#~uYpk?<1t$qn!U-j^EL?AEerCJ4|K_HmnT$0sK87y&2fQ5bmEM4+hSt7#AKwkzL z7AO5>05s~$1`&#cNQzW4H~`_zPDJ!ok|TmnRb^4SDw!k4I;sV0Lk&e34Fq6xttFdj zkUrT!kSPe`@-1$tH% z!(?y~(zSxcR&5DPok~eGlc!QB*T_j@Ome&_!ZgTuUXuSY)jc{^@{-@B{mEzxKZ>&TzI&4$4$UsCfV~tRFzfAaU9U-o&(Lm4}oUfa-ivI zB!I?bBx2uUkSGzu_>qXxaKWz`taTMg6zODoH|)#NGq;CSO>PSWn*1Md7W^WVqD4kz zMNSOoPcgTMaCCv+!Q~88_gQwCVep=bG=iaPWZ@eNg@7{< zwDa@$R4GFW5h@uL>EozYpu`|$aY;`Ai{dzg^^g8B7Fg3`VD860 z#*+JZ;MeBiw-Un9dYVK009Ase(ot!1`1~qw(Fl;jH%0*0lIsG4RUF%OVOLg;CB^AC z^ApwimxSEDM1F^GK*61O|9F8mvd?%xn0nAPCk0e8no~e~dL-5x(!VtH6g) zGzLtrz-E?fLyt`90{mEkxsJb-{z@5$<3IM>5V_k8s8Q6z6*Op<)Rx66AW;G|(t7jk zb%jhUCpACkCq$-SPhZ=5J3M0v)|q9V%1Vbj;8%?szD{^aI)H@bPc)A=XaL?#(+m`U?=RuE*3&#MBHm z|3n$csn>=Eh}Jt1`|d>WhmmHKJf!`OVAkOzJz|ccL~^8p%CKa=5qU|46(Ds0(l@U~ zP>09`hbWKtwi5V?)Q46pUb8SaPc!}~OwtHuwLTT}9*7vKc%11jjK3(ygZea&BjRqx zHTV04Y@MapH%no>1{J&TFuP)#BV?;1`96wU6C@c2S&sLYVJjbWIqVkR6;7%Ax}!{Y zE<93WotAr@oOLE5w8<2?{9@U{A2BX4osR&l=1C+~&+@-8lr}2&Q4}?}BzLF893yxp zxE;Q^48;#&8MmWKxrS$Gjnp&_@e?DUT zJ_6?or^@aKSe-8a!t)Wycwk4BqbwNk_>=*GKNq1N3wl@348|sG2H#m=tiB56#R&Zm z0K*Yf5MF$ztBzANGT2(0UcjXN5h*LNY6}8wPJbAa9jC>bjmApN)Qs&@&S9`=M}%o# z*yM!_Q^uiz$uc#=uZ>WAK^f@Qwv4hZ1IUMM877OP6Q}W?b2Li@UDiVwHf#o(92b;h zJ4K6<EN3lL_E%D3m~x?%?-&k< zo7Ix!2PCJ&#@A}I`uRa}#^tcYf1m<^1)qncToJE{(*U%f7-*&r%&5ug4wU0AGi*}`T@q_z&eV`yv00o~yMI1JYG!XR05 zxE)eC;?qqR+5u_&g?7vgN;ULiJ4y@qg^}{!0Cy@^6oQI7g+Q1F-{RQ#8wp6TYYe4J z0aYvHECsTl7_B1W0Y=VzpPz)9 zdx_sC^-e**>7?)5$`ZOaF2u+AV^=mkAtb8r2ya$(tUUq6j%;%*ep7-#f4Vc9)0>jP zKG-Rt{_ZcgNaeH)F3D7tIHJsFw^;&?O0UIVjm=l3*uy-ihq-5-ZYJ~a)OuOp1SB3h zyq#tcsbMuT%%m|e z9MtfNc)2iEbY>Cj^OHLHeUd^w}r*I>MQZ^^#I-vsgW#dqh(@{+nffP=TeZBT}oal(TKjTaVwfZ;m6 z3mAC-+@Z`9%Dkb>7s~vh%oWOlp{z2LjR|FA)jXwgPCiCbQ|8E`^rqoZ+%sT?nG`l3 zTarj5{wT!DCRm;P0(Ih`0G`p{!F{*DRi`fe)o|yVGf~rEZ+vDOClELf&=TOr$%B&@ zCm&9JoLo2sajL{=3@s7H3WNyXYm06qWDZT*tVN2!pZ#FV!Y2*uFBy%qT9-jeGaX)O z{`&gzybSDfsd-$rbor1B^jT`ZbYlhqmh<@UU{GuSr$vj?`)0~3SE zTj1eGdsaM|I^%LzYd?_0f6^f|_`MZBj>0GLg|`y+#3_qM>%dBQRczjSV-lm83s37K zp>awY`r+@PNAbCzspQ%hD9QisG$5w-7T`g6Pp(S!XjCh=c&U``u0>*CSG zXE}3MG@`b1M$yJt2-e396&BU~PXpZ6kw8CQ-1%uCl|vcTbke;0b(0xtOj7+cMSL421Hr4$yJxm~|>^-&a0T*kDpavHsfJwNL7{ zAI!x!U}e%rI`qpdt#7;<3bntz*iD*s%(=B6>)HyF2K-srm^lJXE`3jCY>VAHc{;TJ z#on-OIs*N1uI_lAj%m8MoMszz1OwWMH?pWJ&Gd$K&Dbls5r|(inmMF!Z_iSCL{XM_ z_nQ~f>mIFJJG4tXG^y}a(eNzv(V=r)Z0$l`o8J?Tojv#nhR8XS9>WYGCuGMUz3kq% zr7`eC7Qxg%T1+2B;;I)bX?FK$YG9UW9S}8VHm)XxhA)=U19fWg+Y7a`YFB>ywJAiC zIcW}qe*eUO=QT~={=AGZXE8sFSf^`?CU-cr>)==DR`Bxb5J`LE1_*v_6*aMMP$lDE7NUlPA)0@bm%c2MlN2tSGVE$juTDYu%j4J8Iv;3KirKfhTi5wYl0bcZS9{S8kRLZ!HcdVLKMW0snL_d z+`5OaDcFDideha~TThFPYRHuT`XEz{Zs)}B#U!LQ{_)OfiA1#kUYbxNyNTr3z3Ke$ zV08i7Q+c8tCPOwLQ*8cy*0&O+m(!LvhG|A3X0+35+7pJ>fBeP!{8@%sH~+|MxoUHJ z4`?%YPuRFVrVSwB*3m`J@EW~3_ysJ{#fq0!+<*A&*#{p6y2J`oY=^H@WyYeWwZrDy z@D4s^l?%ttZhH>nVws;9wkR9bPVRd@>1P(bv90d=&>lYtI|=o>=U=71i-oAJsp%{D zITFw9zliCLg?Kb^$OdORDeT&G9@86}x@7jVjZ0^~doSGvfO1r)(BAn~`J6?y6Wp@u zcBoB5KL`|!GFk{c&^Jf&{^0==XOq)Qoa>}!Zq;T{-)}l*Ie%i93_0rmVi!%LHb97f+LsO^i{Kys$srpm=w5;S+J6F=!n#yweH|gTg>Tb!I2Y<|(`3|k+ zk|gCAYhriuF_@9ixa{CpP`RWN*H$w*i+?){g`CB*oHqpQD=zoMTe8s0hEJ#Q1=&cv z{@0f@3yk@eEO~D3XzaF3942DVjyoWF%0)&03~@+tp;#I82Sl4gw9+ah7WT}c*%)ue zN_a((T@tweA-EQTyEhO>2R6%g6I@n>GcY=6(_`+Wm3hj>`aIUM(RN#!!{_t({GlQk zaJtg8|Gm(=9M`eTBzUf%|x!e$zpKf%g6c zuT4KF;KN#ffbvu-lJ({azVQL(X6?bu4JnVJZ`K~tT##~|$7jOi33w{lu~0TPO{)k8 zddPu6P(jJMKJ5;W<~-s`YC-1l*sVk^yNW!nQ`R~0Ed7yBP5x0Q`WL61blPhB5-Fe z0NI!40y*|<^!C^qs)1m&d%S^^x_z$z!qVcCJ&F==ONyT6znlsa`^Yg{vNJj^dkAjy zHl$(hdhzgsaN*6{Xb8H^{%UvGV5@&@Ue)edKrw(GLU|pID+w9d85|xX;H+G?F2Pad z3~;R9SC%G~7o=JJl@@EI-ISsC=cH$5r5C5l2y^$7UoU<6T_}cQBm|-)l8ZQRzD=sC z;1WpK%P0Gkpsn&37Ogf$dXt`oi-SyQk4fR>-h;CCEXD(WKVERY;hT4_2jf5Pj%9Ln z_J6)Ch`+|7zq)NXWxK}8wy~+rD-X3`fV&=c&A*}PB}Ho-?FS?cRHCMnRXw!+9^f1P zI-5}c@|Wp2x+CFYO0Ki|?zz3svQ)7?F;#fJV*l1#nWm`=}?DKBu{0hG7cnvKmZXhP!hzquO-1yY|sWy>tnT9=XlgnIw&L{KFn>dBV@LTH203s=}c=TZf(*t!T>&GAf>4)?&Qy)=8)Z zl_k@=r*7;t{Whr(>5e)2D(rxEm3*I@yyAgqAween{#;qtIv{_)MSiIgz%HdP&B#1s z+&)+*U)2)pTG<4(r47+&(Z%0tVI49(&DcUGm;9-bCpUZ4WMo{g=)Ns!^U8n!n=AiS z6&=vBkz_j!UH-5Qn(<@dHdrqo*uvePeiHUAZB<5pK62LYWIH82lvAROuQKJZKp5Kc zX8$6(Ko*o!vq5e^j>atRdKMN8)yUB=@7|Au1@e-X*ukCwa8YSW6q>Pg>sH*DDMK-v zuKj`=EiDBF{?pn-Ak&-u_y61a9f8LD z7XLx0RiY8fzbBCT-HtwdP-QrLdyPQb-%SFc+t8b@6UY|tToZbhQwl@x5U4n1Q+IvJ zKdpBOR93ut-@mO-33Tf|E&I3i8G+!viB12u5+usn_4Gggwvr^0e0h0CP6tp*k*LkM zuo0n-VQQ%@MI!vXwU>vC&5UG#$QSMgS8Pvc^!b?ICs#)xB2$nVMHvO)7p2tlevrkj zZR-BMZcLEsB=)>)*G3 zufl$s9WpREx1dOT)FIr&fmroU<=DP)88gqJ6(62hpLC@lYjMeC3pcF!7DfX=8O|k* z>Vv}NA3@&B;8=F^ts&CcnN+gL^4nf6N$wx#((zyE7{9J8UV{CcPi0&C3Jbq#k|<@7 z@+?zW_tBo9&sD7?7(&@T_Er>S*Y)cPfKJ&*7mYnbMO+`QaQul#0l!B-D0WI3gTaPu zu^jYZ=Q18&p6qK~GDaI_Uxgng({uTY43phBdq|f=R#;lvy7rRsKe58jq!xkXbNj!& zfB@h@D)#th0PtrvKK1nifa(pvzPa;K&9L`Rbn^SZ2oc0EV(>%=Bmw z&V&x*`hXuBrYamb4=J}M76<0s`1=JLRwctg0uDNtjrHSRHXMx}tH&N7hh6{r{H1rg z?T#va07qCtZ`26T>vNPltMuhg7q*?)ej7AVaKdODcGKff$p2N%2y~eTpX%Lu9L#dM zs`XBLXog`NBgcpfe*xg}{cmJpd5ywe*P$@%t9cz<805Bkz12~S#e$6x=9qs1o{MLK z#pVq7yXew0-V|NfaqjBU(b&n<=}i&aX&gDKsP1BTQ^b^7?9Q?P4r$=8DMB?h{(#*Q zs>Z#X?*CJdJx%zOX%BT_5yW1i&`5f0njBbkiI6)??|0TXR+-sw=x{l(Cq6``A26|u zmv%h09~Jx^Qr0oZA!PR_Lb*qcBJa1xxT!0wx^(!?@RP1so5n{&^!t zQ0|JrXuwLL$A>Yh{=W|aMgjj>f)IC|etqa`kI)nVPr=a4Vt6Hd9YzZ^;;#wtgdOfO z3>EEw;bEo2SK-imybhn$ZTEvHG7Pib9dx<80Ur|qad<}mn#R}b?uRH0V$|q!I{Y;# z0^(;X96J0?$7}Wj{D22T9Dm^TO8>(n1&*h_-Vc}?K8&M1K7A;p``;nB$h^?lfocpS zT`ugj#^CX-!I-(Zo}k-4*ybAG^LTsw+m!$M`Rdf3uNhq&8vXy#Wh8?LpLN3Pd4!m7 zJ05Z5KU@gizMS@Y`@ha^TKe4wp|2|b+2A_Z)U!kucp6+ z1!Hb+7s#CFNaro9Wh|SfX*8NEmbqdzT6dWc5(s_(L|Z7)d2Mg^HEr+d+{+&u&@!gz z=bAp047(LZWBo$12Cy)M+PR;yu} zt)``L2Z%dZ?}9PGeMj_Mv728xM9N{ER1YzHxQ~BzN_W2|dbM_^=;n>1j;ksni)CQP z&HHDdA0hN;{p^ZqN7JW}Y55pSM%$!%jN#)w^9(xMq*kC8IXz!n+{rgjIz1TPCi)4+ zPuf4JhO0)N-qOj;GdTU;hUzIsPQNstLC1#o3-m9dlNwQ@E6W5rcu?7fQmz6w{+<|| zYga+2e|q=`UeBko`&f8A)(h~5^&G)HCY@funICz4#N;^PDra6NNy<0;5!>(s$x}b- zH|8s3YcodZV?O?uo9a_;91OyUZ8)JHjG6DL@`VzuhKZ9pGEQAAmd1{|X}j^2uUwc; zxe$IFJ&2qn8CR%n$BD$Z*uq}oExYGSv9{P;Uabdw$b+>d!!oVax{%1p`{T97YCUvD zw&%Oj?u{iE%JW1>&sJ_k`O!aq9;qok1u2$E${kgSNk8O3i<&w=Cj2M-LMvV)Jm3;_ z!7&BUS12E$0Fe{ec#Jm6!C60ud+NdQ?i&X70_9my_}fZimN6)1Im!3Kh-ss)(M6V=(R*_X)B2?n?+!8{&d!#r|hk9$C8 zNyyVaXK}()C-MYTas`w<8U#TiQ+l05gOFu2W_uT;Tp&D>sm}#1UniK;=Znb6Gx-4% z;=toVW}BX9bhB`I52!}!xX8{TC*+qUN;lq9wdI)MDFj@F#YYcO-1T@6c@KNR2WgzV za}~Om<&PKM&4m6?RsRpjBU;u{XDjPNiSVmdE@=}L)bpF1QeGWDe0F}^hPfB_onSre n2M7FJ`(^3{YH|AM9r81M^+KyD-~XH1p8uVjdy|uso7jlV#~XqCCuEL4f=yk{$S8CwT<%uK3UV)8}^dbio9Gov=371TbNcqT9_6O?3MDkHCv z-D_kfGCrTp7R*w=ozG;Gs++51^xS7>H$SoES8GPskT#eD0^7)MY0=iK=b2E{)V${A zy`)Bni1ftY{^#c({uC`PlV}~Ir0mnyjMAs#Mj|!I;D!LqD_x2b1z;KEpdZ!{*g#-6 zfoMIGmMPjYH91ewv{l)BQs!_GwKmE&TtGS+p*h5iDXlA;R%HXe0&5+}B<}VJJxW?r zqYW@)7T?v+Ou2lj56y_GlS=2)yiW?R1MpcFLx6mXD`IzfP=Fc~p&8ns8**IEFvwHz zTK{R=Hp1^FLmozQZh{HekHsiE;cK?>gIUPH(R zV%SaEp|tcc4<6?;&1el=IEguWl)hLf7Cr$KwTZj|UN2X}9V26zNG9|3vBn1LZ>D+; zHHH&}|3?C!5cr(%k8;w(eg z(w6Fqe-Ux2&)U}WG8sNa)}10Ss&uCe9vrQGv2Hydia9^D{$0hB^aL?nT2JUp{MMHB z4bSt8YHFd7%Jgb(V{{{-wT$2Us9~&+2`iO!QJt`9@T}ps8O)Maw8EXaq*73m=rk)8 z`gZZ}(TXdxd^QZ_n%YPtvS9Y@Gw)c?e*3(RZwd7?vygW$7|5wI?+H)kJ50PdOX&LR zmgVgrybnI}aq#&cLU)!f>M7;KoFT^#mvQULIJ$^cD?@xBR`CGDgc}f>HpOh8K+qq; z1@M^h_Fn+-lwJsUiI?*lynGFuAmq{vj{e%PYtf9c?;99bOu40KE9b6ZhUMyjtehLP zaiM7((AzEDZwU}wJ&lX{&~|)RHvBaqyF0%knd@ZuDp_}xfTQ#v?na*2$f$=|+6@q@ zy~@j6-A8Mwe2i2x8!3Z&zmwx-Lui;>KQ26ZoL;d$+;XkzV=LqD&Bir%N%RJRriCvF zQ+-k~lUh+!WBKf=RI;Wvx{n+<>(B~Hp{Q-0$~)SaDUnyNH}h4KFyNJebXG~;ANFUt zj;Wk$4ER49^t%V)IX0FTy9d~4Wje&nA3!Yl_1ILhU*_CUY5fu^ zZC_RexPYM<@u>|uV=R0hND}M0n>nES0Aba_U)hScKk1i&PbG!Tq5+q+-b0`=au2aS zBL<8CQ_m9sxyTIj>VqKuJ;&_AL5hk^r~*ycCh|BxdLA*2w49#ycE@Lg573r{3-2P1 zoCT#bZ(2h5wWRi3zjt=0w`L+P%wTRz#OS_bLD%fgA5QX4%&RNayp%A9Tp;GuOtRGn z%{c|(vo5cqqY;mjp#VTaISlE}GJx9hDTr}Pg|qlC%f`Jr9Rd|M&2QXk?dx;xX5gv2 z2A=u5!LworJgpNs@PsFFlD3Sp+-1HZezmz`*j?OUMJw` zcpaPKN&Oz{rCzg_c`edKdZpGv-{trG`^~n0<(WC1O(+En1I_L9lF0KS4KNECC#O?| zfw{ZBpcF&M7J`L)TP#m5lnbdsF)5vwCRwRLE^*rt>JM6_u%)Bh1e3{&e5ThN1b%%G z^n~6Vc|h>L15g=021?pIM1AJ8tyc_?0Jr4lJmiM!EnDj?bOj5|{$+3povRKw#R>QF zv9$F##GEftged=I%;)fBXusQh858^R{C{ijxiZ&64+{Gh^#l$GOw8j^5$jX?;!?e> zZ8XB8A;Rdk%b&fuej6T9(snDU1bNd!3q@o!&)RyI*@4NF(%S9UZP995bP?ClWf68_ zfaSnvo4eA=g%=BhE}PiBj5*0y!7&Il*3TM*AEVgK+`>17@V&5lt&yhLXkl^fG|&+4 z(!X(9FY*EI)!$#=Zo0UgU&^0-UVw4cKC_NY-+;%uvwi1*1TAM)MUc+ef^P?RT$e?= zEYc_V{fmw@>_ezcWc&KmOhI$IqoV~KYVEwG{m9^Xn-}3S8^2dg6r=|kaFICc_#3YM zKd4rWle+e!gNuQpM%Jh7UszWDRMPFfx+N}cVZs@xEZvWa-G_=TY`@G03~O<+5yP zfeiH>21kuCSB$4q3EAt0bvB1|QS`jx&;|Yl8X9lwFWUXQ*RVLiH^f@1ZNG9On(`-z zaH&qFuNV$33h<{4Lm%AW+rI~ z)&5*wma65IuW{HqQ|_c%P*Q1aYqea18>{_lqFBi0U1wyeQuZ&0IS&dHX^y!; z8j`7!?{(G4{^@3|>seN^6@ImXSiob+dT@Y0$9S%P|CNzwClnrBO56`~Fd-+3| z&tDwF_g=m8^I3M4nUiXdQcM?;aXINh$Swa}1s-%9vsNw_9Z1uGG0)8k5r^z{uG0R8 z3dha!r_OGAT>3)={aW|-!zwB z7%yI>V@Xiz^n!SudWh@B_|9^0ZxqInjZfM=cB!i!#QoGqzOLyaP z*f|!&hiMs+o*N}iV_g*>?x9{H#67!goijn+XB|VbuDhhpaUdR|m8ARw>N+ZRR)cuh zJcfAe75a;}=7as%-LH=w!p)2cs}Nvi$+0#bDSiyoQe@@h}2-;eGu zsClG40naG1Y8jrrek9TVYnaMHBAYJuW&BtcrP2fbR8p7F#Hgb$r{ooc$^>qf&nk&! zF+B6W8xu{Kha+tCjto}B1EXjxmd%aO60E3`*;TQ4s-R7)3pPygrjcZ&r`3m=!c9}W zS^>YQ_6|%7O!1yl(l%X94QM%4`_TXyB^|@qkLlUq?@edp`m?$slhv)IUmg>W zOi*Xn96nJCxn;PKuL6@u|E(|j(`u%-unf#rlFj!i1^;)8fI7)77wFbaX@0!|*F^w{ zC%R;1l8cNKVfxFYnnr=uOae>!Bv6U;srg>jpUtUxC6m-(l);2%&lJ?O2=aOV zh>jzE*NA8$$UO2XRSSqE1lRQ94-&fCIx7TRkWC|66h=IK%SKMDzenN$t&vv}_;tVj z6To*{FxyOh@4|o|Lm`dCC7ajoUVz4pW{a8Rf_QpfKAW5V=T{vg>jx&y7%_C0zWe_% zWib`Gys~OU4&4Z^m_^3jvV#72=7+lFM^a$JCojzd`}gsUg_150DtNSfSonU{Q{}@2 c@_bdr_HwsA_WxhHAOCpai~Enaf3)Gh0iT=hV*mgE literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/metadata/latest/LATEST-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5caced1cdc8cdcac7dfd4cfcfcfcfdfaaabbcfffe b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/metadata/latest/LATEST-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5caced1cdc8cdcac7dfd4cfcfcfcfdfaaabbcfffe new file mode 100644 index 000000000000..87e8647205b0 --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/metadata/latest/LATEST-13cdcfcdcdd2cfc8d2ceccdfcecac5cdccc5caced1cdc8cdcac7dfd4cfcfcfcfdfaaabbcfffe @@ -0,0 +1 @@ +/2022/07/13-152350.46 \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c6c6c8cecbcadfd4cfcfcfcfdfaaabbcfffe b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c6c6c8cecbcadfd4cfcfcfcfdfaaabbcfffe new file mode 100644 index 0000000000000000000000000000000000000000..4e38e6e64bffa6b6a830994dc97f49f7daff6a96 GIT binary patch literal 2753 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 z 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 Q1^@v6|7MwAlX4{h05IuZXaE2J literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c8c7c9ccc7c7dfd4cfcfcfcfdfaaabbcfffe-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c8c7c9ccc7c7dfd4cfcfcfcfdfaaabbcfffe-CHECKSUM new file mode 100644 index 000000000000..5c61472c663c --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-users-restore/22.1.3/progress/BACKUP-CHECKPOINT-13cdcfcdcdd2cfc8d2cdc9dfcec7c5cccec5cfced1c8c7c9ccc7c7dfd4cfcfcfcfdfaaabbcfffe-CHECKSUM @@ -0,0 +1 @@ +ž MÅ \ No newline at end of file