From d61ed8028728439e8a36173e28eae252e8444560 Mon Sep 17 00:00:00 2001 From: Jacob Cody Wimer Date: Mon, 15 Sep 2025 18:22:42 -0400 Subject: [PATCH] Reload last_match and wrestler in advanced_wrestler. Moved calculate team score to the end of advance_wrestler. --- app/jobs/advance_wrestler_job.rb | 5 ----- app/models/match.rb | 20 ++++++++++++------- .../bracket_advancement/advance_wrestler.rb | 4 +++- lib/tasks/finish_tournament_204.rake | 8 +++++--- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/app/jobs/advance_wrestler_job.rb b/app/jobs/advance_wrestler_job.rb index 7cb2acd..e73d590 100644 --- a/app/jobs/advance_wrestler_job.rb +++ b/app/jobs/advance_wrestler_job.rb @@ -2,11 +2,6 @@ class AdvanceWrestlerJob < ApplicationJob queue_as :default def perform(wrestler, match) - # Add a small delay to increase chance of transaction commit - # without this some matches were getting a deserialization error when running the rake task - # to finish tournaments - sleep(0.5) unless Rails.env.test? - # Get tournament from wrestler tournament = wrestler.tournament diff --git a/app/models/match.rb b/app/models/match.rb index 2b27b6a..4dd23fc 100644 --- a/app/models/match.rb +++ b/app/models/match.rb @@ -10,12 +10,17 @@ class Match < ApplicationRecord # Callback to update finished_at when a match is finished before_save :update_finished_at - after_update :after_finished_actions, if: -> { - saved_change_to_finished? || - saved_change_to_winner_id? || - saved_change_to_win_type? || - saved_change_to_score? || - saved_change_to_overtime_type? + # Enqueue advancement and related actions after the DB transaction has committed. + # Using after_commit ensures any background jobs enqueued inside these callbacks + # will see the committed state of the match (e.g. finished == 1). Enqueuing + # jobs from after_update can cause jobs to run before the transaction commits, + # which leads to jobs observing stale data and not performing advancement. + after_commit :after_finished_actions, on: :update, if: -> { + saved_change_to_finished? || + saved_change_to_winner_id? || + saved_change_to_win_type? || + saved_change_to_score? || + saved_change_to_overtime_type? } def after_finished_actions @@ -30,7 +35,8 @@ class Match < ApplicationRecord self.mat.assign_next_match end advance_wrestlers - calculate_school_points + # School point calculation has move to the end of advance wrestler + # calculate_school_points end end diff --git a/app/services/bracket_advancement/advance_wrestler.rb b/app/services/bracket_advancement/advance_wrestler.rb index 09e401a..d2587a1 100644 --- a/app/services/bracket_advancement/advance_wrestler.rb +++ b/app/services/bracket_advancement/advance_wrestler.rb @@ -12,12 +12,14 @@ class AdvanceWrestler end def advance_raw - + @last_match.reload + @wrestler.reload if @last_match && @last_match.finished? pool_to_bracket_advancement if @tournament.tournament_type == "Pool to bracket" ModifiedDoubleEliminationAdvance.new(@wrestler, @last_match).bracket_advancement if @tournament.tournament_type.include? "Modified 16 Man Double Elimination" DoubleEliminationAdvance.new(@wrestler, @last_match).bracket_advancement if @tournament.tournament_type.include? "Regular Double Elimination" end + @wrestler.school.calculate_score end def pool_to_bracket_advancement diff --git a/lib/tasks/finish_tournament_204.rake b/lib/tasks/finish_tournament_204.rake index 22776d5..bae3d20 100644 --- a/lib/tasks/finish_tournament_204.rake +++ b/lib/tasks/finish_tournament_204.rake @@ -31,14 +31,14 @@ namespace :tournament do while @tournament.reload.curently_generating_matches == 1 puts "Waiting for tournament to finish generating matches..." sleep(5) + @tournament.reload end @tournament.reload # Ensure matches association is fresh before iterating @tournament.matches.sort_by(&:bout_number).each do |match| - match.reload - if match.loser1_name != "BYE" and match.loser2_name != "BYE" + if match.reload.loser1_name != "BYE" and match.reload.loser2_name != "BYE" && match.reload.finished != 1 # Wait until both wrestlers are assigned - while match.w1.nil? || match.w2.nil? + while (match.w1.nil? || match.w2.nil?) puts "Waiting for wrestlers in match #{match.bout_number}..." sleep(5) # Wait for 5 seconds before checking again match.reload @@ -77,6 +77,8 @@ namespace :tournament do # Mark match as finished match.finished = 1 match.save! + # sleep to prevent mysql locks when assign_next_match to a mat runs + sleep(0.5) end end end