Skip to content

Commit aec4f93

Browse files
authored
Merge pull request #12998 from demarche-numerique/faster_stalled_declarative_procedure_job
Tech: accélère le stalled_declarative_procedure_job
2 parents 74952b9 + 751171f commit aec4f93

4 files changed

Lines changed: 59 additions & 6 deletions

File tree

app/jobs/cron/stalled_declarative_procedures_job.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ class Cron::StalledDeclarativeProceduresJob < Cron::CronJob
44
self.schedule_expression = "every 10 minutes"
55

66
def perform
7-
Procedure.declarative.find_each do |procedure|
8-
procedure.dossiers.state_en_construction.where(declarative_triggered_at: nil).find_each do |dossier|
9-
ProcessStalledDeclarativeDossierJob.perform_later(dossier)
10-
end
11-
end
7+
recent_or_open = Procedure.where(aasm_state: [:publiee, :depubliee])
8+
.or(Procedure.where(closed_at: 24.hours.ago..))
9+
10+
Dossier.state_en_construction
11+
.where(declarative_triggered_at: nil)
12+
.joins(:procedure).merge(Procedure.declarative.merge(recent_or_open))
13+
.find_each { ProcessStalledDeclarativeDossierJob.perform_later(it) }
1214
end
1315
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# frozen_string_literal: true
2+
3+
class AddPartialIndexForStalledDeclarativeDossiers < ActiveRecord::Migration[7.2]
4+
disable_ddl_transaction!
5+
6+
def change
7+
add_index :dossiers,
8+
:revision_id,
9+
name: 'index_dossiers_stalled_declarative',
10+
where: "state = 'en_construction' AND declarative_triggered_at IS NULL",
11+
algorithm: :concurrently,
12+
if_not_exists: true
13+
end
14+
end

db/schema.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#
1313
# It's strongly recommended that you check this file into your version control system.
1414

15-
ActiveRecord::Schema[7.2].define(version: 2026_04_07_120000) do
15+
ActiveRecord::Schema[7.2].define(version: 2026_04_21_120000) do
1616
# These are extensions that must be enabled in order to support this database
1717
enable_extension "pg_buffercache"
1818
enable_extension "pg_stat_statements"
@@ -564,6 +564,7 @@
564564
t.index ["parent_dossier_id"], name: "index_dossiers_on_parent_dossier_id"
565565
t.index ["prefill_token"], name: "index_dossiers_on_prefill_token", unique: true
566566
t.index ["revision_id"], name: "index_dossiers_on_revision_id"
567+
t.index ["revision_id"], name: "index_dossiers_stalled_declarative", where: "(((state)::text = 'en_construction'::text) AND (declarative_triggered_at IS NULL))"
567568
t.index ["state"], name: "index_dossiers_on_state"
568569
t.index ["user_id"], name: "index_dossiers_on_user_id"
569570
end

spec/jobs/cron/stalled_declarative_procedures_job_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,41 @@
4545
expect(ProcessStalledDeclarativeDossierJob).not_to have_been_enqueued
4646
}
4747
end
48+
49+
context "declarative procedure in brouillon" do
50+
let(:procedure) { create(:procedure, :for_individual, :with_instructeur, declarative_with_state: Dossier.states.fetch(:en_instruction)) }
51+
52+
it {
53+
perform_job
54+
expect(ProcessStalledDeclarativeDossierJob).not_to have_been_enqueued.with(en_construction)
55+
}
56+
end
57+
58+
context "declarative procedure recently closed" do
59+
let(:procedure) { create(:procedure, :closed, :for_individual, :with_instructeur, declarative_with_state: Dossier.states.fetch(:en_instruction), closed_at: 1.hour.ago) }
60+
61+
it {
62+
perform_job
63+
expect(ProcessStalledDeclarativeDossierJob).to have_been_enqueued.with(en_construction)
64+
}
65+
end
66+
67+
context "declarative procedure closed more than 24h ago" do
68+
let(:procedure) { create(:procedure, :closed, :for_individual, :with_instructeur, declarative_with_state: Dossier.states.fetch(:en_instruction), closed_at: 2.days.ago) }
69+
70+
it {
71+
perform_job
72+
expect(ProcessStalledDeclarativeDossierJob).not_to have_been_enqueued.with(en_construction)
73+
}
74+
end
75+
76+
context "declarative procedure depubliee" do
77+
let(:procedure) { create(:procedure, :unpublished, :for_individual, :with_instructeur, declarative_with_state: Dossier.states.fetch(:en_instruction)) }
78+
79+
it {
80+
perform_job
81+
expect(ProcessStalledDeclarativeDossierJob).to have_been_enqueued.with(en_construction)
82+
}
83+
end
4884
end
4985
end

0 commit comments

Comments
 (0)