From 848bc367c3d9a220751c345662cc5579cac60c7d Mon Sep 17 00:00:00 2001 From: Eugene Burmakin Date: Fri, 29 Aug 2025 14:57:24 +0200 Subject: [PATCH] Make tracks generation system live --- app/jobs/tracks/daily_generation_job.rb | 46 +++++++++++++++++++ app/models/point.rb | 6 +-- app/services/tracks/incremental_processor.rb | 2 +- ...0250704185707_create_tracks_from_points.rb | 2 +- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 app/jobs/tracks/daily_generation_job.rb diff --git a/app/jobs/tracks/daily_generation_job.rb b/app/jobs/tracks/daily_generation_job.rb new file mode 100644 index 00000000..275d0cfa --- /dev/null +++ b/app/jobs/tracks/daily_generation_job.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +# Daily job to handle bulk track processing for users with recent activity +# This serves as a backup to incremental processing and handles any missed tracks +class Tracks::DailyGenerationJob < ApplicationJob + queue_as :tracks + + def perform + Rails.logger.info "Starting daily track generation for users with recent activity" + + users_with_recent_activity.find_each do |user| + process_user_tracks(user) + end + + Rails.logger.info "Completed daily track generation" + end + + private + + def users_with_recent_activity + # Find users who have created points in the last 2 days + # This gives buffer to handle cross-day tracks + User.joins(:points) + .where(points: { created_at: 2.days.ago..Time.current }) + .distinct + end + + def process_user_tracks(user) + # Process tracks for the last 2 days with buffer + start_at = 3.days.ago.beginning_of_day # Extra buffer for cross-day tracks + end_at = Time.current + + Rails.logger.info "Enqueuing daily track generation for user #{user.id}" + + Tracks::ParallelGeneratorJob.perform_later( + user.id, + start_at: start_at, + end_at: end_at, + mode: :daily, + chunk_size: 6.hours # Smaller chunks for recent data processing + ) + rescue StandardError => e + Rails.logger.error "Failed to enqueue daily track generation for user #{user.id}: #{e.message}" + ExceptionReporter.call(e, "Daily track generation failed for user #{user.id}") + end +end \ No newline at end of file diff --git a/app/models/point.rb b/app/models/point.rb index 69e87681..157c82bc 100644 --- a/app/models/point.rb +++ b/app/models/point.rb @@ -33,8 +33,8 @@ class Point < ApplicationRecord after_create :async_reverse_geocode, if: -> { DawarichSettings.store_geodata? && !reverse_geocoded? } after_create :set_country after_create_commit :broadcast_coordinates - # after_create_commit :trigger_incremental_track_generation, if: -> { import_id.nil? } - # after_commit :recalculate_track, on: :update, if: -> { track.present? } + after_create_commit :trigger_incremental_track_generation, if: -> { import_id.nil? } + after_commit :recalculate_track, on: :update, if: -> { track.present? } def self.without_raw_data select(column_names - ['raw_data']) @@ -103,6 +103,6 @@ class Point < ApplicationRecord end def trigger_incremental_track_generation - Tracks::IncrementalCheckJob.perform_later(user.id, id) + Tracks::IncrementalProcessor.new(user, self).call end end diff --git a/app/services/tracks/incremental_processor.rb b/app/services/tracks/incremental_processor.rb index f02305a8..fdbed01a 100644 --- a/app/services/tracks/incremental_processor.rb +++ b/app/services/tracks/incremental_processor.rb @@ -36,7 +36,7 @@ class Tracks::IncrementalProcessor start_at = find_start_time end_at = find_end_time - Tracks::CreateJob.perform_later(user.id, start_at:, end_at:, mode: :incremental) + Tracks::ParallelGeneratorJob.perform_later(user.id, start_at:, end_at:, mode: :incremental) end private diff --git a/db/data/20250704185707_create_tracks_from_points.rb b/db/data/20250704185707_create_tracks_from_points.rb index 2972eac4..9f5b9b92 100644 --- a/db/data/20250704185707_create_tracks_from_points.rb +++ b/db/data/20250704185707_create_tracks_from_points.rb @@ -15,7 +15,7 @@ class CreateTracksFromPoints < ActiveRecord::Migration[8.0] # Use explicit parameters for bulk historical processing: # - No time limits (start_at: nil, end_at: nil) = process ALL historical data - Tracks::CreateJob.perform_later( + Tracks::ParallelGeneratorJob.perform_later( user.id, start_at: nil, end_at: nil,