macaw_framework 1.0.4 → 1.0.5

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
  SHA256:
3
- metadata.gz: 8ecbb30269b9cfed980624d372e7cff442864ea0098a8bc70348b0b0a9aede89
4
- data.tar.gz: 1b86eca567b15956dc6e36a481a1e0a008508efd7c8440935aac4c4ad4e7918c
3
+ metadata.gz: 8f108da6fb2654c701154a544cea00e47d9546c5092ef3dcbc1e299c34420ddd
4
+ data.tar.gz: 23c72078365336da0585d7ee88cce41db2972efcfcc72c930ccceb73edb302ed
5
5
  SHA512:
6
- metadata.gz: 3bf5ac30ae302a00183c72a2fff0f478eb6ccd3bf6f1c1b0eb99309d65686729e246aa475f374c40c7c6d92e2c3a8140e2b5cd83d89684f5373fe759a950b7bf
7
- data.tar.gz: b0c305acaa1a0a6a1a430541c9ffdcb9153659b308a6e12d0b8bd3e05e1778158d487ffbe0bdf2c7bfb0859a84ff411148f6f7636926648980ff0ed6dc08dcc9
6
+ metadata.gz: 9e0feab01f25bab3ce8b65799c516f04a837c5e250b8f53934049c2c3f1db303d92cfa9629151c0c8b46836e9a77690aea1a27cfc7b8bb1b99c7f9340a3cb8f1
7
+ data.tar.gz: cb769896b94e443248ecc419ffb69f0c587e9cda52430516204b8bcfed0a56eed5cf4aac3f6ca05f53dabe5d954777579e088c351dd82f2a61fdf47871bc143a
data/CHANGELOG.md CHANGED
@@ -63,3 +63,7 @@
63
63
  ## [1.0.4] - 2023-05-11
64
64
 
65
65
  - Fixing issue with response body returning always a blank line at the beginning
66
+
67
+ ## [1.0.5] - 2023-05-12
68
+
69
+ - Fixing critical bug where threads were being killed and not respawning after abrupt client connection shutdown
@@ -55,14 +55,15 @@ class Server
55
55
  def run
56
56
  @server = TCPServer.new(@bind, @port)
57
57
  @server = OpenSSL::SSL::SSLServer.new(@server, @context) if @context
58
+ @workers_mutex = Mutex.new
58
59
  @num_threads.times do
59
- @workers << Thread.new do
60
- loop do
61
- client = @work_queue.pop
62
- break if client == :shutdown
60
+ spawn_worker
61
+ end
63
62
 
64
- handle_client(client)
65
- end
63
+ Thread.new do
64
+ loop do
65
+ sleep 10
66
+ maintain_worker_pool
66
67
  end
67
68
  end
68
69
 
@@ -100,6 +101,8 @@ class Server
100
101
  message ||= nil
101
102
  response_headers ||= nil
102
103
  client.puts ResponseDataFilter.mount_response(status, response_headers, message)
104
+ rescue IOError, Errno::EPIPE => e
105
+ @macaw_log.error("Error writing to client: #{e.message}")
103
106
  rescue TooManyRequestsError
104
107
  client.print "HTTP/1.1 429 Too Many Requests\r\n\r\n"
105
108
  rescue EndpointNotMappedError
@@ -108,7 +111,11 @@ class Server
108
111
  client.print "HTTP/1.1 500 Internal Server Error\r\n\r\n"
109
112
  @macaw_log.info("Error: #{e}")
110
113
  ensure
111
- client.close
114
+ begin
115
+ client.close
116
+ rescue IOError => e
117
+ @macaw_log.error("Error closing client: #{e.message}")
118
+ end
112
119
  end
113
120
 
114
121
  def declare_client_session(client)
@@ -181,4 +188,28 @@ class Server
181
188
  def get_client_data(body, headers, parameters)
182
189
  { body: body, headers: headers, params: parameters }
183
190
  end
191
+
192
+ def spawn_worker
193
+ @workers_mutex.synchronize do
194
+ @workers << Thread.new do
195
+ loop do
196
+ client = @work_queue.pop
197
+ break if client == :shutdown
198
+
199
+ handle_client(client)
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ def maintain_worker_pool
206
+ @workers_mutex.synchronize do
207
+ @workers.each_with_index do |worker, index|
208
+ unless worker.alive?
209
+ @macaw_log.error("Worker thread #{index} died, respawning...")
210
+ @workers[index] = spawn_worker
211
+ end
212
+ end
213
+ end
214
+ end
184
215
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MacawFramework
4
- VERSION = "1.0.4"
4
+ VERSION = "1.0.5"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: macaw_framework
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aria Diniz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-11 00:00:00.000000000 Z
11
+ date: 2023-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prometheus-client