From e9a49904c050a388a4a6758f574dde6bfa12e986 Mon Sep 17 00:00:00 2001 From: "Aaron H. Alpar" Date: Wed, 23 Nov 2022 15:02:24 -0800 Subject: [PATCH] fixup for lint --- cli/command_repository_set_parameters.go | 48 ++++++++++++++++-------- cli/command_repository_upgrade.go | 24 +++++++----- cli/command_repository_upgrade_test.go | 1 - repo/content/committed_read_manager.go | 4 +- repo/content/index_blob_manager_v0.go | 3 +- tests/testenv/cli_test_env.go | 13 +++++-- 6 files changed, 59 insertions(+), 34 deletions(-) diff --git a/cli/command_repository_set_parameters.go b/cli/command_repository_set_parameters.go index 00e160129..c99a1e206 100644 --- a/cli/command_repository_set_parameters.go +++ b/cli/command_repository_set_parameters.go @@ -121,6 +121,35 @@ func (c *commandRepositorySetParameters) setRetentionModeParameter(ctx context.C log(ctx).Infof(" - setting %v to %s.\n", desc, v) } +func updateRepositoryParameters( + ctx context.Context, + upgradeToEpochManager bool, + mp format.MutableParameters, + rep repo.DirectRepositoryWriter, + blobcfg format.BlobStorageConfiguration, + requiredFeatures []feature.Required, +) error { + if upgradeToEpochManager { + log(ctx).Infof("migrating current indexes to epoch format") + + if err := rep.ContentManager().PrepareUpgradeToIndexBlobManagerV1(ctx, mp.EpochParameters); err != nil { + return errors.Wrap(err, "error upgrading indexes") + } + } + + if err := rep.FormatManager().SetParameters(ctx, mp, blobcfg, requiredFeatures); err != nil { + return errors.Wrap(err, "error setting parameters") + } + + if upgradeToEpochManager { + if err := format.WriteLegacyIndexPoisonBlob(ctx, rep.BlobStorage()); err != nil { + log(ctx).Errorf("unable to write legacy index poison blob: %v", err) + } + } + + return nil +} + func (c *commandRepositorySetParameters) run(ctx context.Context, rep repo.DirectRepositoryWriter) error { var anyChange bool @@ -191,22 +220,9 @@ func (c *commandRepositorySetParameters) run(ctx context.Context, rep repo.Direc return errors.Errorf("no changes") } - if upgradeToEpochManager { - log(ctx).Infof("migrating current indexes to epoch format") - - if err := rep.ContentManager().PrepareUpgradeToIndexBlobManagerV1(ctx, mp.EpochParameters); err != nil { - return errors.Wrap(err, "error upgrading indexes") - } - } - - if err := rep.FormatManager().SetParameters(ctx, mp, blobcfg, requiredFeatures); err != nil { - return errors.Wrap(err, "error setting parameters") - } - - if upgradeToEpochManager { - if err := format.WriteLegacyIndexPoisonBlob(ctx, rep.BlobStorage()); err != nil { - log(ctx).Errorf("unable to write legacy index poison blob: %v", err) - } + err = updateRepositoryParameters(ctx, upgradeToEpochManager, mp, rep, blobcfg, requiredFeatures) + if err != nil { + return errors.Wrap(err, "error updating repository parameters") } log(ctx).Infof("NOTE: Repository parameters updated, you must disconnect and re-connect all other Kopia clients.") diff --git a/cli/command_repository_upgrade.go b/cli/command_repository_upgrade.go index 9d3aeccec..f54c8a494 100644 --- a/cli/command_repository_upgrade.go +++ b/cli/command_repository_upgrade.go @@ -42,9 +42,8 @@ type commandRepositoryUpgrade struct { ) const ( - commitModeCommitOnValidationSuccess string = "" - commitModeAlwaysCommit = "always" - commitModeNeverCommit = "never" + commitModeAlwaysCommit = "always" + commitModeNeverCommit = "never" ) func (c *commandRepositoryUpgrade) setup(svc advancedAppServices, parent commandParent) { @@ -91,22 +90,21 @@ func (c *commandRepositoryUpgrade) setup(svc advancedAppServices, parent command c.svc = svc } -// assign store the info struct in a map that can be used to compare indexes +// assign store the info struct in a map that can be used to compare indexes. func assign(iif content.Info, i int, m map[content.ID][2]index.Info) { v := m[iif.GetContentID()] v[i] = iif m[iif.GetContentID()] = v } -// loadIndexBlobs load index blobs into indexEntries map +// loadIndexBlobs load index blobs into indexEntries map. func loadIndexBlobs(ctx context.Context, indexEntries map[content.ID][2]index.Info, sm *content.SharedManager, which int, indexBlobInfos []content.IndexBlobInfo) error { d := gather.WriteBuffer{} - - for _, indexBlobInfo := range indexBlobInfos { + for _, indexBlobInfo := range indexBlobInfos { blobID := indexBlobInfo.BlobID - indexInfos, err := sm.LoadIndexBlob(ctx, blobID, d) + indexInfos, err := sm.LoadIndexBlob(ctx, blobID, &d) if err != nil { return errors.Wrapf(err, "failed to load index blob with BlobID %s", blobID) } @@ -114,15 +112,14 @@ func loadIndexBlobs(ctx context.Context, indexEntries map[content.ID][2]index.In for _, indexInfo := range indexInfos { assign(indexInfo, which, indexEntries) } - } + return nil } // validateAction returns an error of the new V1 index blob content does not match the source V0 index blob content. // This is used to check that the upgraded index (V1 index) reflects the content of the old V0 index. func (c *commandRepositoryUpgrade) validateAction(ctx context.Context, rep repo.DirectRepositoryWriter) error { - indexEntries := map[content.ID][2]index.Info{} sm := rep.ContentManager().SharedManager @@ -158,10 +155,12 @@ func (c *commandRepositoryUpgrade) validateAction(ctx context.Context, rep repo. } else { err = checkIndexInfo(indexEntryPairs[0], indexEntryPairs[1]) } + if err != nil { break } } + if err == nil { log(ctx).Infof("index validation succeeded") return nil @@ -172,12 +171,14 @@ func (c *commandRepositoryUpgrade) validateAction(ctx context.Context, rep repo. log(ctx).Errorf("%v", err) return nil } + return err } // checkIndexInfo compare two index infos. If a mismatch exists, return an error with diagnostic information. func checkIndexInfo(i0, i1 index.Info) error { var err error + switch { case i0.GetFormatVersion() != i1.GetFormatVersion(): err = errors.Errorf("mismatched FormatVersions: %v %v", i0.GetFormatVersion(), i1.GetFormatVersion()) @@ -196,11 +197,13 @@ func checkIndexInfo(i0, i1 index.Info) error { case i0.GetTimestampSeconds() != i1.GetTimestampSeconds(): err = errors.Errorf("mismatched TimestampSeconds: %v %v", i0.GetTimestampSeconds(), i1.GetTimestampSeconds()) } + if err != nil { return errors.Wrapf(err, "index blobs do not match: %v, %v", string(i0.GetPackBlobID()), string(i1.GetPackBlobID())) } + return nil } @@ -429,6 +432,7 @@ func (c *commandRepositoryUpgrade) commitUpgrade(ctx context.Context, rep repo.D log(ctx).Infof("Commit mode is set to 'never'. Skipping commit.") return nil } + if err := rep.FormatManager().CommitUpgrade(ctx); err != nil { return errors.Wrap(err, "error finalizing upgrade") } diff --git a/cli/command_repository_upgrade_test.go b/cli/command_repository_upgrade_test.go index d49c14cae..9cbb5284c 100644 --- a/cli/command_repository_upgrade_test.go +++ b/cli/command_repository_upgrade_test.go @@ -95,7 +95,6 @@ func (s *formatSpecificTestSuite) TestRepositoryCorruptedUpgrade(t *testing.T) { "--status-poll-interval", "1s", "--max-permitted-clock-drift", "1s") } - } func (s *formatSpecificTestSuite) TestRepositoryUpgradeCommitNever(t *testing.T) { diff --git a/repo/content/committed_read_manager.go b/repo/content/committed_read_manager.go index 8c0d7c49b..2b68d8391 100644 --- a/repo/content/committed_read_manager.go +++ b/repo/content/committed_read_manager.go @@ -119,8 +119,8 @@ type SharedManager struct { } // LoadIndexBlob return index information loaded from the specified blob. -func (sm *SharedManager) LoadIndexBlob(ctx context.Context, ibid blob.ID, d gather.WriteBuffer) ([]Info, error) { - err := sm.st.GetBlob(ctx, ibid, 0, -1, &d) +func (sm *SharedManager) LoadIndexBlob(ctx context.Context, ibid blob.ID, d *gather.WriteBuffer) ([]Info, error) { + err := sm.st.GetBlob(ctx, ibid, 0, -1, d) if err != nil { return nil, errors.Wrapf(err, "could not find index blob %q", ibid) } diff --git a/repo/content/index_blob_manager_v0.go b/repo/content/index_blob_manager_v0.go index c6e8ea487..46fe5e203 100644 --- a/repo/content/index_blob_manager_v0.go +++ b/repo/content/index_blob_manager_v0.go @@ -67,7 +67,6 @@ type indexBlobManagerV0 struct { // ListIndexBlobInfos list active blob info structs. Also returns time of latest content deletion commit. func (m *indexBlobManagerV0) ListIndexBlobInfos(ctx context.Context) ([]IndexBlobInfo, time.Time, error) { - activeIndexBlobs, t0, err := m.listActiveIndexBlobs(ctx) if err != nil { return nil, time.Time{}, err @@ -80,7 +79,7 @@ func (m *indexBlobManagerV0) ListIndexBlobInfos(ctx context.Context) ([]IndexBlo if activeIndexBlob.BlobID == format.LegacyIndexPoisonBlobID { continue } - + q = append(q, activeIndexBlob) } diff --git a/tests/testenv/cli_test_env.go b/tests/testenv/cli_test_env.go index 5929b4f4a..bf1522a28 100644 --- a/tests/testenv/cli_test_env.go +++ b/tests/testenv/cli_test_env.go @@ -109,32 +109,39 @@ func (e *CLITest) RunAndExpectSuccess(t *testing.T, args ...string) []string { return stdout } -// TweakFile writes a 0x00 byte at a random point in a file. Used to simulate file corruption +// TweakFile writes a 0x00 byte at a random point in a file. Used to simulate file corruption. func (e *CLITest) TweakFile(t *testing.T, dirn, fglob string) { t.Helper() const RwUserGroupOther = 0o666 + // find a file within the repository to corrupt mch, err := fs.Glob(os.DirFS(dirn), fglob) require.NoError(t, err) require.Greater(t, len(mch), 0) + // grab a random file in the directory dirn fn := mch[rand.Intn(len(mch))] f, err := os.OpenFile(path.Join(dirn, fn), os.O_RDWR, os.FileMode(RwUserGroupOther)) require.NoError(t, err) + // find the length of the file, then seek to a random location l, err := f.Seek(0, io.SeekEnd) require.NoError(t, err) + i := rand.Int63n(l) bs := [1]byte{} + for { // find a location that isn't already // the value we want to write - _, err := f.ReadAt(bs[:], i) + _, err = f.ReadAt(bs[:], i) require.NoError(t, err) + if bs[0] != 0x00 { break } + i = rand.Int63n(l) } // write the byte @@ -183,7 +190,7 @@ func (e *CLITest) RunAndExpectFailure(t *testing.T, args ...string) (stdout, std t.Helper() var err error - stdout, stderr, err = e.Run(t, true, args...) + if err == nil { t.Fatalf("'kopia %v' succeeded, but expected failure", strings.Join(args, " ")) }