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
|
||||
// prev and next hold the nodes in the linked list of ModuleInstance held by Store.
|
||||
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 []FunctionDefinition
|
||||
}
|
||||
|
||||
@@ -30,6 +30,12 @@ func (s *Store) deleteModule(m *ModuleInstance) error {
|
||||
if 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
|
||||
newCap := len(s.nameToModule)
|
||||
if newCap < nameToModuleShrinkThreshold {
|
||||
@@ -93,7 +99,15 @@ func (s *Store) registerModule(m *ModuleInstance) error {
|
||||
func (s *Store) AliasModule(src, dst string) error {
|
||||
s.mux.Lock()
|
||||
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 {
|
||||
s.nameToModuleCap = len(s.nameToModule)
|
||||
}
|
||||
|
||||
@@ -108,17 +108,28 @@ func TestStore_module(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) {
|
||||
s := newStore()
|
||||
m1 := &ModuleInstance{ModuleName: "m1"}
|
||||
s.nameToModule[m1.ModuleName] = m1
|
||||
|
||||
require.NoError(t, s.AliasModule("m1", "m2"))
|
||||
require.Equal(t, map[string]*ModuleInstance{"m1": m1, "m2": m1}, s.nameToModule)
|
||||
// Doesn't affect module names
|
||||
require.Nil(t, s.moduleList)
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user