diff --git a/docker-compose.yml b/docker-compose.yml index 0a10bad2..1b0642b1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -264,6 +264,7 @@ services: MIRROR_KNOT_USE_SSL: "true" MIRROR_KNOT_SSRF: "true" MIRROR_RESYNC_PARALLELISM: "4" + MIRROR_APPVIEW_URL: http://appview:3000 MIRROR_SEARCH_ZOEKT_URL: https://zoekt.tngl.boltless.dev/indexserver volumes: - knotmirror-data:/data diff --git a/knotmirror/config/config.go b/knotmirror/config/config.go index a3097b47..bc076292 100644 --- a/knotmirror/config/config.go +++ b/knotmirror/config/config.go @@ -8,6 +8,7 @@ import ( ) type Config struct { + AppviewUrl string `env:"MIRROR_APPVIEW_URL, default=https://tangled.org"` PlcUrl string `env:"MIRROR_PLC_URL, default=https://plc.directory"` TapUrl string `env:"MIRROR_TAP_URL, default=http://localhost:2480"` DbUrl string `env:"MIRROR_DB_URL, required"` diff --git a/knotmirror/repoindexer/language.go b/knotmirror/repoindexer/language.go index 50bc0742..e5331399 100644 --- a/knotmirror/repoindexer/language.go +++ b/knotmirror/repoindexer/language.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "log/slog" + "net/http" "path/filepath" "strings" "time" @@ -95,6 +96,30 @@ func NewBackgroundIndexScheduler(l *slog.Logger, cfg *config.Config, e *sql.DB, return fmt.Errorf("failed to insert langs into db: %w", err) } + // HACK(boltless): ping appview to update language cache. + go func() { + url := fmt.Sprintf("%s/%s", cfg.AppviewUrl, repoId.String()) + pingCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + req, err := http.NewRequestWithContext(pingCtx, http.MethodGet, url, nil) + if err != nil { + l.Warn("appview ping: build request failed", "err", err) + return + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + l.Warn("appview ping failed", "url", url, "err", err) + return + } + defer resp.Body.Close() + // drain body to ensure the appview completes rendering + if _, err := io.Copy(io.Discard, resp.Body); err != nil { + l.Warn("appview ping: drain response failed", "url", url, "err", err) + return + } + l.Info("appview pinged", "url", url, "status", resp.StatusCode) + }() + return nil }, )