From 95ed081663af63b688f5094d2c454adb4e64f63f Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 14 Dec 2013 05:43:01 +0000 Subject: logger.rb: fix extra log ratation * lib/logger.rb (lock_shift_log): no need to rotate the log file if it has been rotated by another process. based on the patch by no6v (Nobuhiro IMAI) in [ruby-core:58620]. [Bug #9133] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44203 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/logger.rb | 3 +-- test/logger/test_logger.rb | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a85e907cd..c5768ae4ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat Dec 14 14:42:53 2013 Nobuyoshi Nakada + + * lib/logger.rb (lock_shift_log): no need to rotate the log file + if it has been rotated by another process. based on the patch + by no6v (Nobuhiro IMAI) in [ruby-core:58620]. [Bug #9133] + Sat Dec 14 13:01:45 2013 Nobuyoshi Nakada * proc.c (mnew_from_me): method by respond_to_missing? should be diff --git a/lib/logger.rb b/lib/logger.rb index c70b091469..3c50cb2313 100644 --- a/lib/logger.rb +++ b/lib/logger.rb @@ -644,8 +644,7 @@ private begin File.open(@filename, File::WRONLY | File::APPEND) do |lock| lock.flock(File::LOCK_EX) # inter-process locking. will be unlocked at closing file - ino = lock.stat.ino - if ino == File.stat(@filename).ino + if File.identical?(@filename, lock) and File.identical?(lock, @dev) yield # log shifting else # log shifted by another process (i-node before locking and i-node after locking are different) diff --git a/test/logger/test_logger.rb b/test/logger/test_logger.rb index 04bf779538..eda6484a56 100644 --- a/test/logger/test_logger.rb +++ b/test/logger/test_logger.rb @@ -2,6 +2,7 @@ require 'test/unit' require 'logger' require 'tempfile' +require 'tmpdir' require_relative '../ruby/envutil' @@ -542,6 +543,44 @@ class TestLogDevice < Test::Unit::TestCase end end + def test_shifting_size_not_rotate_too_much + d(@filename).__send__(:add_log_header, @tempfile) + header_size = @tempfile.size + message = "*" * 99 + "\n" + shift_size = header_size + message.size * 3 - 1 + opt = {shift_age: 1, shift_size: shift_size} + + Dir.mktmpdir do |tmpdir| + begin + log = File.join(tmpdir, "log") + logdev1 = d(log, opt) + logdev2 = d(log, opt) + + assert_file.identical?(log, logdev1.dev) + assert_file.identical?(log, logdev2.dev) + + 3.times{logdev1.write(message)} + assert_file.identical?(log, logdev1.dev) + assert_file.identical?(log, logdev2.dev) + + logdev1.write(message) + assert_file.identical?(log, logdev1.dev) + assert_file.identical?(log + ".0", logdev2.dev) + + logdev2.write(message) + assert_file.identical?(log, logdev1.dev) + assert_file.identical?(log, logdev2.dev) + + logdev1.write(message) + assert_file.identical?(log, logdev1.dev) + assert_file.identical?(log, logdev2.dev) + ensure + logdev1.close if logdev1 + logdev2.close if logdev2 + end + end + end + private def run_children(n, args, src) -- cgit v1.2.3