# FIX: archivePruner удаляет архивы tenant namespaces ## Симптом Node.js функции не специализируются → fetcher 404 при скачивании архива. Storagesvc логи: `archive_pruner` удаляет архив через ~90 сек после создания функции. ## Причина `pkg/storagesvc/archivePruner.go`, функция `getOrphanArchives`, строка 95: ```go for _, namespace := range utils.DefaultNSResolver().Snapshot() { pkgList, err := pruner.crdClient.CoreV1().Packages(namespace).List(...) ``` `DefaultNSResolver().Snapshot()` возвращает только namespaces зарегистрированные через `AddNamespace()`. Storagesvc не слушает namespace events → tenant namespaces (`fission-*`) туда не попадают → их Package CRD невидимы → все загруженные архивы считаются orphan → удаляются. ## Правка **Файл:** `pkg/storagesvc/archivePruner.go` **Заменить** (строки 94–125): ```go // get all pkgs from kubernetes for _, namespace := range utils.DefaultNSResolver().Snapshot() { pkgList, err := pruner.crdClient.CoreV1().Packages(namespace).List(ctx, metav1.ListOptions{}) if err != nil { pruner.logger.Error("error getting package list from kubernetes", zap.Error(err)) return } // extract archives referenced by these pkgs for _, pkg := range pkgList.Items { if pkg.Spec.Deployment.URL != "" { archiveID, err = getQueryParamValue(pkg.Spec.Deployment.URL, "id") if err != nil { pruner.logger.Error("error extracting value of archiveID from deployment url", zap.Error(err), zap.String("url", pkg.Spec.Deployment.URL)) return } archivesRefByPkgs = append(archivesRefByPkgs, archiveID) } if pkg.Spec.Source.URL != "" { archiveID, err = getQueryParamValue(pkg.Spec.Source.URL, "id") if err != nil { pruner.logger.Error("error extracting value of archiveID from source url", zap.Error(err), zap.String("url", pkg.Spec.Source.URL)) return } archivesRefByPkgs = append(archivesRefByPkgs, archiveID) } } } ``` **На:** ```go // get all pkgs from kubernetes across ALL namespaces (including tenant namespaces) // Fix: DefaultNSResolver().Snapshot() returns only fission-registered namespaces, // not tenant namespaces (fission-*). Use NamespaceAll to scan everything. pkgList, err := pruner.crdClient.CoreV1().Packages(metav1.NamespaceAll).List(ctx, metav1.ListOptions{}) if err != nil { pruner.logger.Error("error getting package list from kubernetes", zap.Error(err)) return } // extract archives referenced by these pkgs for _, pkg := range pkgList.Items { if pkg.Spec.Deployment.URL != "" { archiveID, err = getQueryParamValue(pkg.Spec.Deployment.URL, "id") if err != nil { pruner.logger.Error("error extracting value of archiveID from deployment url", zap.Error(err), zap.String("url", pkg.Spec.Deployment.URL)) return } archivesRefByPkgs = append(archivesRefByPkgs, archiveID) } if pkg.Spec.Source.URL != "" { archiveID, err = getQueryParamValue(pkg.Spec.Source.URL, "id") if err != nil { pruner.logger.Error("error extracting value of archiveID from source url", zap.Error(err), zap.String("url", pkg.Spec.Source.URL)) return } archivesRefByPkgs = append(archivesRefByPkgs, archiveID) } } ``` **Импорты** — удалить `"github.com/fission/fission/pkg/utils"` (больше не используется). ## После правки ```bash cd ~/terra/fission-src go build ./pkg/storagesvc/... # проверить компиляцию # пересобрать storagesvc образ и передеплоить docker build -t naeel/fission-storagesvc:<новый-тег> -f cmd/storagesvc/Dockerfile . docker push naeel/fission-storagesvc:<новый-тег> kubectl set image -n fission deploy/storagesvc storagesvc=naeel/fission-storagesvc:<новый-тег> kubectl rollout status -n fission deploy/storagesvc ```