Files
fission-console/FIX_ARCHIVE_PRUNER.md
T

4.1 KiB
Raw Blame History

FIX: archivePruner удаляет архивы tenant namespaces

Симптом

Node.js функции не специализируются → fetcher 404 при скачивании архива. Storagesvc логи: archive_pruner удаляет архив через ~90 сек после создания функции.

Причина

pkg/storagesvc/archivePruner.go, функция getOrphanArchives, строка 95:

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

Заменить (строки 94125):

	// 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)
			}
		}
	}

На:

	// 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" (больше не используется).

После правки

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