rbmk 0.1.0.c → 0.1.0.d
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbmk/peer.rb +7 -2
- data/lib/rbmk/server.rb +53 -28
- data/lib/rbmk/version.rb +2 -2
- data/lib/rbmk/worker.rb +6 -5
- metadata +2 -3
- data/lib/rbmk/signal.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4110b7240f29397f17634e175d64974cdd2738d
|
4
|
+
data.tar.gz: 5f3c5aa09b7fe10d7f0da8dc75110deb341dff00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebf931c83e0eaf760d92835b8f4b92954081ba70ae85d39a900307a0f81012e0cca692f435eaf9936b3de73489aa08870fe5048526cef76a145afdb895693693
|
7
|
+
data.tar.gz: d51ff4ca6818bb25178ec927b7ea01d471a0074e5ba967378a6c4695767cef7f4bbeafdd83a45b18620edacd20ba0afdb93fa27eaa3ba35624d2aecaf61d98b1
|
data/lib/rbmk/peer.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
module RBMK
|
2
2
|
class Peer
|
3
3
|
|
4
|
+
attr_accessor :socket, :host, :port
|
4
5
|
def initialize client
|
5
|
-
@
|
6
|
-
@port = client.peeraddr
|
6
|
+
@socket = client
|
7
|
+
@host, @port = client.peeraddr.values_at 3, 1
|
8
|
+
end
|
9
|
+
|
10
|
+
def close
|
11
|
+
@socket.close
|
7
12
|
end
|
8
13
|
|
9
14
|
def to_s
|
data/lib/rbmk/server.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'timeout'
|
2
2
|
require 'rbmk/peer'
|
3
|
-
require 'rbmk/signal'
|
4
3
|
module RBMK
|
5
4
|
class Server
|
6
5
|
|
6
|
+
%w( CHLD INT HUP QUIT TERM ).each { |sig| const_set ('SIG%s' % sig).to_sym, Signal.list[sig] }
|
7
|
+
|
7
8
|
class Reaped < StandardError; end
|
8
9
|
|
9
10
|
def initialize
|
@@ -13,18 +14,23 @@ class Server
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def start
|
17
|
+
require 'rbmk/version'
|
18
|
+
$log.info sprintf('rbmk version %s (codename %p) is warming up in an orange glow', VERSION, CODENAME)
|
16
19
|
require 'socket'
|
17
20
|
@upstream = self.class.upstream
|
18
21
|
$log.debug sprintf('Listening on %s:%s', self.class.host, self.class.port)
|
19
22
|
@socket = TCPServer.new self.class.host, self.class.port
|
20
|
-
Signal.constants.each { |sig| Signal.trap Signal.const_get(sig), method(:trap) }
|
21
23
|
$0 = sprintf '%s master at %s:%s', @arvg0, self.class.host, self.class.port
|
24
|
+
Signal.trap('CHLD') { raise SignalException, 'CHLD' }
|
22
25
|
loop { accept }
|
23
26
|
ensure
|
24
27
|
@socket.close rescue nil
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
$log.debug sprintf('Disposing of workers: %p', @workers.keys)
|
29
|
+
Signal.trap('CHLD') {} # we'll bury them in synchronous fashion
|
30
|
+
Thread.abort_on_exception = true
|
31
|
+
@workers.each { |pid,_| Thread.new { kill pid } }
|
32
|
+
sleep(0.1) while Thread.list.count > 1 # make sure everyone is dead
|
33
|
+
$log.info 'Shutdown sequence complete'
|
28
34
|
end
|
29
35
|
|
30
36
|
protected
|
@@ -39,47 +45,66 @@ protected
|
|
39
45
|
end
|
40
46
|
|
41
47
|
def accept
|
42
|
-
peer = Peer.new
|
48
|
+
peer = Peer.new @socket.accept
|
43
49
|
$log.info 'Connection from %s' % peer
|
44
50
|
if pid = fork then
|
45
|
-
|
46
|
-
@workers[pid] =
|
51
|
+
peer.close
|
52
|
+
@workers[pid] = true
|
47
53
|
else
|
48
54
|
$log.debug 'Worker started'
|
49
|
-
|
55
|
+
@socket.close
|
56
|
+
act_as_a_child_for peer
|
50
57
|
end
|
51
|
-
rescue
|
52
|
-
$log.debug $!.
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
@workers.delete pid
|
61
|
-
raise Reaped.new('Reaped %s' % pid)
|
62
|
-
else raise 'Terminated on SIG%s' % Signal.signame(sig)
|
58
|
+
rescue SignalException
|
59
|
+
$log.debug 'Trapped %p' % $!.signm
|
60
|
+
case $!.signo
|
61
|
+
when SIGCHLD then reap
|
62
|
+
when SIGINT, SIGHUP, SIGTERM then exit
|
63
|
+
when SIGQUIT then
|
64
|
+
$log.debug 'Committing emergency suicide'
|
65
|
+
exit!
|
66
|
+
else raise $!
|
63
67
|
end
|
64
|
-
rescue Errno::ECHILD
|
65
|
-
# okay, nothing to do
|
66
68
|
end
|
67
69
|
|
68
|
-
def act_as_a_child_for
|
69
|
-
Signal.trap 'CHLD', '
|
70
|
+
def act_as_a_child_for peer
|
71
|
+
Signal.trap 'CHLD', 'SYSTEM_DEFAULT'
|
70
72
|
$master = false
|
71
73
|
remove_instance_variable :@workers
|
72
74
|
$0 = sprintf '%s worker for %s', @arvg0, peer
|
73
|
-
Timeout.timeout(self.class.worker_timeout) { serve
|
75
|
+
Timeout.timeout(self.class.worker_timeout) { serve peer } # FIXME shall move to master in the future or maybe drop altogether in favour of activity detection
|
76
|
+
rescue SignalException
|
77
|
+
$log.debug 'Trapped %p' % $!.signm
|
78
|
+
raise $!
|
74
79
|
rescue Exception
|
75
80
|
$!.log
|
76
81
|
ensure
|
82
|
+
$log.debug 'Terminating'
|
77
83
|
exit!
|
78
84
|
end
|
79
85
|
|
80
|
-
def serve
|
86
|
+
def serve peer
|
81
87
|
require 'rbmk/worker'
|
82
|
-
Worker.hire
|
88
|
+
Worker.hire peer, @upstream
|
89
|
+
end
|
90
|
+
|
91
|
+
def kill pid
|
92
|
+
$log.debug 'Killing worker %s' % pid
|
93
|
+
Process.kill 'TERM', pid
|
94
|
+
Process.wait pid
|
95
|
+
$log.debug 'Worker %s will not be a problem anymore' % pid
|
96
|
+
rescue Errno::ESRCH
|
97
|
+
$log.debug 'Somehow worker %s was not alive' % pid
|
98
|
+
rescue Errno::ECHILD
|
99
|
+
$log.debug 'Worker %s has suddenly disappeared' % pid
|
100
|
+
end
|
101
|
+
|
102
|
+
def reap
|
103
|
+
pid, status = Process.wait2 -1, Process::WNOHANG
|
104
|
+
@workers.delete pid
|
105
|
+
$log.debug 'Reaped %s' % pid
|
106
|
+
rescue Errno::ECHILD
|
107
|
+
$log.debug 'Something went wrong, no dead workers to reap'
|
83
108
|
end
|
84
109
|
|
85
110
|
end
|
data/lib/rbmk/version.rb
CHANGED
data/lib/rbmk/worker.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require 'ldap/server'
|
2
2
|
require 'rbmk/operation'
|
3
|
+
require 'rbmk/peer'
|
3
4
|
module RBMK
|
4
5
|
class Worker
|
5
6
|
|
6
|
-
def self.hire
|
7
|
+
def self.hire peer, upstream; new(peer, upstream).serve end
|
7
8
|
|
8
|
-
def initialize
|
9
|
+
def initialize peer, upstream
|
9
10
|
upstream.mktemp
|
10
|
-
@
|
11
|
-
@conn = LDAP::Server::Connection.new @socket,
|
11
|
+
@peer = peer
|
12
|
+
@conn = LDAP::Server::Connection.new @peer.socket,
|
12
13
|
server: upstream,
|
13
14
|
logger: $log,
|
14
15
|
operation_class: RBMK::Operation,
|
@@ -19,7 +20,7 @@ class Worker
|
|
19
20
|
def serve
|
20
21
|
@conn.handle_requests
|
21
22
|
ensure
|
22
|
-
@
|
23
|
+
@peer.close
|
23
24
|
end
|
24
25
|
|
25
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbmk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.d
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- stronny red
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-ldap
|
@@ -60,7 +60,6 @@ files:
|
|
60
60
|
- lib/rbmk/operation.rb
|
61
61
|
- lib/rbmk/peer.rb
|
62
62
|
- lib/rbmk/server.rb
|
63
|
-
- lib/rbmk/signal.rb
|
64
63
|
- lib/rbmk/transform.rb
|
65
64
|
- lib/rbmk/upstream.rb
|
66
65
|
- lib/rbmk/version.rb
|
data/lib/rbmk/signal.rb
DELETED