Zum Inhalt

Polycrate API 0.15.1

Release-Datum: 19. April 2026
Typ: Hotfix (Migrate-Job / Migrations / Pricing-Signals)

Highlights

Hotfix für den 0.15.0-Migrate-Job. Die Migration k8s.0200_backfill_k8svolume_product konnte auf Datenbanken, die vor 0.15.0 erstellt wurden, mit InFailedSqlTransaction abbrechen, weil sie die von polycrate_api.0069 angelegte Spalte SystemConfig.default_k8s_volume_product_id las, ohne die zugehörige Cross-App-Dependency zu deklarieren.

Zusätzlich konnte jeder DB-Fehler in einem ProductizedModelMixin-Post-Save-Signal (inklusive IntegrityError durch K8sVolume-Rows ohne Organisation) die aufrufende Migration- oder Request-Transaktion vergiften (Transaction Poisoning). 0.15.1 ergänzt die fehlende Migrationsabhängigkeit, umschließt den SystemConfig-Zugriff sowie beide Signal-Pfade mit Savepoints und fügt in reconcile_organization_product einen deterministischen Early-Return für fehlende Organisation hinzu.

Siehe auch Spec 158 im polycrate-api-Repository (polycrate spec inspect 158 im API-Workspace).

Artefakte

Docker Image

docker pull cargo.ayedo.cloud/polycrate/polycrate-api:0.15.1

Block

polycrate pull cargo.ayedo.cloud/ayedo/k8s/polycrate-api
polycrate run polycrate-api install

Changes

Migrations

  • k8s.0200_backfill_k8svolume_product hängt jetzt explizit von polycrate_api.0069_systemconfig_default_k8s_volume_product ab. Django wendet damit polycrate_api.0069 vor k8s.0200 an; die Spalte polycrate_api_systemconfig.default_k8s_volume_product_id existiert, bevor der Backfill sie liest — der zuvor beobachtete ProgrammingError / InFailedSqlTransaction-Abbruch beim 0.15.0-Rollout entfällt.
  • Der SystemConfig.get_solo().default_k8s_volume_product-Zugriff innerhalb der Migration läuft zusätzlich in einem transaction.atomic(savepoint=True)-Block, damit ein unerwarteter DB-Fehler die äußere Migrationstransaktion (und den anschließenden INSERT INTO django_migrations) nicht mehr zurückrollt.

Pricing-Signals

  • ProductizedModelMixin._post_save und _post_delete umschließen die Aufrufe reconcile_organization_product() bzw. delete_organization_product() mit einem Savepoint. Ein DB-Fehler im Signal wird weiterhin als Warnung protokolliert; die aufrufende Transaktion (RunPython-Migration, HTTP-Request, Celery-Task) bleibt committfähig statt mit InFailedSqlTransaction zu enden.
  • reconcile_organization_product steigt früh aus, wenn instance.organization_id nicht gesetzt ist. Damit werden IntegrityErrors für K8sVolume-Rows ohne Organisation vermieden, bei denen OrganizationProduct.organization (NOT NULL) keinen gültigen Wert bekommen würde.

Betriebliche Hinweise

  • Datenbanken, die vor 0.15.0 waren und die defekte 0.15.0-Migration zurückgerollt haben, sind durch 0.15.1 abgedeckt: Der Migrate-Job führt polycrate_api.0069 vor k8s.0200 aus und schließt den Backfill ab.
  • Der workspaces.0130-Deadlock (Scale-Down-Timing, langlebige Sessions gegen AccessExclusiveLock) ist nicht Teil dieses Fixes; er bleibt ein operatives Thema und wird separat adressiert.

Migration

Kein manueller Schema-Schritt außerhalb des üblichen Deploys. Nach Image-Update den Migrate-Job erneut ausführen lassen (wie im polycrate-api-Block vorgesehen).

Verwandte Releases