macaw_framework 1.0.4 → 1.0.5

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