"""Quando é que uma entidade foi reclamada da fila de histórico.

A fila de conteúdo já recupera sozinha o que ficou pendurado: o `take_content`
reclama também os actos em `running` há mais de 15 minutos, porque nenhum demora
isso e quem lá estiver morreu. A fila de entidades nunca precisou disso — só o CT
a consumia, em processo único, e um restart do contentor levava tudo consigo.

Passa a ser consumida também pelo trabalhador remoto, noutra máquina e noutra
linha. Um worker que morra a meio deixaria entidades em `running` **para sempre**,
invisíveis à fila e sem nada a acusar; com 507 mil na fila, ninguém daria por
elas. É o mesmo mecanismo, pela mesma razão.

Fica NULL para quem nunca foi reclamado, e a condição do `take_from_queue` trata
esse caso como "não está pendurado".
"""
from alembic import op

revision = "0033"
down_revision = "0032"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.execute("ALTER TABLE registry_entity_fetch ADD COLUMN claimed_at TIMESTAMPTZ")
    # O índice da fila passa a servir também a recuperação, senão cada reclamação
    # varria as 507 mil linhas à procura de penduradas.
    op.execute(
        """
        CREATE INDEX ix_rfetch_running ON registry_entity_fetch (claimed_at)
         WHERE status = 'running'
        """
    )


def downgrade() -> None:
    op.execute("DROP INDEX IF EXISTS ix_rfetch_running")
    op.execute("ALTER TABLE registry_entity_fetch DROP COLUMN claimed_at")
