yahns 0.0.0TP1
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.
- 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: []
|