rbmk 0.1.0.c → 0.1.0.d
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 +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