yahns 0.0.0TP1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/COPYING +674 -0
- data/GIT-VERSION-GEN +41 -0
- data/GNUmakefile +90 -0
- data/README +127 -0
- data/Rakefile +60 -0
- data/bin/yahns +32 -0
- data/examples/README +3 -0
- data/examples/init.sh +76 -0
- data/examples/logger_mp_safe.rb +28 -0
- data/examples/logrotate.conf +32 -0
- data/examples/yahns_multi.conf.rb +89 -0
- data/examples/yahns_rack_basic.conf.rb +27 -0
- data/lib/yahns.rb +73 -0
- data/lib/yahns/acceptor.rb +28 -0
- data/lib/yahns/client_expire.rb +40 -0
- data/lib/yahns/client_expire_portable.rb +39 -0
- data/lib/yahns/config.rb +344 -0
- data/lib/yahns/daemon.rb +51 -0
- data/lib/yahns/fdmap.rb +90 -0
- data/lib/yahns/http_client.rb +198 -0
- data/lib/yahns/http_context.rb +65 -0
- data/lib/yahns/http_response.rb +184 -0
- data/lib/yahns/log.rb +73 -0
- data/lib/yahns/queue.rb +7 -0
- data/lib/yahns/queue_egg.rb +23 -0
- data/lib/yahns/queue_epoll.rb +57 -0
- data/lib/yahns/rack.rb +80 -0
- data/lib/yahns/server.rb +336 -0
- data/lib/yahns/server_mp.rb +181 -0
- data/lib/yahns/sigevent.rb +7 -0
- data/lib/yahns/sigevent_efd.rb +18 -0
- data/lib/yahns/sigevent_pipe.rb +29 -0
- data/lib/yahns/socket_helper.rb +117 -0
- data/lib/yahns/stream_file.rb +34 -0
- data/lib/yahns/stream_input.rb +150 -0
- data/lib/yahns/tee_input.rb +114 -0
- data/lib/yahns/tmpio.rb +27 -0
- data/lib/yahns/wbuf.rb +36 -0
- data/lib/yahns/wbuf_common.rb +32 -0
- data/lib/yahns/worker.rb +58 -0
- data/test/covshow.rb +29 -0
- data/test/helper.rb +115 -0
- data/test/server_helper.rb +65 -0
- data/test/test_bin.rb +97 -0
- data/test/test_client_expire.rb +132 -0
- data/test/test_config.rb +56 -0
- data/test/test_fdmap.rb +19 -0
- data/test/test_output_buffering.rb +291 -0
- data/test/test_queue.rb +59 -0
- data/test/test_rack.rb +28 -0
- data/test/test_serve_static.rb +42 -0
- data/test/test_server.rb +415 -0
- data/test/test_stream_file.rb +30 -0
- data/test/test_wbuf.rb +136 -0
- data/yahns.gemspec +19 -0
- metadata +165 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
|
2
|
+
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
|
+
require_relative 'helper'
|
4
|
+
require 'timeout'
|
5
|
+
|
6
|
+
class TestStreamFile < Testcase
|
7
|
+
parallelize_me!
|
8
|
+
DevFD = Struct.new(:to_path)
|
9
|
+
|
10
|
+
def test_stream_file
|
11
|
+
fp = File.open("COPYING")
|
12
|
+
sf = Yahns::StreamFile.new(fp, true, 0, fp.stat.size)
|
13
|
+
refute sf.respond_to?(:close)
|
14
|
+
sf.wbuf_close(nil)
|
15
|
+
assert fp.closed?
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_fd
|
19
|
+
fp = File.open("COPYING")
|
20
|
+
obj = DevFD.new("/dev/fd/#{fp.fileno}")
|
21
|
+
sf = Yahns::StreamFile.new(obj, true, 0, fp.stat.size)
|
22
|
+
io = sf.instance_variable_get :@tmpio
|
23
|
+
assert_instance_of IO, io.to_io
|
24
|
+
assert_equal fp.fileno, io.fileno
|
25
|
+
refute sf.respond_to?(:close)
|
26
|
+
sf.wbuf_close(nil)
|
27
|
+
refute fp.closed?
|
28
|
+
refute io.closed?
|
29
|
+
end
|
30
|
+
end
|
data/test/test_wbuf.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
|
2
|
+
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
|
+
require_relative 'helper'
|
4
|
+
require 'timeout'
|
5
|
+
|
6
|
+
class TestWbuf < Testcase
|
7
|
+
parallelize_me!
|
8
|
+
|
9
|
+
def test_wbuf
|
10
|
+
buf = "*" * (16384 * 2)
|
11
|
+
nr = 1000
|
12
|
+
[ true, false ].each do |persist|
|
13
|
+
wbuf = Yahns::Wbuf.new([], persist)
|
14
|
+
a, b = UNIXSocket.pair
|
15
|
+
assert_nil wbuf.wbuf_write(a, "HIHI")
|
16
|
+
assert_equal "HIHI", b.read(4)
|
17
|
+
nr.times { wbuf.wbuf_write(a, buf) }
|
18
|
+
assert_equal :wait_writable, wbuf.wbuf_flush(a)
|
19
|
+
done = IO.pipe
|
20
|
+
thr = Thread.new do
|
21
|
+
rv = []
|
22
|
+
until rv[-1] == persist
|
23
|
+
IO.select(nil, [a])
|
24
|
+
tmp = wbuf.wbuf_flush(a)
|
25
|
+
rv << tmp
|
26
|
+
end
|
27
|
+
done[1].syswrite '.'
|
28
|
+
rv
|
29
|
+
end
|
30
|
+
|
31
|
+
wait = true
|
32
|
+
begin
|
33
|
+
if wait
|
34
|
+
r = IO.select([b,done[0]], nil, nil, 5)
|
35
|
+
end
|
36
|
+
b.read_nonblock((rand * 1024) + 666, buf)
|
37
|
+
wait = (r[0] & done).empty?
|
38
|
+
rescue Errno::EAGAIN
|
39
|
+
break
|
40
|
+
end while true
|
41
|
+
|
42
|
+
assert_equal thr, thr.join(5)
|
43
|
+
rv = thr.value
|
44
|
+
assert_equal persist, rv.pop
|
45
|
+
assert(rv.all? { |x| x == :wait_writable })
|
46
|
+
a.close
|
47
|
+
b.close
|
48
|
+
done.each { |io| io.close }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_wbuf_blocked
|
53
|
+
a, b = UNIXSocket.pair
|
54
|
+
buf = "." * 4096
|
55
|
+
4.times do
|
56
|
+
begin
|
57
|
+
a.write_nonblock(buf)
|
58
|
+
rescue Errno::EAGAIN
|
59
|
+
break
|
60
|
+
end while true
|
61
|
+
end
|
62
|
+
wbuf = Yahns::Wbuf.new([], true)
|
63
|
+
assert_equal :wait_writable, wbuf.wbuf_write(a, buf)
|
64
|
+
assert_equal :wait_writable, wbuf.wbuf_flush(a)
|
65
|
+
|
66
|
+
# drain the buffer
|
67
|
+
Timeout.timeout(10) { b.read(b.nread) until b.nread == 0 }
|
68
|
+
|
69
|
+
# b.nread will increase after this
|
70
|
+
assert_nil wbuf.wbuf_write(a, "HI")
|
71
|
+
nr = b.nread
|
72
|
+
assert_operator nr, :>, 0
|
73
|
+
assert_equal b, IO.select([b], nil, nil, 5)[0][0]
|
74
|
+
b.read(nr - 2) if nr > 2
|
75
|
+
assert_equal b, IO.select([b], nil, nil, 5)[0][0]
|
76
|
+
assert_equal "HI", b.read(2)
|
77
|
+
begin
|
78
|
+
wbuf.wbuf_flush(a)
|
79
|
+
assert false
|
80
|
+
rescue => e
|
81
|
+
end
|
82
|
+
assert_match(%r{BUG: EOF on tmpio}, e.message)
|
83
|
+
ensure
|
84
|
+
a.close
|
85
|
+
b.close
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_wbuf_flush_close
|
89
|
+
pipe = IO.pipe
|
90
|
+
persist = true
|
91
|
+
wbuf = Yahns::Wbuf.new(pipe[0], persist)
|
92
|
+
refute wbuf.respond_to?(:close) # we don't want this for HttpResponse body
|
93
|
+
sp = UNIXSocket.pair
|
94
|
+
rv = nil
|
95
|
+
|
96
|
+
buf = ("*" * 16384) << "\n"
|
97
|
+
thr = Thread.new do
|
98
|
+
1000.times { pipe[1].write(buf) }
|
99
|
+
pipe[1].close
|
100
|
+
end
|
101
|
+
|
102
|
+
pipe[0].each { |chunk| rv = wbuf.wbuf_write(sp[1], chunk) }
|
103
|
+
assert_equal thr, thr.join(5)
|
104
|
+
assert_equal :wait_writable, rv
|
105
|
+
|
106
|
+
done = IO.pipe
|
107
|
+
thr = Thread.new do
|
108
|
+
rv = []
|
109
|
+
until rv[-1] == persist
|
110
|
+
IO.select(nil, [sp[1]])
|
111
|
+
rv << wbuf.wbuf_flush(sp[1])
|
112
|
+
end
|
113
|
+
done[1].syswrite '.'
|
114
|
+
rv
|
115
|
+
end
|
116
|
+
|
117
|
+
wait = true
|
118
|
+
begin
|
119
|
+
if wait
|
120
|
+
r = IO.select([sp[0],done[0]], nil, nil, 5)
|
121
|
+
end
|
122
|
+
sp[0].read_nonblock(16384, buf)
|
123
|
+
wait = (r[0] & done).empty?
|
124
|
+
rescue Errno::EAGAIN
|
125
|
+
break
|
126
|
+
end while true
|
127
|
+
|
128
|
+
assert_equal thr, thr.join(5)
|
129
|
+
rv = thr.value
|
130
|
+
assert_equal true, rv.pop
|
131
|
+
assert rv.all? { |x| x == :wait_writable }
|
132
|
+
assert pipe[0].closed?
|
133
|
+
sp.each(&:close)
|
134
|
+
done.each(&:close)
|
135
|
+
end
|
136
|
+
end
|
data/yahns.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
|
2
|
+
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
manifest = File.read('.gem-manifest').split(/\n/)
|
5
|
+
s.name = %q{yahns}
|
6
|
+
s.version = ENV["VERSION"]
|
7
|
+
s.authors = ["#{name} hackers"]
|
8
|
+
s.summary = "sleepy, multi-threaded, non-blocking application server"
|
9
|
+
s.description = File.read("README").split(/\n\n/)[1].strip
|
10
|
+
s.email = %q{yahns@yhbt.net}
|
11
|
+
s.executables = manifest.grep(%r{\Abin/}).map { |s| s.sub(%r{\Abin/}, "") }
|
12
|
+
s.files = manifest
|
13
|
+
s.add_dependency(%q<kgio>, '~> 2.8')
|
14
|
+
s.add_dependency(%q<sleepy_penguin>, '~> 3.2')
|
15
|
+
s.add_dependency(%q<sendfile>, '~> 1.2.1')
|
16
|
+
s.add_dependency(%q<unicorn>, '~> 4.6.3')
|
17
|
+
s.homepage = "http://yahns.yhbt.net/README"
|
18
|
+
s.licenses = "GPLv3+"
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yahns
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0TP1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gem::Specification hackers
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: kgio
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sleepy_penguin
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sendfile
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.2.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.2.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: unicorn
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 4.6.3
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 4.6.3
|
69
|
+
description: |-
|
70
|
+
A Free Software, multi-threaded, non-blocking network application server
|
71
|
+
designed for low _idle_ power consumption. It is primarily optimized
|
72
|
+
for applications with occasional users which see little or no traffic.
|
73
|
+
yahns currently hosts Rack/HTTP applications, but may eventually support
|
74
|
+
other application types. Unlike some existing servers, yahns is
|
75
|
+
extremely sensitive to fatal bugs in the applications it hosts.
|
76
|
+
email: yahns@yhbt.net
|
77
|
+
executables:
|
78
|
+
- yahns
|
79
|
+
extensions: []
|
80
|
+
extra_rdoc_files: []
|
81
|
+
files:
|
82
|
+
- .gitignore
|
83
|
+
- COPYING
|
84
|
+
- GIT-VERSION-FILE
|
85
|
+
- GIT-VERSION-GEN
|
86
|
+
- GNUmakefile
|
87
|
+
- NEWS
|
88
|
+
- README
|
89
|
+
- Rakefile
|
90
|
+
- bin/yahns
|
91
|
+
- examples/README
|
92
|
+
- examples/init.sh
|
93
|
+
- examples/logger_mp_safe.rb
|
94
|
+
- examples/logrotate.conf
|
95
|
+
- examples/yahns_multi.conf.rb
|
96
|
+
- examples/yahns_rack_basic.conf.rb
|
97
|
+
- lib/yahns.rb
|
98
|
+
- lib/yahns/acceptor.rb
|
99
|
+
- lib/yahns/client_expire.rb
|
100
|
+
- lib/yahns/client_expire_portable.rb
|
101
|
+
- lib/yahns/config.rb
|
102
|
+
- lib/yahns/daemon.rb
|
103
|
+
- lib/yahns/fdmap.rb
|
104
|
+
- lib/yahns/http_client.rb
|
105
|
+
- lib/yahns/http_context.rb
|
106
|
+
- lib/yahns/http_response.rb
|
107
|
+
- lib/yahns/log.rb
|
108
|
+
- lib/yahns/queue.rb
|
109
|
+
- lib/yahns/queue_egg.rb
|
110
|
+
- lib/yahns/queue_epoll.rb
|
111
|
+
- lib/yahns/rack.rb
|
112
|
+
- lib/yahns/server.rb
|
113
|
+
- lib/yahns/server_mp.rb
|
114
|
+
- lib/yahns/sigevent.rb
|
115
|
+
- lib/yahns/sigevent_efd.rb
|
116
|
+
- lib/yahns/sigevent_pipe.rb
|
117
|
+
- lib/yahns/socket_helper.rb
|
118
|
+
- lib/yahns/stream_file.rb
|
119
|
+
- lib/yahns/stream_input.rb
|
120
|
+
- lib/yahns/tee_input.rb
|
121
|
+
- lib/yahns/tmpio.rb
|
122
|
+
- lib/yahns/version.rb
|
123
|
+
- lib/yahns/wbuf.rb
|
124
|
+
- lib/yahns/wbuf_common.rb
|
125
|
+
- lib/yahns/worker.rb
|
126
|
+
- test/covshow.rb
|
127
|
+
- test/helper.rb
|
128
|
+
- test/server_helper.rb
|
129
|
+
- test/test_bin.rb
|
130
|
+
- test/test_client_expire.rb
|
131
|
+
- test/test_config.rb
|
132
|
+
- test/test_fdmap.rb
|
133
|
+
- test/test_output_buffering.rb
|
134
|
+
- test/test_queue.rb
|
135
|
+
- test/test_rack.rb
|
136
|
+
- test/test_serve_static.rb
|
137
|
+
- test/test_server.rb
|
138
|
+
- test/test_stream_file.rb
|
139
|
+
- test/test_wbuf.rb
|
140
|
+
- yahns.gemspec
|
141
|
+
homepage: http://yahns.yhbt.net/README
|
142
|
+
licenses:
|
143
|
+
- GPLv3+
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - '>'
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: 1.3.1
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.1.3
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: sleepy, multi-threaded, non-blocking application server
|
165
|
+
test_files: []
|