Class: Unicorn::Util

Inherits:
Object
  • Object
show all
Defined in:
lib/unicorn/util.rb

Class Method Summary collapse

Class Method Details

.reopen_logsObject

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



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/unicorn/util.rb', line 18

def reopen_logs
  nr = 0
  append_flags = File::WRONLY | File::APPEND

  ObjectSpace.each_object(File) do |fp|
    next if fp.closed?
    next unless (fp.sync && fp.path[0..0] == "/")
    next unless (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags

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

    open_arg = 'a'
    if fp.respond_to?(:external_encoding) && enc = fp.external_encoding
      open_arg << ":#{enc.to_s}"
      enc = fp.internal_encoding and open_arg << ":#{enc.to_s}"
    end
    fp.reopen(fp.path, open_arg)
    fp.sync = true
    nr += 1
  end # each_object
  nr
end

.tmpioObject

creates and returns a new File object. The File is unlinked immediately, switched to binary mode, and userspace output buffering is disabled



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/unicorn/util.rb', line 48

def tmpio
  fp = begin
    File.open("#{Dir::tmpdir}/#{rand}",
              File::RDWR|File::CREAT|File::EXCL, 0600)
  rescue Errno::EEXIST
    retry
  end
  File.unlink(fp.path)
  fp.binmode
  fp.sync = true
  fp
end