logstash-output-sumologic 1.4.0 → 1.4.1

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: ab9e1ae438a4d6030629b00a67c0536aba6995f6a2bae1f952b9737cf2c28189
4
- data.tar.gz: fdfec75b2d7c4bcd5c242c1d142d041648d450e3dfcb7a576de9531986f5438d
3
+ metadata.gz: a93e4aba1af87a7e0c3ea3570e5ff177e4307736dacf2fde1da78dbe4150a2da
4
+ data.tar.gz: 9ceb227f390a49467f7195daa96152335922275b714dda87215f11c16273d060
5
5
  SHA512:
6
- metadata.gz: 66620931f50b2c241835824e26e16e0c05ef8c4ec9ac5ad3770d579ae345ef4486c68de23de8c7c284e3005598231738f75bef59704977a65e3911b992907951
7
- data.tar.gz: 294a5910f5ec91ace98405439411d26ddf1e3c858e6d17cefb67d8b2b3c0b534c101cdd93faeab08c34dd42f77f5fb078e03b853e6937d63b1ed9f56ba69b840
6
+ metadata.gz: 88b55069b26026545a9cbb755555fa53e0570b120ea37ded4ae487da989f0054a6fb1259998a8e9eb038c0314a4450afa70fe658d372030f4eae0f25e7247b5b
7
+ data.tar.gz: 6ca3a09f3f297c87c06707dd6a3b74d8210cb46ac60dde3f2663b2509cd87274d92d67d49203194a4def5e70dd314190a4887ac9401199889ecbaf79b22bb77a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Change Log
2
2
 
3
+ ## 1.4.1 (2022-03-09)
4
+
5
+ - [#73](https://github.com/SumoLogic/logstash-output-sumologic/pull/73) fix: remove deadlock possibility by adding resend_queue queue
6
+
3
7
  ## 1.4.0 (2021-09-27)
4
8
 
5
9
  - [#68](https://github.com/SumoLogic/logstash-output-sumologic/pull/68) feat: retry on 502 error code
@@ -27,8 +27,8 @@ module LogStash; module Outputs; class SumoLogic;
27
27
  end
28
28
  end # def enq
29
29
 
30
- def deq()
31
- batch = @queue.deq()
30
+ def deq(non_block: false)
31
+ batch = @queue.deq(non_block: non_block)
32
32
  batch_size = batch.payload.bytesize
33
33
  @stats.record_deque(batch_size)
34
34
  @queue_bytesize.update { |v| v - batch_size }
@@ -24,10 +24,14 @@ module LogStash; module Outputs; class SumoLogic;
24
24
  @sender_max = (config["sender_max"] ||= 1) < 1 ? 1 : config["sender_max"]
25
25
  @sleep_before_requeue = config["sleep_before_requeue"] ||= 30
26
26
  @stats_enabled = config["stats_enabled"] ||= false
27
+ @iteration_sleep = 0.3
27
28
 
28
29
  @tokens = SizedQueue.new(@sender_max)
29
30
  @sender_max.times { |t| @tokens << t }
30
31
 
32
+ # Make resend_queue twice as big as sender_max,
33
+ # because if one batch is processed, the next one is already waiting in the thread
34
+ @resend_queue = SizedQueue.new(2*@sender_max)
31
35
  @compressor = LogStash::Outputs::SumoLogic::Compressor.new(config)
32
36
 
33
37
  end # def initialize
@@ -39,9 +43,24 @@ module LogStash; module Outputs; class SumoLogic;
39
43
  @stopping.make_false()
40
44
  @sender_t = Thread.new {
41
45
  while @stopping.false?
42
- batch = @queue.deq()
46
+ begin
47
+ # Resend batch if any in the queue
48
+ batch = @resend_queue.deq(non_block: true)
49
+ rescue ThreadError
50
+ # send new batch otherwise
51
+ begin
52
+ batch = @queue.deq(non_block: true)
53
+ rescue ThreadError
54
+ Stud.stoppable_sleep(@iteration_sleep) { @stopping.true? }
55
+ next
56
+ end
57
+ end
43
58
  send_request(batch)
44
59
  end # while
60
+ @resend_queue.size.times.map { |queue|
61
+ batch = queue.deq()
62
+ send_request(batch)
63
+ }
45
64
  @queue.drain().map { |batch|
46
65
  send_request(batch)
47
66
  }
@@ -98,6 +117,7 @@ module LogStash; module Outputs; class SumoLogic;
98
117
  return
99
118
  end
100
119
 
120
+ # wait for token so we do not exceed number of request in background
101
121
  token = @tokens.pop()
102
122
 
103
123
  if @stats_enabled && content.start_with?(STATS_TAG)
@@ -111,11 +131,9 @@ module LogStash; module Outputs; class SumoLogic;
111
131
  :content_size => content.size,
112
132
  :content => content[0..20],
113
133
  :payload_size => body.size)
134
+
135
+ # send request in background
114
136
  request = @client.send(:background).send(:post, @url, :body => body, :headers => headers)
115
-
116
- request.on_complete do
117
- @tokens << token
118
- end
119
137
 
120
138
  request.on_success do |response|
121
139
  @stats.record_response_success(response.code)
@@ -126,12 +144,16 @@ module LogStash; module Outputs; class SumoLogic;
126
144
  :headers => headers,
127
145
  :contet => content[0..20])
128
146
  if response.code == 429 || response.code == 502 || response.code == 503 || response.code == 504
147
+ # requeue and release token
129
148
  requeue_message(batch)
149
+ @tokens << token
130
150
  end
131
151
  else
132
152
  log_dbg("request accepted",
133
153
  :token => token,
134
154
  :code => response.code)
155
+ # release token
156
+ @tokens << token
135
157
  end
136
158
  end
137
159
 
@@ -143,6 +165,8 @@ module LogStash; module Outputs; class SumoLogic;
143
165
  :class => exception.class.name,
144
166
  :backtrace => exception.backtrace)
145
167
  requeue_message(batch)
168
+ # requeue and release token
169
+ @tokens << token
146
170
  end
147
171
 
148
172
  @stats.record_request(content.bytesize, body.bytesize)
@@ -162,7 +186,7 @@ module LogStash; module Outputs; class SumoLogic;
162
186
  :content => content[0..20],
163
187
  :headers => batch.headers)
164
188
  Stud.stoppable_sleep(@sleep_before_requeue) { @stopping.true? }
165
- @queue.enq(batch)
189
+ @resend_queue.enq(batch)
166
190
  end
167
191
  end # def reque_message
168
192
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-sumologic'
3
- s.version = '1.4.0'
3
+ s.version = '1.4.1'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = 'Deliever the log to Sumo Logic cloud service.'
6
6
  s.description = 'This gem is a Logstash output plugin to deliver the log or metrics to Sumo Logic cloud service. Go to https://github.com/SumoLogic/logstash-output-sumologic for getting help, reporting issues, etc.'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-sumologic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sumo Logic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-27 00:00:00.000000000 Z
11
+ date: 2022-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: manticore