From d8b78e7ef1b330faa34091d2c41d9542e61249e9 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Sun, 28 Jul 2024 10:22:21 +0200 Subject: [PATCH] fix(gallery): do clear out errors once displayed Signed-off-by: Ettore Di Giacinto --- core/http/elements/gallery.go | 12 ++++++---- core/http/routes/ui.go | 45 +++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/core/http/elements/gallery.go b/core/http/elements/gallery.go index 3b3741d8f21..575ea87d3e3 100644 --- a/core/http/elements/gallery.go +++ b/core/http/elements/gallery.go @@ -9,7 +9,6 @@ import ( "github.com/mudler/LocalAI/core/gallery" "github.com/mudler/LocalAI/core/p2p" "github.com/mudler/LocalAI/core/services" - "github.com/mudler/LocalAI/pkg/xsync" ) const ( @@ -372,7 +371,12 @@ func dropBadChars(s string) string { return strings.ReplaceAll(s, "@", "__") } -func ListModels(models []*gallery.GalleryModel, processing *xsync.SyncedMap[string, string], galleryService *services.GalleryService) string { +type ProcessTracker interface { + Exists(string) bool + Get(string) string +} + +func ListModels(models []*gallery.GalleryModel, processTracker ProcessTracker, galleryService *services.GalleryService) string { modelsElements := []elem.Node{} descriptionDiv := func(m *gallery.GalleryModel) elem.Node { return elem.Div( @@ -396,7 +400,7 @@ func ListModels(models []*gallery.GalleryModel, processing *xsync.SyncedMap[stri actionDiv := func(m *gallery.GalleryModel) elem.Node { galleryID := fmt.Sprintf("%s@%s", m.Gallery.Name, m.Name) - currentlyProcessing := processing.Exists(galleryID) + currentlyProcessing := processTracker.Exists(galleryID) jobID := "" isDeletionOp := false if currentlyProcessing { @@ -404,7 +408,7 @@ func ListModels(models []*gallery.GalleryModel, processing *xsync.SyncedMap[stri if status != nil && status.Deletion { isDeletionOp = true } - jobID = processing.Get(galleryID) + jobID = processTracker.Get(galleryID) // TODO: // case not handled, if status == nil : "Waiting" } diff --git a/core/http/routes/ui.go b/core/http/routes/ui.go index 33706944fa2..929174635de 100644 --- a/core/http/routes/ui.go +++ b/core/http/routes/ui.go @@ -21,6 +21,40 @@ import ( "github.com/google/uuid" ) +type modelOpCache struct { + status *xsync.SyncedMap[string, string] +} + +func NewModelOpCache() *modelOpCache { + return &modelOpCache{ + status: xsync.NewSyncedMap[string, string](), + } +} + +func (m *modelOpCache) Set(key string, value string) { + m.status.Set(key, value) +} + +func (m *modelOpCache) Get(key string) string { + return m.status.Get(key) +} + +func (m *modelOpCache) DeleteUUID(uuid string) { + for _, k := range m.status.Keys() { + if m.status.Get(k) == uuid { + m.status.Delete(k) + } + } +} + +func (m *modelOpCache) Map() map[string]string { + return m.status.Map() +} + +func (m *modelOpCache) Exists(key string) bool { + return m.status.Exists(key) +} + func RegisterUIRoutes(app *fiber.App, cl *config.BackendConfigLoader, ml *model.ModelLoader, @@ -29,7 +63,7 @@ func RegisterUIRoutes(app *fiber.App, auth func(*fiber.Ctx) error) { // keeps the state of models that are being installed from the UI - var processingModels = xsync.NewSyncedMap[string, string]() + var processingModels = NewModelOpCache() // modelStatus returns the current status of the models being processed (installation or deletion) // it is called asynchonously from the UI @@ -232,6 +266,8 @@ func RegisterUIRoutes(app *fiber.App, return c.SendString(elements.ProgressBar("100")) } if status.Error != nil { + // TODO: instead of deleting the job, we should keep it in the cache and make it dismissable + processingModels.DeleteUUID(jobUID) return c.SendString(elements.ErrorProgress(status.Error.Error(), status.GalleryModelName)) } @@ -246,12 +282,7 @@ func RegisterUIRoutes(app *fiber.App, status := galleryService.GetStatus(jobUID) galleryID := "" - for _, k := range processingModels.Keys() { - if processingModels.Get(k) == jobUID { - galleryID = k - processingModels.Delete(k) - } - } + processingModels.DeleteUUID(jobUID) if galleryID == "" { log.Debug().Msgf("no processing model found for job : %+v\n", jobUID) }