Sha256: 0c45d08bef5629d60c9ca637e72d753e316235ce4f50fcab776e43d030c4a15b

Contents?: true

Size: 1.71 KB

Versions: 19

Compression:

Stored size: 1.71 KB

Contents

# -*- encoding: binary -*-

module Unicorn::Util

# :stopdoc:
  def self.is_log?(fp)
    append_flags = File::WRONLY | File::APPEND

    ! fp.closed? &&
      fp.sync &&
      fp.path[0] == ?/ &&
      (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags
    rescue IOError, Errno::EBADF
      false
  end

  def self.chown_logs(uid, gid)
    ObjectSpace.each_object(File) do |fp|
      fp.chown(uid, gid) if is_log?(fp)
    end
  end
# :startdoc:

  # This reopens ALL logfiles in the process that have been rotated
  # using logrotate(8) (without copytruncate) or similar tools.
  # A +File+ object is considered for reopening if it is:
  #   1) opened with the O_APPEND and O_WRONLY flags
  #   2) opened with an absolute path (starts with "/")
  #   3) the current open file handle does not match its original open path
  #   4) unbuffered (as far as userspace buffering goes, not O_SYNC)
  # Returns the number of files reopened
  def self.reopen_logs
    to_reopen = []
    nr = 0
    ObjectSpace.each_object(File) { |fp| is_log?(fp) and to_reopen << fp }

    to_reopen.each do |fp|
      orig_st = begin
        fp.stat
      rescue IOError, Errno::EBADF
        next
      end

      begin
        b = File.stat(fp.path)
        next if orig_st.ino == b.ino && orig_st.dev == b.dev
      rescue Errno::ENOENT
      end

      begin
        File.open(fp.path, 'a') { |tmpfp| fp.reopen(tmpfp) }
        fp.sync = true
        new_st = fp.stat

        # this should only happen in the master:
        if orig_st.uid != new_st.uid || orig_st.gid != new_st.gid
          fp.chown(orig_st.uid, orig_st.gid)
        end

        nr += 1
      rescue IOError, Errno::EBADF
        # not much we can do...
      end
    end
    nr
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
unicorn-3.5.0 lib/unicorn/util.rb
unicorn-3.4.0 lib/unicorn/util.rb
unicorn-3.3.1 lib/unicorn/util.rb
unicorn-3.3.0 lib/unicorn/util.rb
unicorn-3.2.1 lib/unicorn/util.rb
unicorn-3.1.0 lib/unicorn/util.rb
unicorn-3.0.1 lib/unicorn/util.rb
unicorn-3.0.0 lib/unicorn/util.rb
unicorn-3.0.0pre2 lib/unicorn/util.rb
unicorn-3.0.0pre1.9.g86d2 lib/unicorn/util.rb
unicorn-2.0.1 lib/unicorn/util.rb
unicorn-2.0.0.2.ga6d9 lib/unicorn/util.rb
unicorn-3.0.0pre1 lib/unicorn/util.rb
unicorn-2.0.0 lib/unicorn/util.rb
unicorn-2.0.0pre3 lib/unicorn/util.rb
unicorn-2.0.0pre2.4.gf202 lib/unicorn/util.rb
unicorn-2.0.0pre2.1.ge991 lib/unicorn/util.rb
unicorn-2.0.0pre2 lib/unicorn/util.rb
unicorn-2.0.0pre1 lib/unicorn/util.rb