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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5143c3a5a8749059886ee69b982e04c2d031db1c
4
- data.tar.gz: 402fcd93f239baf41671a6f17c3c48cb4477df12
3
+ metadata.gz: a4110b7240f29397f17634e175d64974cdd2738d
4
+ data.tar.gz: 5f3c5aa09b7fe10d7f0da8dc75110deb341dff00
5
5
  SHA512:
6
- metadata.gz: 1694e095a3b21656d0c83825cc9299a489f2681d044ddca7bb8a1503140fde46fa6141649977d225097993558ee62d260e7b28148e9c19115dd190b7c6f9ed32
7
- data.tar.gz: a57aedc671d55ae62cf61fbfec2645be724e49ec6d582b4967d9913dc8574324d32cf7e2ed960e0654b44b7049512cdf7c3aed38a83822e0c1a6bc04ec1dbe6a
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
- @host = client.peeraddr[3]
6
- @port = client.peeraddr[1]
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
- @workers.each { |pid| Process.kill 'TERM', pid rescue nil }
26
- Process.waitall rescue nil
27
- $log.debug 'Exiting'
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(client = @socket.accept)
48
+ peer = Peer.new @socket.accept
43
49
  $log.info 'Connection from %s' % peer
44
50
  if pid = fork then
45
- client.close
46
- @workers[pid] = peer
51
+ peer.close
52
+ @workers[pid] = true
47
53
  else
48
54
  $log.debug 'Worker started'
49
- act_as_a_child_for client, peer
55
+ @socket.close
56
+ act_as_a_child_for peer
50
57
  end
51
- rescue Reaped
52
- $log.debug $!.message
53
- end
54
-
55
- def trap sig = nil
56
- case sig
57
- when nil then raise 'Something went wrong, trapped a nil.'
58
- when Signal::CHLD then
59
- pid, status = Process.wait2 -1, Process::WNOHANG
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 client, peer
69
- Signal.trap 'CHLD', 'DEFAULT'
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 client } # FIXME shall move to master in the future
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 client
86
+ def serve peer
81
87
  require 'rbmk/worker'
82
- Worker.hire client, @upstream
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
@@ -1,4 +1,4 @@
1
1
  module RBMK
2
- VERSION = '0.1.0.c'
3
- CODENAME = 'as pure as'
2
+ VERSION = '0.1.0.d'
3
+ CODENAME = 'not listening'
4
4
  end
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 client, upstream; new(client, upstream).serve end
7
+ def self.hire peer, upstream; new(peer, upstream).serve end
7
8
 
8
- def initialize client, upstream
9
+ def initialize peer, upstream
9
10
  upstream.mktemp
10
- @socket = client
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
- @socket.close
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.c
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-25 00:00:00.000000000 Z
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
@@ -1,3 +0,0 @@
1
- module Signal
2
- %w( CHLD INT HUP QUIT TERM ).each { |signame| const_set signame.to_sym, list[signame] }
3
- end