diff --git a/migrations/capcons/capabilitymigration.go b/migrations/capcons/capabilitymigration.go index 763003d8c6..a37fd234e7 100644 --- a/migrations/capcons/capabilitymigration.go +++ b/migrations/capcons/capabilitymigration.go @@ -41,7 +41,7 @@ type CapabilityMigrationReporter interface { // CapabilityValueMigration migrates all path capabilities to ID capabilities, // using the path to ID capability controller mapping generated by LinkValueMigration. type CapabilityValueMigration struct { - CapabilityIDs map[interpreter.AddressPath]interpreter.UInt64Value + CapabilityIDs *CapabilityIDMapping Reporter CapabilityMigrationReporter } @@ -75,7 +75,7 @@ func (m *CapabilityValueMigration) Migrate( oldCapability := value capabilityAddressPath := oldCapability.AddressPath() - capabilityID, ok := m.CapabilityIDs[capabilityAddressPath] + capabilityID, ok := m.CapabilityIDs.Get(capabilityAddressPath) if !ok { if reporter != nil { reporter.MissingCapabilityID( diff --git a/migrations/capcons/linkmigration.go b/migrations/capcons/linkmigration.go index 1d7f1697f5..c26744585d 100644 --- a/migrations/capcons/linkmigration.go +++ b/migrations/capcons/linkmigration.go @@ -40,7 +40,7 @@ type LinkMigrationReporter interface { // LinkValueMigration migrates all links to capability controllers. type LinkValueMigration struct { - CapabilityIDs map[interpreter.AddressPath]interpreter.UInt64Value + CapabilityIDs *CapabilityIDMapping AccountIDGenerator stdlib.AccountIDGenerator Reporter LinkMigrationReporter } @@ -182,8 +182,7 @@ func (m *LinkValueMigration) Migrate( // Record new capability ID in source path mapping. // The mapping is used later for migrating path capabilities to ID capabilities, // see CapabilityMigration. - - m.CapabilityIDs[addressPath] = capabilityID + m.CapabilityIDs.Record(addressPath, capabilityID) if reporter != nil { reporter.MigratedLink(addressPath, capabilityID) diff --git a/migrations/capcons/mapping.go b/migrations/capcons/mapping.go new file mode 100644 index 0000000000..8eb1a45b38 --- /dev/null +++ b/migrations/capcons/mapping.go @@ -0,0 +1,52 @@ +/* + * Cadence - The resource-oriented smart contract programming language + * + * Copyright Dapper Labs, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package capcons + +import ( + "sync" + + "github.com/onflow/cadence/runtime/interpreter" +) + +type CapabilityIDMapping struct { + // CapabilityIDs' maps common.Address to map[interpreter.PathValue]interpreter.UInt64Value + capabilityIDs sync.Map +} + +func (m *CapabilityIDMapping) Record(addressPath interpreter.AddressPath, capabilityID interpreter.UInt64Value) { + var accountCapabilityIDs map[interpreter.PathValue]interpreter.UInt64Value + rawAccountCapabilityIDs, ok := m.capabilityIDs.Load(addressPath.Address) + if ok { + accountCapabilityIDs = rawAccountCapabilityIDs.(map[interpreter.PathValue]interpreter.UInt64Value) + } else { + accountCapabilityIDs = map[interpreter.PathValue]interpreter.UInt64Value{} + m.capabilityIDs.Store(addressPath.Address, accountCapabilityIDs) + } + accountCapabilityIDs[addressPath.Path] = capabilityID +} + +func (m *CapabilityIDMapping) Get(addressPath interpreter.AddressPath) (interpreter.UInt64Value, bool) { + rawAccountCapabilityIDs, ok := m.capabilityIDs.Load(addressPath.Address) + if !ok { + return 0, false + } + accountCapabilityIDs := rawAccountCapabilityIDs.(map[interpreter.PathValue]interpreter.UInt64Value) + capabilityID, ok := accountCapabilityIDs[addressPath.Path] + return capabilityID, ok +} diff --git a/migrations/capcons/migration_test.go b/migrations/capcons/migration_test.go index c8ecb2cdf7..56b2f7dbb5 100644 --- a/migrations/capcons/migration_test.go +++ b/migrations/capcons/migration_test.go @@ -476,7 +476,7 @@ func testPathCapabilityValueMigration( migration := migrations.NewStorageMigration(inter, storage) - capabilityIDs := map[interpreter.AddressPath]interpreter.UInt64Value{} + capabilityIDs := &CapabilityIDMapping{} reporter := &testMigrationReporter{} @@ -1325,7 +1325,7 @@ func testLinkMigration( migration := migrations.NewStorageMigration(inter, storage) - capabilityIDs := map[interpreter.AddressPath]interpreter.UInt64Value{} + capabilityIDs := &CapabilityIDMapping{} reporter := &testMigrationReporter{}