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 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. 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 from __future__ import annotations
import uuid import uuid
from sqlalchemy import ForeignKey, Integer, String from sqlalchemy import Integer, String
from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
@ -19,7 +20,5 @@ class TagVerticalCount(Base):
__tablename__ = "tag_vertical_counts" __tablename__ = "tag_vertical_counts"
vertical: Mapped[str] = mapped_column(String(32), primary_key=True) vertical: Mapped[str] = mapped_column(String(32), primary_key=True)
tag_id: Mapped[uuid.UUID] = mapped_column( tag_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True)
UUID(as_uuid=True), ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True
)
scene_count: Mapped[int] = mapped_column(Integer, nullable=False) scene_count: Mapped[int] = mapped_column(Integer, nullable=False)