Cleanup aliased modules when the main module is deleted (#1365)
Signed-off-by: Clifton Kaznocha <ckaznocha@users.noreply.github.com>
This commit is contained in:
@@ -119,6 +119,11 @@ type (
|
|||||||
s *Store
|
s *Store
|
||||||
// prev and next hold the nodes in the linked list of ModuleInstance held by Store.
|
// prev and next hold the nodes in the linked list of ModuleInstance held by Store.
|
||||||
prev, next *ModuleInstance
|
prev, next *ModuleInstance
|
||||||
|
// aliases holds the module names that are aliases of this module registered in the store.
|
||||||
|
// Access to this field must be guarded by s.mux.
|
||||||
|
//
|
||||||
|
// Note: This is currently only used for spectests and will be nil in most cases.
|
||||||
|
aliases []string
|
||||||
// Definitions is derived from *Module, and is constructed during compilation phrase.
|
// Definitions is derived from *Module, and is constructed during compilation phrase.
|
||||||
Definitions []FunctionDefinition
|
Definitions []FunctionDefinition
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ func (s *Store) deleteModule(m *ModuleInstance) error {
|
|||||||
if m.ModuleName != "" {
|
if m.ModuleName != "" {
|
||||||
delete(s.nameToModule, m.ModuleName)
|
delete(s.nameToModule, m.ModuleName)
|
||||||
|
|
||||||
|
// Under normal circumstances, m.aliases will be nil this loop will not
|
||||||
|
// be entered unless aliases have been created. See `*store.AliasModule`
|
||||||
|
for _, alias := range m.aliases {
|
||||||
|
delete(s.nameToModule, alias)
|
||||||
|
}
|
||||||
|
|
||||||
// Shrink the map if it's allocated more than twice the size of the list
|
// Shrink the map if it's allocated more than twice the size of the list
|
||||||
newCap := len(s.nameToModule)
|
newCap := len(s.nameToModule)
|
||||||
if newCap < nameToModuleShrinkThreshold {
|
if newCap < nameToModuleShrinkThreshold {
|
||||||
@@ -93,7 +99,15 @@ func (s *Store) registerModule(m *ModuleInstance) error {
|
|||||||
func (s *Store) AliasModule(src, dst string) error {
|
func (s *Store) AliasModule(src, dst string) error {
|
||||||
s.mux.Lock()
|
s.mux.Lock()
|
||||||
defer s.mux.Unlock()
|
defer s.mux.Unlock()
|
||||||
s.nameToModule[dst] = s.nameToModule[src]
|
if _, ok := s.nameToModule[dst]; ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
m, ok := s.nameToModule[src]
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
m.aliases = append(m.aliases, dst)
|
||||||
|
s.nameToModule[dst] = m
|
||||||
if len(s.nameToModule) > s.nameToModuleCap {
|
if len(s.nameToModule) > s.nameToModuleCap {
|
||||||
s.nameToModuleCap = len(s.nameToModule)
|
s.nameToModuleCap = len(s.nameToModule)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,17 +108,28 @@ func TestStore_module(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestStore_AliasModule(t *testing.T) {
|
func TestStore_AliasModule(t *testing.T) {
|
||||||
s := newStore()
|
|
||||||
m1 := &ModuleInstance{ModuleName: "m1"}
|
|
||||||
s.nameToModule[m1.ModuleName] = m1
|
|
||||||
|
|
||||||
t.Run("alias module", func(t *testing.T) {
|
t.Run("alias module", func(t *testing.T) {
|
||||||
|
s := newStore()
|
||||||
|
m1 := &ModuleInstance{ModuleName: "m1"}
|
||||||
|
s.nameToModule[m1.ModuleName] = m1
|
||||||
|
|
||||||
require.NoError(t, s.AliasModule("m1", "m2"))
|
require.NoError(t, s.AliasModule("m1", "m2"))
|
||||||
require.Equal(t, map[string]*ModuleInstance{"m1": m1, "m2": m1}, s.nameToModule)
|
require.Equal(t, map[string]*ModuleInstance{"m1": m1, "m2": m1}, s.nameToModule)
|
||||||
// Doesn't affect module names
|
// Doesn't affect module names
|
||||||
require.Nil(t, s.moduleList)
|
require.Nil(t, s.moduleList)
|
||||||
require.Equal(t, nameToModuleShrinkThreshold, s.nameToModuleCap)
|
require.Equal(t, nameToModuleShrinkThreshold, s.nameToModuleCap)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("delete aliased module", func(t *testing.T) {
|
||||||
|
s := newStore()
|
||||||
|
m1 := &ModuleInstance{ModuleName: "m1"}
|
||||||
|
s.nameToModule[m1.ModuleName] = m1
|
||||||
|
|
||||||
|
require.NoError(t, s.AliasModule("m1", "m2"))
|
||||||
|
require.NoError(t, s.deleteModule(m1))
|
||||||
|
_, ok := s.nameToModule["m2"]
|
||||||
|
require.False(t, ok)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStore_nameToModuleCap(t *testing.T) {
|
func TestStore_nameToModuleCap(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user