fix(tags): tag_vertical_counts bez klucza obcego, koniec zakleszczenia o 05:00

Refresh licznikow (co 3 h) i tag_tail_trim (raz dziennie) startuja razem
o 05:00. Kasowanie osieroconych tagow schodzilo kaskada do
tag_vertical_counts i czekalo na refresh, a refresh przy wstawianiu czekal
na blokade tego samego tagu przez sprawdzenie klucza obcego. Od 29.09
Postgres co rano zabijal przycinanie (Sentry GOON-7N). Tabela to kopia
liczona od zera, wiec klucz obcy nie byl potrzebny (migracja 0050).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
goon-foss 2026-09-30 20:24:42 +02:00
parent 8a9fea3eef
commit 8f8bb1c448
2 changed files with 44 additions and 5 deletions

View file

@ -0,0 +1,40 @@
"""tag_vertical_counts bez klucza obcego do tags (zakleszczenie o 05:00, Sentry GOON-7N).
Codziennie o 05:00 rusza naraz refresh_taxonomy_counts (co 3 h) i tag_tail_trim (raz
dziennie). Przycinanie kasuje przypisania rule34video, a potem osierocone tagi; DELETE na
tags schodzi kaskada do tag_vertical_counts i czeka na refresh, ktory te wiersze wlasnie
podmienia. Refresh wstawia liczniki z migawki, w ktorej skasowane przypisania jeszcze sa,
a sprawdzenie klucza obcego czeka na blokade tego samego wiersza tags. Od 2026-09-29
Postgres co rano zabija tag_tail_trim.
Tabela to kopia liczona od zera co 3 h, wiec klucz obcy nic nie daje: wiersz po
skasowanym tagu znika przy nastepnym odswiezeniu, a /tags i tak zaczyna od tabeli tags.
Revision ID: 0050_tag_vertical_counts_no_fk
Revises: 0049_playback_origin_sort_idx
Create Date: 2026-09-30
"""
from __future__ import annotations
from alembic import op
revision = "0050_tag_vertical_counts_no_fk"
down_revision: str | None = "0049_playback_origin_sort_idx"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.execute("SET LOCAL lock_timeout = '5s'")
op.execute(
"ALTER TABLE tag_vertical_counts DROP CONSTRAINT IF EXISTS fk_tag_vertical_counts_tag_id_tags"
)
def downgrade() -> None:
op.execute("SET LOCAL lock_timeout = '5s'")
op.execute("DELETE FROM tag_vertical_counts v WHERE NOT EXISTS (SELECT 1 FROM tags t WHERE t.id = v.tag_id)")
op.execute(
"ALTER TABLE tag_vertical_counts ADD CONSTRAINT fk_tag_vertical_counts_tag_id_tags "
"FOREIGN KEY (tag_id) REFERENCES tags (id) ON DELETE CASCADE"
)

View file

@ -2,13 +2,14 @@
Wypelnia `refresh_taxonomy_counts`, czyta /tags?vertical=. Ta sama definicja co dawny
agregat na zywo: sceny z >= 1 zywym zrodlem z originow wertykalu, bez progu dlugosci.
Patrz migracja 0047.
Patrz migracja 0047. Bez klucza obcego do tags (0050): z nim kasowanie tagow w
tag_tail_trim zakleszczalo sie z odswiezaniem tej tabeli.
"""
from __future__ import annotations
import uuid
from sqlalchemy import ForeignKey, Integer, String
from sqlalchemy import Integer, String
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column
@ -19,7 +20,5 @@ class TagVerticalCount(Base):
__tablename__ = "tag_vertical_counts"
vertical: Mapped[str] = mapped_column(String(32), primary_key=True)
tag_id: Mapped[uuid.UUID] = mapped_column(
UUID(as_uuid=True), ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True
)
tag_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True)
scene_count: Mapped[int] = mapped_column(Integer, nullable=False)