Ошибка в функции новых рабочих процессов

У меня возникла ошибка после обновления

api_key = "a quick brown fox"
fetch("https://api.example.com/data", headers: { 'Authorization' => api_key })

Пожалуйста, помогите мне это исправить.

Похоже, у вас установлен плагин, но вы не выполнили миграции для создания необходимых таблиц, которые он использует.

Не могли бы вы показать нам часть определения контейнера, где вы его устанавливаете?

Спасибо, но discourse-workflows — это не то, что я установил; это встроенное основное расширение (поставляется в plugins/, разработано Discourse, активируется через enable_discourse_workflows), поэтому в моём app.yml для него нет никаких настроек.

В таблице есть строка миграции 212 в db/migrate/20260312000000_create_workflow_tables.rb, которая создаёт discourse_workflows_webhooks, но она так и не была выполнена в моей базе данных.

Я пишу об этом в основном на случай, если стоит добавить проверку в эту запланированную задачу (PurgeExpiredWebhookTestListeners), чтобы отсутствие таблицы приводило к тихой деградации, а не к ошибке при каждом запуске.

1 лайк

В таблице discourse_workflows_webhooks есть миграция, которая её создаёт (create_workflow_tables, версия 20260312000000, вызов create_table находится в конце этого файла).

В моей базе данных эта миграция уже записана как выполненная в schema_migrations, но сама таблица вебхуков так и не была создана.

Чистый запуск db:migrate это подтвердил: он прошёл без вывода, то есть ничего не ожидалось выполнения, но таблицы по-прежнему не существовало. Rails ориентируется по номеру версии, видит, что миграция выполнена, и не запускает её снова, поэтому таблица остаётся отсутствующей, в то время как модель и запланированная задача очистки продолжают загружаться и выполняться. Именно поэтому одно и то же исключение задачи продолжало накапливаться.

Применённое мной решение: Поскольку миграция уже записана, повторный её запуск не был возможен, так как это привело бы к попытке пересоздания других таблиц рабочих процессов, которые уже существуют, и вызвало бы ошибку.

Поэтому я создал отсутствующую таблицу напрямую, точно соответствуя миграции (те же столбцы, те же пять индексов, включая уникальный):

conn = ActiveRecord::Base.connection
unless conn.table_exists?(:discourse_workflows_webhooks)
conn.create_table :discourse_workflows_webhooks do |t|
t.bigint :workflow_id, null: false
t.string :workflow_version_id, limit: 36
t.string :node_name, null: false, limit: 100
t.string :webhook_path, null: false, limit: 500
t.string :http_method, null: false, limit: 10
t.string :webhook_id, limit: 36
t.integer :path_length
t.boolean :test_webhook, null: false, default: false
t.integer :user_id
t.jsonb :workflow_snapshot
t.datetime :expires_at
t.datetime :created_at, null: false, default: -> { "CURRENT_TIMESTAMP" }
end
conn.add_index :discourse_workflows_webhooks, %i[http_method webhook_path test_webhook], unique: true, name: "idx_dwf_webhooks_on_method_path_test"
conn.add_index :discourse_workflows_webhooks, %i[webhook_id http_method test_webhook], name: "idx_dwf_webhooks_on_webhook_id_method_test", where: "webhook_id IS NOT NULL"
conn.add_index :discourse_workflows_webhooks, :workflow_id, name: "idx_dwf_webhooks_on_workflow_id"
conn.add_index :discourse_workflows_webhooks, :workflow_version_id, name: "idx_dwf_webhooks_on_workflow_version_id"
conn.add_index :discourse_workflows_webhooks, :expires_at, name: "idx_dwf_webhooks_on_expires_at", where: "expires_at IS NOT NULL"
end

После этого table_exists? возвращает true, и задача PurgeExpiredWebhookTestListeners перестаёт выдавать ошибки при следующем запуске.

Поскольку это произошло из-за редактирования выпущенной миграции после её выполнения, более позднее обновление ядра, которое добавит корректную миграцию для этой таблицы, может попытаться создать её снова и завершиться ошибкой «уже существует».

Если это случится после обновления, решением будет позволить новой миграции взять верх: сначала удалите таблицу, созданную вручную, или вставьте её версию в schema_migrations, чтобы она была пропущена.

Оставляю это на заметку на случай, если кто-то ещё на последней ветке столкнётся с тем же исключением задачи.

3 лайка