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:
parent
8a9fea3eef
commit
8f8bb1c448
2 changed files with 44 additions and 5 deletions
40
alembic/versions/20260930_0050_tag_vertical_counts_no_fk.py
Normal file
40
alembic/versions/20260930_0050_tag_vertical_counts_no_fk.py
Normal 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"
|
||||
)
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue