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 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