rivet-gg / rivet

🔩 The only backend your multiplayer game needs. Open-source & self-hostable.
https://rivet.gg
Apache License 2.0
2.03k stars 47 forks source link

Investigate high query execution time for pulling workflows #1169

Open MasterPtato opened 3 days ago

MasterPtato commented 3 days ago

image.png

https://cockroachlabs.cloud/cluster/f2d12815-7aec-41ca-a80b-0c18495376c7/statement/false/12460495546316681669

Investigation

Main query

EXPLAIN ANALYZE SELECT workflow_id, workflow_name, create_ts, ray_id, input, wake_deadline_ts
FROM db_workflow.workflows AS w
WHERE
    -- Not already complete
    output IS NULL AND
    -- No assigned node (not running)
    worker_instance_id IS NULL AND
    -- Check for wake condition
    (
        -- Immediate
        wake_immediate OR
        -- After deadline
        (
            wake_deadline_ts IS NOT NULL AND
            1727300638946 > wake_deadline_ts - 5001
        ) OR
        -- Signal exists
        (
            SELECT true
            FROM db_workflow.signals AS s
            WHERE
                s.workflow_id = w.workflow_id AND
                s.signal_name = ANY(w.wake_signals) AND
                s.ack_ts IS NULL
            LIMIT 1
        ) OR
        -- Tagged signal exists
        (
            SELECT true
            FROM db_workflow.tagged_signals AS s
            WHERE
                s.signal_name = ANY(w.wake_signals) AND
                s.tags <@ w.tags AND
                s.ack_ts IS NULL
            LIMIT 1
        ) OR
        -- Sub workflow completed
        (
            SELECT true
            FROM db_workflow.workflows AS w2
            WHERE
                w2.workflow_id = w.wake_sub_workflow_id AND
                output IS NOT NULL
        )
    )
LIMIT 50;

CPU time on max3: 190ms

Alterations:

linear[bot] commented 3 days ago

RVT-3824 Investigate high query execution time for pulling workflows