raindrops 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/GIT-VERSION-GEN +1 -1
- data/lib/raindrops/linux.rb +19 -5
- data/lib/raindrops/middleware/proxy.rb +1 -1
- data/lib/raindrops/watcher.rb +8 -2
- data/test/test_linux.rb +39 -0
- data/test/test_watcher.rb +1 -0
- metadata +4 -4
data/GIT-VERSION-GEN
CHANGED
data/lib/raindrops/linux.rb
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
# Instead of snapshotting, Raindrops::Aggregate::LastDataRecv may be used
|
9
9
|
# to aggregate statistics from +all+ accepted sockets as they arrive
|
10
10
|
# based on the +last_data_recv+ field in Raindrops::TCP_Info
|
11
|
+
require 'pathname'
|
12
|
+
|
11
13
|
module Raindrops::Linux
|
12
14
|
|
13
15
|
# The standard proc path for active UNIX domain sockets, feel free to call
|
@@ -42,18 +44,30 @@ module Raindrops::Linux
|
|
42
44
|
paths = paths.map do |path|
|
43
45
|
path = path.dup
|
44
46
|
path.force_encoding(Encoding::BINARY) if defined?(Encoding)
|
45
|
-
|
47
|
+
if File.symlink?(path)
|
48
|
+
link = path
|
49
|
+
path = Pathname.new(link).realpath.to_s
|
50
|
+
rv[link] = rv[path] # vivify ListenerStats
|
51
|
+
else
|
52
|
+
rv[path] # vivify ListenerStats
|
53
|
+
end
|
46
54
|
Regexp.escape(path)
|
47
55
|
end
|
48
56
|
end
|
49
|
-
paths = /^\w+: \d+ \d+
|
57
|
+
paths = /^\w+: \d+ \d+ (\d+) \d+ (\d+)\s+\d+ (#{paths.join('|')})$/n
|
50
58
|
|
51
59
|
# no point in pread since we can't stat for size on this file
|
52
60
|
File.read(*PROC_NET_UNIX_ARGS).scan(paths) do |s|
|
53
61
|
path = s[-1]
|
54
|
-
case s[0]
|
55
|
-
when
|
56
|
-
|
62
|
+
case s[0]
|
63
|
+
when "00000000" # client sockets
|
64
|
+
case s[1].to_i
|
65
|
+
when 2 then rv[path].queued += 1
|
66
|
+
when 3 then rv[path].active += 1
|
67
|
+
end
|
68
|
+
else
|
69
|
+
# listeners, vivify empty stats
|
70
|
+
rv[path]
|
57
71
|
end
|
58
72
|
end
|
59
73
|
|
data/lib/raindrops/watcher.rb
CHANGED
@@ -143,8 +143,12 @@ class Raindrops::Watcher
|
|
143
143
|
def call(env)
|
144
144
|
@start.synchronize { @thr ||= aggregator_thread(env["rack.logger"]) }
|
145
145
|
case env["REQUEST_METHOD"]
|
146
|
-
when "
|
146
|
+
when "GET"
|
147
147
|
get env
|
148
|
+
when "HEAD"
|
149
|
+
r = get(env)
|
150
|
+
r[2] = []
|
151
|
+
r
|
148
152
|
when "POST"
|
149
153
|
post env
|
150
154
|
else
|
@@ -337,7 +341,9 @@ class Raindrops::Watcher
|
|
337
341
|
"<table><tr>" \
|
338
342
|
"<th>address</th><th>active</th><th>queued</th><th>reset</th>" \
|
339
343
|
"</tr>" <<
|
340
|
-
all.
|
344
|
+
all.sort do |a,b|
|
345
|
+
a[0] <=> b[0] # sort by addr
|
346
|
+
end.map do |addr,stats|
|
341
347
|
e_addr = escape addr
|
342
348
|
"<tr>" \
|
343
349
|
"<td><a href='/tail/#{e_addr}.txt' " \
|
data/test/test_linux.rb
CHANGED
@@ -67,6 +67,45 @@ class TestLinux < Test::Unit::TestCase
|
|
67
67
|
assert_equal 1, stats[tmp.path].queued
|
68
68
|
end
|
69
69
|
|
70
|
+
def test_unix_all_unused
|
71
|
+
tmp = Tempfile.new("\xde\xad\xbe\xef") # valid path, really :)
|
72
|
+
File.unlink(tmp.path)
|
73
|
+
us = UNIXServer.new(tmp.path)
|
74
|
+
stats = unix_listener_stats
|
75
|
+
assert stats.keys.include?(tmp.path), stats.inspect
|
76
|
+
|
77
|
+
assert_equal 0, stats[tmp.path].active
|
78
|
+
assert_equal 0, stats[tmp.path].queued
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_unix_resolves_symlinks
|
82
|
+
tmp = Tempfile.new("\xde\xad\xbe\xef") # valid path, really :)
|
83
|
+
File.unlink(tmp.path)
|
84
|
+
us = UNIXServer.new(tmp.path)
|
85
|
+
|
86
|
+
# Create a symlink
|
87
|
+
link = Tempfile.new("somethingelse")
|
88
|
+
File.unlink(link.path) # We need an available name, not an actual file
|
89
|
+
File.symlink(tmp.path, link.path)
|
90
|
+
|
91
|
+
@to_close << UNIXSocket.new(tmp.path)
|
92
|
+
stats = unix_listener_stats
|
93
|
+
assert_equal 0, stats[tmp.path].active
|
94
|
+
assert_equal 1, stats[tmp.path].queued
|
95
|
+
|
96
|
+
@to_close << UNIXSocket.new(link.path)
|
97
|
+
stats = unix_listener_stats([link.path])
|
98
|
+
assert_equal 0, stats[link.path].active
|
99
|
+
assert_equal 2, stats[link.path].queued
|
100
|
+
|
101
|
+
assert_equal stats[link.path].object_id, stats[tmp.path].object_id
|
102
|
+
|
103
|
+
@to_close << us.accept
|
104
|
+
stats = unix_listener_stats
|
105
|
+
assert_equal 1, stats[tmp.path].active
|
106
|
+
assert_equal 1, stats[tmp.path].queued
|
107
|
+
end
|
108
|
+
|
70
109
|
def test_tcp
|
71
110
|
s = TCPServer.new(TEST_ADDR, 0)
|
72
111
|
port = s.addr[1]
|
data/test/test_watcher.rb
CHANGED
@@ -156,6 +156,7 @@ class TestWatcher < Test::Unit::TestCase
|
|
156
156
|
@ios << @srv.accept
|
157
157
|
assert_raises(Errno::EAGAIN) { @srv.accept_nonblock }
|
158
158
|
sleep 0.1
|
159
|
+
env = @req.class.env_for "/queued/#@addr.txt"
|
159
160
|
status, headers, body = @app.call(env.dup)
|
160
161
|
assert headers["X-Last-Peak-At"], headers.inspect
|
161
162
|
assert_nothing_raised { Time.parse(headers["X-Last-Peak-At"]) }
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raindrops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 55
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 10
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.10.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- raindrops hackers
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-06-19 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: bundler
|