From bbd59eec570f34aaa6f9173490992468e1813c66 Mon Sep 17 00:00:00 2001 From: GareArc Date: Tue, 26 May 2026 17:51:26 -0700 Subject: [PATCH 1/4] fix: delete ServerlessRuntime record on plugin uninstall when refs reach zero --- internal/types/models/curd/atomic.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/types/models/curd/atomic.go b/internal/types/models/curd/atomic.go index d2f5f26ff..a3d596b6a 100644 --- a/internal/types/models/curd/atomic.go +++ b/internal/types/models/curd/atomic.go @@ -372,6 +372,14 @@ func UninstallPlugin( }, tx); err != nil { return err } + + if pluginToBeReturns.InstallType == plugin_entities.PLUGIN_RUNTIME_TYPE_SERVERLESS { + if err := db.DeleteByCondition(&models.ServerlessRuntime{ + PluginUniqueIdentifier: pluginUniqueIdentifier.String(), + }, tx); err != nil { + return err + } + } } return nil From 60829ac331223927f926e1cf8120f16c44ca603d Mon Sep 17 00:00:00 2001 From: GareArc Date: Tue, 26 May 2026 17:52:23 -0700 Subject: [PATCH 2/4] refactor: expose ClearServerlessRuntimeCache as public method on PluginManager --- internal/core/plugin_manager/installer.go | 4 ++-- internal/core/plugin_manager/serverless.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/core/plugin_manager/installer.go b/internal/core/plugin_manager/installer.go index b20615f47..e2122386c 100644 --- a/internal/core/plugin_manager/installer.go +++ b/internal/core/plugin_manager/installer.go @@ -50,7 +50,7 @@ func (p *PluginManager) SwitchServerlessEndpoint( if err != nil { return err } - return p.clearServerlessRuntimeCache(pluginUniqueIdentifier) + return p.ClearServerlessRuntimeCache(pluginUniqueIdentifier) } // serverless runtime uses a strategy that firstly compile the plugin into a docker image @@ -109,7 +109,7 @@ func (p *PluginManager) Reinstall( // cleanup system cache for serverless runtime model // cleanup must be done after updating the model, otherwise race condition may occur - if err := p.clearServerlessRuntimeCache(pluginUniqueIdentifier); err != nil { + if err := p.ClearServerlessRuntimeCache(pluginUniqueIdentifier); err != nil { log.Error("failed to cleanup system cache for serverless runtime model", "error", err) responseStream.Write(installation_entities.PluginInstallResponse{ Event: installation_entities.PluginInstallEventError, diff --git a/internal/core/plugin_manager/serverless.go b/internal/core/plugin_manager/serverless.go index 9d45e11e4..8b9caef18 100644 --- a/internal/core/plugin_manager/serverless.go +++ b/internal/core/plugin_manager/serverless.go @@ -87,7 +87,7 @@ func (p *PluginManager) getServerlessPluginRuntimeModel( return runtime, nil } -func (p *PluginManager) clearServerlessRuntimeCache( +func (p *PluginManager) ClearServerlessRuntimeCache( identity plugin_entities.PluginUniqueIdentifier, ) error { _, err := cache.Del(p.getServerlessRuntimeCacheKey(identity)) From 15f7938a2d81fd1c96120e851a21e99717dc6d52 Mon Sep 17 00:00:00 2001 From: GareArc Date: Tue, 26 May 2026 17:53:30 -0700 Subject: [PATCH 3/4] fix: clear serverless runtime cache on full plugin uninstall (ENG-474) --- internal/service/install_plugin.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/service/install_plugin.go b/internal/service/install_plugin.go index 368b497c8..0dfdebded 100644 --- a/internal/service/install_plugin.go +++ b/internal/service/install_plugin.go @@ -364,6 +364,14 @@ func UninstallPlugin( if deleteResponse != nil && deleteResponse.IsPluginDeleted { helper.DeletePluginDeclarationCache(pluginUniqueIdentifier, plugin_entities.PluginRuntimeType(installation.RuntimeType)) + + if plugin_entities.PluginRuntimeType(installation.RuntimeType) == plugin_entities.PLUGIN_RUNTIME_TYPE_SERVERLESS { + if manager := plugin_manager.Manager(); manager != nil { + if err := manager.ClearServerlessRuntimeCache(pluginUniqueIdentifier); err != nil { + log.Error("failed to clear serverless runtime cache on uninstall", "error", err) + } + } + } } if deleteResponse != nil && deleteResponse.IsPluginDeleted && deleteResponse.Plugin != nil && deleteResponse.Plugin.InstallType == plugin_entities.PLUGIN_RUNTIME_TYPE_LOCAL { From c5b352d4b98ef5b98aedff325ace9e00248df97c Mon Sep 17 00:00:00 2001 From: GareArc Date: Tue, 26 May 2026 18:04:05 -0700 Subject: [PATCH 4/4] fix: clean up ServerlessRuntime record and cache on plugin upgrade when refs reach zero --- internal/tasks/install_plugin_utils.go | 7 +++++++ internal/types/models/curd/atomic.go | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/internal/tasks/install_plugin_utils.go b/internal/tasks/install_plugin_utils.go index 14e13a38a..c7a4fe6e4 100644 --- a/internal/tasks/install_plugin_utils.go +++ b/internal/tasks/install_plugin_utils.go @@ -174,5 +174,12 @@ func RemovePluginIfNeeded( return errors.Join(err, errors.New("failed to shutdown plugin gracefully")) } } + + if shouldCleanup && response.DeletedPlugin != nil && response.DeletedPlugin.InstallType == plugin_entities.PLUGIN_RUNTIME_TYPE_SERVERLESS { + if err := manager.ClearServerlessRuntimeCache(originalPluginUniqueIdentifier); err != nil { + log.Error("failed to clear serverless runtime cache on upgrade", "error", err) + } + } + return nil } diff --git a/internal/types/models/curd/atomic.go b/internal/types/models/curd/atomic.go index a3d596b6a..d6ebb89a3 100644 --- a/internal/types/models/curd/atomic.go +++ b/internal/types/models/curd/atomic.go @@ -506,6 +506,14 @@ func UpgradePlugin( }, tx); err != nil { return err } + + if originalPlugin.InstallType == plugin_entities.PLUGIN_RUNTIME_TYPE_SERVERLESS { + if err := db.DeleteByCondition(&models.ServerlessRuntime{ + PluginUniqueIdentifier: originalPluginUniqueIdentifier.String(), + }, tx); err != nil { + return err + } + } } else if err != nil { return err }