From c454963ba1679dc15797fe5f10c4647cc12c1e46 Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 8 Aug 2024 10:01:06 -0300 Subject: [PATCH 1/4] feat(confix): allow customization of migration plan --- CHANGELOG.md | 4 ++++ store/cachekv/store.go | 32 ++++++++++++++++++++++++++++++++ store/cachemulti/store.go | 26 ++++++++++++++++++++++++++ store/types/store.go | 5 ++++- tools/confix/migrations.go | 20 ++++++++++++++------ 5 files changed, 80 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6da175fb5b3..a47565a13e7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,7 +62,11 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i * (client) [#19870](https://github.com/cosmos/cosmos-sdk/pull/19870) Add new query command `wait-tx`. Alias `event-query-tx-for` to `wait-tx` for backward compatibility. * (crypto/keyring) [#20212](https://github.com/cosmos/cosmos-sdk/pull/20212) Expose the db keyring used in the keystore. * (genutil) [#19971](https://github.com/cosmos/cosmos-sdk/pull/19971) Allow manually setting the consensus key type in genesis +<<<<<<< HEAD +* (store) [#20862](https://github.com/cosmos/cosmos-sdk/pull/20862) Add `Copy()` method for `CacheMultiStore` and `cachekv.Store`. +======= * (client/tx) [#20870](https://github.com/cosmos/cosmos-sdk/pull/20870) Add `timeout-timestamp` field for tx body defines time based timeout.Add `WithTimeoutTimestamp` to tx factory. Increased gas cost for processing newly added timeout timestamp field in tx body. +>>>>>>> upstream/main ### Improvements diff --git a/store/cachekv/store.go b/store/cachekv/store.go index 879ce2a41633..8b69ddee1a3d 100644 --- a/store/cachekv/store.go +++ b/store/cachekv/store.go @@ -161,6 +161,38 @@ func (store *Store) Write() { } } +// Copy creates a deep copy of the Store object +func (store *Store) Copy() types.CacheKVStore { + store.mtx.Lock() + defer store.mtx.Unlock() + + // Copy cache + cacheCopy := make(map[string]*cValue, len(store.cache)) + for key, val := range store.cache { + newVal := *val // Create a copy of the cValue + cacheCopy[key] = &newVal + } + + // Copy unsortedCache + unsortedCacheCopy := make(map[string]struct{}, len(store.unsortedCache)) + for key := range store.unsortedCache { + unsortedCacheCopy[key] = struct{}{} + } + + // Copy sortedCache + sortedCacheCopy := store.sortedCache.Copy() + + // Create new Store with copied values + newStore := &Store{ + cache: cacheCopy, + unsortedCache: unsortedCacheCopy, + sortedCache: sortedCacheCopy, + parent: store.parent, + } + + return newStore +} + // CacheWrap implements CacheWrapper. func (store *Store) CacheWrap() types.CacheWrap { return NewStore(store) diff --git a/store/cachemulti/store.go b/store/cachemulti/store.go index 696911370c5d..7e769f8ab555 100644 --- a/store/cachemulti/store.go +++ b/store/cachemulti/store.go @@ -127,6 +127,32 @@ func (cms Store) Write() { } } +// Copy creates a deep copy of the Store object +func (cms Store) Copy() types.CacheMultiStore { + // Deep copy the db field + newDB := cms.db.Copy() + + // Deep copy the cachekv stores map + newStores := make(map[types.StoreKey]types.CacheWrap, len(cms.stores)) + for key, store := range cms.stores { + store, ok := store.(*cachekv.Store) + if ok { + newStores[key] = store.Copy() + } + } + + // Create new Store with copied values + newStore := Store{ + db: newDB, + stores: newStores, + keys: cms.keys, + traceWriter: cms.traceWriter, + traceContext: cms.traceContext, + } + + return newStore +} + // Implements CacheWrapper. func (cms Store) CacheWrap() types.CacheWrap { return cms.CacheMultiStore().(types.CacheWrap) diff --git a/store/types/store.go b/store/types/store.go index 7846876eeb6d..371d5db8c654 100644 --- a/store/types/store.go +++ b/store/types/store.go @@ -167,7 +167,8 @@ type MultiStore interface { // CacheMultiStore is from MultiStore.CacheMultiStore().... type CacheMultiStore interface { MultiStore - Write() // Writes operations to underlying KVStore + Write() // Writes operations to underlying KVStore + Copy() CacheMultiStore // Returns a deep copy of the CacheMultiStore } // CommitMultiStore is an interface for a MultiStore without cache capabilities. @@ -286,6 +287,8 @@ type CacheKVStore interface { // Write writes operations to underlying KVStore Write() + // Copy creates a deep copy of the Store object + Copy() CacheKVStore } // CommitKVStore is an interface for MultiStore. diff --git a/tools/confix/migrations.go b/tools/confix/migrations.go index 737ed6b822cb..43d6b2348a04 100644 --- a/tools/confix/migrations.go +++ b/tools/confix/migrations.go @@ -21,12 +21,16 @@ const ( // MigrationMap defines a mapping from a version to a transformation plan. type MigrationMap map[string]func(from *tomledit.Document, to, planType string) (transform.Plan, *tomledit.Document) +// loadDestConfigFile is the function signature to load the destination version +// configuration toml file. +type loadDestConfigFile func(to, planType string) (*tomledit.Document, error) + var Migrations = MigrationMap{ "v0.45": NoPlan, // Confix supports only the current supported SDK version. So we do not support v0.44 -> v0.45. - "v0.46": PlanBuilder, - "v0.47": PlanBuilder, - "v0.50": PlanBuilder, - "v0.52": PlanBuilder, + "v0.46": defaultPlanBuilder, + "v0.47": defaultPlanBuilder, + "v0.50": defaultPlanBuilder, + "v0.52": defaultPlanBuilder, "v2": V2PlanBuilder, // "v0.xx.x": PlanBuilder, // add specific migration in case of configuration changes in minor versions } @@ -53,12 +57,16 @@ var v2KeyChanges = v2KeyChangesMap{ // Add other key mappings as needed } +func defaultPlanBuilder(from *tomledit.Document, to, planType string) (transform.Plan, *tomledit.Document) { + return PlanBuilder(from, to, planType, LoadLocalConfig) +} + // PlanBuilder is a function that returns a transformation plan for a given diff between two files. -func PlanBuilder(from *tomledit.Document, to, planType string) (transform.Plan, *tomledit.Document) { +func PlanBuilder(from *tomledit.Document, to, planType string, loadFn loadDestConfigFile) (transform.Plan, *tomledit.Document) { plan := transform.Plan{} deletedSections := map[string]bool{} - target, err := LoadLocalConfig(to, planType) + target, err := loadFn(to, planType) if err != nil { panic(fmt.Errorf("failed to parse file: %w. This file should have been valid", err)) } From f74ae7d69f0113ee37067642d929ff32f02884f9 Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 8 Aug 2024 10:02:03 -0300 Subject: [PATCH 2/4] add changelog entry --- tools/confix/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/confix/CHANGELOG.md b/tools/confix/CHANGELOG.md index e044193f3029..531daaf7b5c1 100644 --- a/tools/confix/CHANGELOG.md +++ b/tools/confix/CHANGELOG.md @@ -31,6 +31,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] +### Features + +* (confix) [#21202](https://github.com/cosmos/cosmos-sdk/pull/21202) Allow customization of migration `PlanBuilder`. + ## [v0.1.1](https://github.com/cosmos/cosmos-sdk/releases/tag/tools/confix/v0.1.1) - 2023-12-11 * [#18496](https://github.com/cosmos/cosmos-sdk/pull/18496) Remove invalid non SDK config from app.toml migration templates. From e0f169e78836f78466e863101cb5e421f0682dce Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 8 Aug 2024 10:04:22 -0300 Subject: [PATCH 3/4] revert unnecessary change --- CHANGELOG.md | 4 ---- store/cachekv/store.go | 32 -------------------------------- store/cachemulti/store.go | 26 -------------------------- store/types/store.go | 5 +---- 4 files changed, 1 insertion(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a47565a13e7f..c6da175fb5b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,11 +62,7 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i * (client) [#19870](https://github.com/cosmos/cosmos-sdk/pull/19870) Add new query command `wait-tx`. Alias `event-query-tx-for` to `wait-tx` for backward compatibility. * (crypto/keyring) [#20212](https://github.com/cosmos/cosmos-sdk/pull/20212) Expose the db keyring used in the keystore. * (genutil) [#19971](https://github.com/cosmos/cosmos-sdk/pull/19971) Allow manually setting the consensus key type in genesis -<<<<<<< HEAD -* (store) [#20862](https://github.com/cosmos/cosmos-sdk/pull/20862) Add `Copy()` method for `CacheMultiStore` and `cachekv.Store`. -======= * (client/tx) [#20870](https://github.com/cosmos/cosmos-sdk/pull/20870) Add `timeout-timestamp` field for tx body defines time based timeout.Add `WithTimeoutTimestamp` to tx factory. Increased gas cost for processing newly added timeout timestamp field in tx body. ->>>>>>> upstream/main ### Improvements diff --git a/store/cachekv/store.go b/store/cachekv/store.go index 8b69ddee1a3d..879ce2a41633 100644 --- a/store/cachekv/store.go +++ b/store/cachekv/store.go @@ -161,38 +161,6 @@ func (store *Store) Write() { } } -// Copy creates a deep copy of the Store object -func (store *Store) Copy() types.CacheKVStore { - store.mtx.Lock() - defer store.mtx.Unlock() - - // Copy cache - cacheCopy := make(map[string]*cValue, len(store.cache)) - for key, val := range store.cache { - newVal := *val // Create a copy of the cValue - cacheCopy[key] = &newVal - } - - // Copy unsortedCache - unsortedCacheCopy := make(map[string]struct{}, len(store.unsortedCache)) - for key := range store.unsortedCache { - unsortedCacheCopy[key] = struct{}{} - } - - // Copy sortedCache - sortedCacheCopy := store.sortedCache.Copy() - - // Create new Store with copied values - newStore := &Store{ - cache: cacheCopy, - unsortedCache: unsortedCacheCopy, - sortedCache: sortedCacheCopy, - parent: store.parent, - } - - return newStore -} - // CacheWrap implements CacheWrapper. func (store *Store) CacheWrap() types.CacheWrap { return NewStore(store) diff --git a/store/cachemulti/store.go b/store/cachemulti/store.go index 7e769f8ab555..696911370c5d 100644 --- a/store/cachemulti/store.go +++ b/store/cachemulti/store.go @@ -127,32 +127,6 @@ func (cms Store) Write() { } } -// Copy creates a deep copy of the Store object -func (cms Store) Copy() types.CacheMultiStore { - // Deep copy the db field - newDB := cms.db.Copy() - - // Deep copy the cachekv stores map - newStores := make(map[types.StoreKey]types.CacheWrap, len(cms.stores)) - for key, store := range cms.stores { - store, ok := store.(*cachekv.Store) - if ok { - newStores[key] = store.Copy() - } - } - - // Create new Store with copied values - newStore := Store{ - db: newDB, - stores: newStores, - keys: cms.keys, - traceWriter: cms.traceWriter, - traceContext: cms.traceContext, - } - - return newStore -} - // Implements CacheWrapper. func (cms Store) CacheWrap() types.CacheWrap { return cms.CacheMultiStore().(types.CacheWrap) diff --git a/store/types/store.go b/store/types/store.go index 371d5db8c654..7846876eeb6d 100644 --- a/store/types/store.go +++ b/store/types/store.go @@ -167,8 +167,7 @@ type MultiStore interface { // CacheMultiStore is from MultiStore.CacheMultiStore().... type CacheMultiStore interface { MultiStore - Write() // Writes operations to underlying KVStore - Copy() CacheMultiStore // Returns a deep copy of the CacheMultiStore + Write() // Writes operations to underlying KVStore } // CommitMultiStore is an interface for a MultiStore without cache capabilities. @@ -287,8 +286,6 @@ type CacheKVStore interface { // Write writes operations to underlying KVStore Write() - // Copy creates a deep copy of the Store object - Copy() CacheKVStore } // CommitKVStore is an interface for MultiStore. From 1d8b8a469c8dc8710dfa98e2fcb07254570b79fd Mon Sep 17 00:00:00 2001 From: Tom <54514587+GAtom22@users.noreply.github.com> Date: Mon, 12 Aug 2024 10:38:37 -0300 Subject: [PATCH 4/4] Update tools/confix/migrations.go Co-authored-by: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> --- tools/confix/migrations.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/confix/migrations.go b/tools/confix/migrations.go index 43d6b2348a04..4a500898bc04 100644 --- a/tools/confix/migrations.go +++ b/tools/confix/migrations.go @@ -32,7 +32,7 @@ var Migrations = MigrationMap{ "v0.50": defaultPlanBuilder, "v0.52": defaultPlanBuilder, "v2": V2PlanBuilder, - // "v0.xx.x": PlanBuilder, // add specific migration in case of configuration changes in minor versions + // "v0.xx.x": defaultPlanBuilder, // add specific migration in case of configuration changes in minor versions } type v2KeyChangesMap map[string][]string