From b3920fa2ee47ff1b7855288106cd82947f76d757 Mon Sep 17 00:00:00 2001 From: Dzmitry Plashchynski Date: Sat, 7 Mar 2015 16:35:53 +0200 Subject: [PATCH] Use Mutex to synchronize access to Job's log --- lib/crono/job.rb | 14 +++++++++++--- spec/job_spec.rb | 8 ++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/crono/job.rb b/lib/crono/job.rb index 2bfc7b3..0417f8a 100644 --- a/lib/crono/job.rb +++ b/lib/crono/job.rb @@ -15,6 +15,7 @@ module Crono self.performer, self.period = performer, period self.job_log = StringIO.new self.job_logger = Logger.new(job_log) + @log_semaphore = Mutex.new end def next @@ -41,7 +42,12 @@ module Crono end def save - model.update(last_performed_at: last_performed_at) + log = model.reload.log || "" + @log_semaphore.synchronize do + log << job_log.string + job_log.truncate(job_log.rewind) + end + model.update(last_performed_at: last_performed_at, log: log) end def load @@ -50,8 +56,10 @@ module Crono private def log(message) - logger.info message - job_logger.info message + @log_semaphore.synchronize do + logger.info message + job_logger.info message + end end def model diff --git a/spec/job_spec.rb b/spec/job_spec.rb index 432a216..6719488 100644 --- a/spec/job_spec.rb +++ b/spec/job_spec.rb @@ -45,6 +45,14 @@ describe Crono::Job do @crono_job = Crono::CronoJob.find_by(job_id: job.job_id) expect(@crono_job.last_performed_at.utc).to be_eql job.last_performed_at.utc end + + it "should save and truncate job log" do + message = "test message" + job.send(:log, message) + job.save + expect(job.send(:model).reload.log).to include message + expect(job.job_log.string).to be_empty + end end describe "#load" do