ernie 0.3.3 → 0.3.4
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/README.md +2 -4
- data/VERSION.yml +1 -1
- data/elib/ernie_server.erl +10 -5
- data/ernie.gemspec +2 -2
- data/examples/calc.rb +16 -0
- data/lib/ernie.rb +10 -1
- data/test/load.rb +8 -4
- metadata +2 -2
data/README.md
CHANGED
@@ -23,10 +23,7 @@ Installation
|
|
23
23
|
|
24
24
|
You must have Erlang installed before installing Ernie.
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
gem install mojombo-ernie -s http://gems.github.com \
|
29
|
-
-s http://gemcutter.org
|
26
|
+
$ gem install ernie -s http://gemcutter.org
|
30
27
|
|
31
28
|
|
32
29
|
Running
|
@@ -43,6 +40,7 @@ Running
|
|
43
40
|
<none> Start an Ernie server.
|
44
41
|
reload-handlers Gracefully reload all of the the ruby handlers
|
45
42
|
and use the new code for all subsequent requests.
|
43
|
+
stats Print a list of connection and handler statistics.
|
46
44
|
|
47
45
|
Examples:
|
48
46
|
ernie -d -p 9999 -n 10 -h calc.rb
|
data/VERSION.yml
CHANGED
data/elib/ernie_server.erl
CHANGED
@@ -9,7 +9,8 @@
|
|
9
9
|
terminate/2, code_change/3]).
|
10
10
|
|
11
11
|
-record(state, {lsock = undefined,
|
12
|
-
pending = queue:new()
|
12
|
+
pending = queue:new(),
|
13
|
+
count = 0}).
|
13
14
|
|
14
15
|
-record(request, {sock = undefined,
|
15
16
|
info = undefined,
|
@@ -70,7 +71,9 @@ handle_call(_Request, _From, State) ->
|
|
70
71
|
handle_cast({process, Sock}, State) ->
|
71
72
|
Request = #request{sock = Sock},
|
72
73
|
State2 = receive_term(Request, State),
|
73
|
-
|
74
|
+
Count = State2#state.count,
|
75
|
+
State3 = State2#state{count = Count + 1},
|
76
|
+
{noreply, State3};
|
74
77
|
handle_cast({asset_freed}, State) ->
|
75
78
|
case queue:is_empty(State#state.pending) of
|
76
79
|
false ->
|
@@ -127,11 +130,13 @@ process_admin(Sock, reload_handlers, _Args, State) ->
|
|
127
130
|
ok = gen_tcp:close(Sock),
|
128
131
|
State;
|
129
132
|
process_admin(Sock, stats, _Args, State) ->
|
133
|
+
Count = State#state.count,
|
134
|
+
CountString = list_to_binary([<<"connections.total=">>, integer_to_list(Count), <<"\n">>]),
|
130
135
|
IdleWorkers = asset_pool:idle_worker_count(),
|
131
|
-
IdleWorkersString = list_to_binary([<<"idle
|
136
|
+
IdleWorkersString = list_to_binary([<<"workers.idle=">>, integer_to_list(IdleWorkers), <<"\n">>]),
|
132
137
|
QueueLength = queue:len(State#state.pending),
|
133
|
-
QueueLengthString = list_to_binary([<<"pending
|
134
|
-
gen_tcp:send(Sock, term_to_binary({reply, list_to_binary([IdleWorkersString, QueueLengthString])})),
|
138
|
+
QueueLengthString = list_to_binary([<<"connections.pending=">>, integer_to_list(QueueLength), <<"\n">>]),
|
139
|
+
gen_tcp:send(Sock, term_to_binary({reply, list_to_binary([CountString, IdleWorkersString, QueueLengthString])})),
|
135
140
|
ok = gen_tcp:close(Sock),
|
136
141
|
State;
|
137
142
|
process_admin(Sock, _Fun, _Args, State) ->
|
data/ernie.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{ernie}
|
5
|
-
s.version = "0.3.
|
5
|
+
s.version = "0.3.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Tom Preston-Werner"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-09-06}
|
10
10
|
s.default_executable = %q{ernie}
|
11
11
|
s.email = %q{tom@mojombo.com}
|
12
12
|
s.executables = ["ernie"]
|
data/examples/calc.rb
CHANGED
@@ -1,8 +1,24 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
2
|
require 'ernie'
|
3
3
|
|
4
|
+
# Just about the easiest example I could thing of.
|
4
5
|
mod(:calc) do
|
5
6
|
fun(:add) do |a, b|
|
6
7
|
a + b
|
7
8
|
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Useful for tests that need to simulate longer running functions.
|
12
|
+
mod(:slowcalc) do
|
13
|
+
fun(:add) do |a, b|
|
14
|
+
sleep(rand * 2)
|
15
|
+
a + b
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Throw an error
|
20
|
+
mod(:errorcalc) do
|
21
|
+
fun(:add) do |a, b|
|
22
|
+
raise "abandon hope!"
|
23
|
+
end
|
8
24
|
end
|
data/lib/ernie.rb
CHANGED
@@ -59,6 +59,8 @@ class Ernie
|
|
59
59
|
def self.dispatch(mod, fun, args)
|
60
60
|
xargs = deconvert(args)
|
61
61
|
self.log("-- " + [mod, fun, xargs].inspect)
|
62
|
+
self.mods[mod] || raise(ServerError.new("No such module: '#{mod}'"))
|
63
|
+
self.mods[mod].funs[fun] || raise(ServerError.new("No such function '#{mod}:#{fun}'"))
|
62
64
|
res = self.mods[mod].funs[fun].call(*xargs)
|
63
65
|
convert(res)
|
64
66
|
end
|
@@ -74,8 +76,13 @@ class Ernie
|
|
74
76
|
xres = [:reply, res]
|
75
77
|
self.log("<- " + xres.inspect)
|
76
78
|
f.send!(xres)
|
79
|
+
rescue ServerError => e
|
80
|
+
xres = [:error, [:server, 0, e.message, e.backtrace]]
|
81
|
+
self.log("<- " + xres.inspect)
|
82
|
+
self.log(e.backtrace.join("\n"))
|
83
|
+
f.send!(xres)
|
77
84
|
rescue Object => e
|
78
|
-
xres = [:error, [:user, 0, e.message]]
|
85
|
+
xres = [:error, [:user, 0, e.message, e.backtrace]]
|
79
86
|
self.log("<- " + xres.inspect)
|
80
87
|
self.log(e.backtrace.join("\n"))
|
81
88
|
f.send!(xres)
|
@@ -105,6 +112,8 @@ class Ernie
|
|
105
112
|
end
|
106
113
|
end
|
107
114
|
|
115
|
+
class Ernie::ServerError < StandardError; end
|
116
|
+
|
108
117
|
class Ernie::Mod
|
109
118
|
attr_accessor :name, :funs
|
110
119
|
|
data/test/load.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
require 'bertrpc'
|
2
2
|
|
3
|
+
$stdout.sync = true
|
4
|
+
|
3
5
|
threads = []
|
4
6
|
svc = BERTRPC::Service.new('localhost', 8000)
|
5
7
|
|
6
|
-
|
8
|
+
8.times do
|
7
9
|
threads << Thread.new do
|
8
10
|
i = 0
|
9
|
-
|
10
|
-
print "#{i}
|
11
|
+
10.times { i += svc.call.calc.add(1, 2); print '.'; $stdout.flush }
|
12
|
+
print "(#{i})"
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
|
-
threads.each { |t| t.join }
|
16
|
+
threads.each { |t| t.join }
|
17
|
+
|
18
|
+
puts
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ernie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Preston-Werner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-09-06 00:00:00 -07:00
|
13
13
|
default_executable: ernie
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|