From 53b8efaf26f1902f5f1cbb29f6f0b3e9c1d7af7c Mon Sep 17 00:00:00 2001 From: caitmich Date: Wed, 22 Jul 2026 13:18:23 -0400 Subject: [PATCH 1/4] index logs.uid to speed up progress polling and cleanup queries --- db/migrate/20260722163331_add_index_to_logs_on_uid.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20260722163331_add_index_to_logs_on_uid.rb diff --git a/db/migrate/20260722163331_add_index_to_logs_on_uid.rb b/db/migrate/20260722163331_add_index_to_logs_on_uid.rb new file mode 100644 index 000000000..e16f83ba3 --- /dev/null +++ b/db/migrate/20260722163331_add_index_to_logs_on_uid.rb @@ -0,0 +1,5 @@ +class AddIndexToLogsOnUid < ActiveRecord::Migration[8.0] + def change + add_index :logs, :uid + end +end diff --git a/db/schema.rb b/db/schema.rb index cbce9e5bf..925744be1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2026_05_21_000001) do +ActiveRecord::Schema[8.0].define(version: 2026_07_22_163331) do create_table "active_storage_attachments", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false @@ -184,6 +184,7 @@ t.text "text" t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false + t.index ["uid"], name: "index_logs_on_uid" end create_table "mapping_fields", force: :cascade do |t| From bfa55ea3ec2d92ef777dbb99e618721880c8d665 Mon Sep 17 00:00:00 2001 From: caitmich Date: Wed, 22 Jul 2026 13:18:31 -0400 Subject: [PATCH 2/4] retry and surface an error when progress polling fails --- .../hera/modules/console_updater.js.coffee | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/hera/modules/console_updater.js.coffee b/app/assets/javascripts/hera/modules/console_updater.js.coffee index c4fe1f960..350e99dfe 100644 --- a/app/assets/javascripts/hera/modules/console_updater.js.coffee +++ b/app/assets/javascripts/hera/modules/console_updater.js.coffee @@ -1,6 +1,8 @@ @ConsoleUpdater = jobId: '' parsing: false + failureCount: 0 + maxFailures: 5 updateConsole: -> unless ConsoleUpdater.parsing @@ -21,4 +23,12 @@ {item_id: ConsoleUpdater.jobId, after: after}, null, 'script' - ) + ).done(-> + ConsoleUpdater.failureCount = 0 + ).fail -> + ConsoleUpdater.failureCount += 1 + + if ConsoleUpdater.failureCount < ConsoleUpdater.maxFailures + setTimeout(ConsoleUpdater.updateConsole, 2000) + else + $('#console').append('

Lost connection while checking progress. Please refresh the page to check the current status.

') From 9c6f26beec63fbf9d70b191304337c1465d593da Mon Sep 17 00:00:00 2001 From: caitmich Date: Wed, 22 Jul 2026 13:19:02 -0400 Subject: [PATCH 3/4] add CHANGELOG entries for logs index and polling retry fixes --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 633cebfb1..4a6f8a0cf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,8 @@ - Upgraded gems: - rails-html-sanitizer, sqlite3, websocket-driver - Bugs fixes: + - Logs: index the logs table so progress lookups and cleanup stay fast as it grows + - Uploads/Exports: retry progress polling automatically after a failed request, and show an error if it keeps failing - [entity]: - [future tense verb] [bug fix] - Bug tracker items: From 5060e22950b288d2d342e80fa2855e1349cf6585 Mon Sep 17 00:00:00 2001 From: caitmich Date: Wed, 22 Jul 2026 13:52:04 -0400 Subject: [PATCH 4/4] explain why failureCount resets on every successful poll --- app/assets/javascripts/hera/modules/console_updater.js.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/hera/modules/console_updater.js.coffee b/app/assets/javascripts/hera/modules/console_updater.js.coffee index 350e99dfe..aed393f0c 100644 --- a/app/assets/javascripts/hera/modules/console_updater.js.coffee +++ b/app/assets/javascripts/hera/modules/console_updater.js.coffee @@ -24,6 +24,8 @@ null, 'script' ).done(-> + # Reset on every success so the cap only trips on consecutive failures, + # not ones accumulated over the whole polling session. ConsoleUpdater.failureCount = 0 ).fail -> ConsoleUpdater.failureCount += 1