Fix local run freshness and plugin asset handling

This commit is contained in:
npc0-hue
2026-08-22 19:45:00 +08:00
parent bb5e48b29c
commit ebd616c549
23 changed files with 312 additions and 58 deletions
+57 -7
View File
@@ -739,17 +739,67 @@ func (svc *CoreService) RegisterGamePluginManifest(registration domain.GamePlugi
if err := validator.ValidateGamePlugin(plugin); err != nil {
return domain.GamePlugin{}, err
}
if err := svc.store.GamePlugins().Create(plugin); err != nil {
if !errors.Is(err, repo.ErrDuplicate) {
return domain.GamePlugin{}, err
}
if existing, err := svc.store.GamePlugins().Get(plugin.ID); err == nil {
if err := svc.store.GamePlugins().Update(plugin); err != nil {
return domain.GamePlugin{}, err
}
if err := svc.refreshServerPluginReferences(existing.ID, plugin.Version); err != nil {
return domain.GamePlugin{}, err
}
} else if errors.Is(err, repo.ErrNotFound) {
if err := svc.store.GamePlugins().Create(plugin); err != nil {
return domain.GamePlugin{}, err
}
} else {
return domain.GamePlugin{}, err
}
return domain.CopyGamePlugin(plugin), nil
}
// refreshServerPluginReferences keeps existing server projections usable when a
// manifest is refreshed in place. The server and its logical runtime binding
// carry the manifest version used for lifecycle validation; leaving either at a
// stale version would make a healthy existing server impossible to start after
// the registry refresh.
func (svc *CoreService) refreshServerPluginReferences(pluginID, pluginVersion string) error {
if strings.TrimSpace(pluginID) == "" || strings.TrimSpace(pluginVersion) == "" {
return nil
}
stamp := svc.now()
instances, err := svc.store.ServerInstances().List(domain.ServerInstanceFilter{PluginID: pluginID})
if err != nil {
return err
}
for _, instance := range instances {
if instance.PluginVersion != pluginVersion {
instance.PluginVersion = pluginVersion
instance.UpdatedAt = stamp
if err := validator.ValidateStoredServerInstance(instance); err != nil {
return err
}
if err := svc.store.ServerInstances().Update(instance); err != nil {
return err
}
}
bindings, err := svc.store.RuntimeBindings().List(domain.RuntimeBindingFilter{ServerInstanceID: instance.ID})
if err != nil {
return err
}
for _, binding := range bindings {
if binding.PluginID != pluginID || binding.PluginVersion == pluginVersion {
continue
}
binding.PluginVersion = pluginVersion
binding.UpdatedAt = stamp
if err := svc.store.RuntimeBindings().Update(binding); err != nil {
return err
}
}
}
return nil
}
func gamePluginFromManifestRegistration(registration domain.GamePluginManifestRegistration) domain.GamePlugin {
registration = domain.CopyGamePluginManifestRegistration(registration)
manifest := registration.Manifest
@@ -1633,7 +1683,7 @@ func (svc *CoreService) CreateServerInstance(instance domain.ServerInstance) (do
}
var endpoint domain.RunEndpoint
if strings.TrimSpace(instance.RunEndpointID) != "" {
endpoint, err = svc.store.RunEndpoints().Get(instance.RunEndpointID)
endpoint, err = svc.GetRunEndpoint(instance.RunEndpointID)
if err != nil {
return domain.ServerInstance{}, fmt.Errorf("get run endpoint dependency: %w", err)
}
@@ -1779,7 +1829,7 @@ func (svc *CoreService) GetPlatformResourceUsage() (domain.PlatformResourceUsage
if err != nil {
return domain.PlatformResourceUsage{}, err
}
endpoints, err := svc.store.RunEndpoints().List(domain.RunEndpointFilter{})
endpoints, err := svc.ListRunEndpoints(domain.RunEndpointFilter{})
if err != nil {
return domain.PlatformResourceUsage{}, err
}
@@ -2212,7 +2262,7 @@ func (svc *CoreService) latestMetricsForServer(instance domain.ServerInstance) d
}
return domain.ServerMetrics{
ServerInstanceID: instance.ID,
Online: instance.State == domain.ServerInstanceStateRunning,
Online: false,
Source: "run-metrics-pending",
CollectedAt: svc.now(),
}