fluent-plugin-groonga 1.1.2 → 1.1.3

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: 7a9668e4de0a3638480de1d40b46d667d7cab260
4
- data.tar.gz: e0698d86a5ce4eeeb038ce8987c68901b377c9b7
3
+ metadata.gz: 5947627fa2f465811a846d3cd3ced7a8ac367674
4
+ data.tar.gz: cc846ea63eca88bdadbb9d5dceab7b806e36762d
5
5
  SHA512:
6
- metadata.gz: 7209bf79d6f9fe172c99ca550cdea907fb745c8bc9c0708e428410799e4f0697ed370678439016f2c636f06fb3a0b34551edc3000ec681122c29d5fcb6226f5c
7
- data.tar.gz: eac848d799ece9eba22009a84dc08c87cf8147a64b385bf48b27814d1df4bbe9d262619dbcff2a4953624cd52296b1c068bd571ad83144c4aaebf30a3167da9b
6
+ metadata.gz: 386b7122fc93b2bba7f8fdfea1648ce66b7ad4e20929ad1ea7ea7fae0fd731d6168e6aac8c18567af14cfb621bbe1b95fe8d9903f11e7e2a78aaf53db18bf6a3
7
+ data.tar.gz: f56bf5c5848837eca8cc8de484c8493aad1467a3655594963670118ca3dfa14aa6fa326927f3e557fdb58175982beac9a39fda56f263ca852fa7ddb8bc4e2e8a
data/doc/text/news.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  # News
4
4
 
5
+ ## 1.1.3: 2016-09-02
6
+
7
+ ### Improvements
8
+
9
+ * Supported Fluentd 0.14.
10
+
11
+ * Stopped to emit requests when real Groonga server returns error
12
+ responses. `load` request and `object_remove` request are
13
+ exceptions. They are always emitted if real Groonga server returns
14
+ error responses. Because they may be effected when Groonga server
15
+ returns error responses.
16
+
17
+ * Updated the default emit target command list to reflect the recent
18
+ Groonga command list.
19
+
5
20
  ## 1.1.2: 2016-06-05
6
21
 
7
22
  ### Improvements
@@ -17,7 +17,7 @@
17
17
 
18
18
  Gem::Specification.new do |spec|
19
19
  spec.name = "fluent-plugin-groonga"
20
- spec.version = "1.1.2"
20
+ spec.version = "1.1.3"
21
21
  spec.authors = ["Kouhei Sutou"]
22
22
  spec.email = ["kou@clear-code.com"]
23
23
  spec.summary = "Fluentd plugin to store data into Groonga and implement Groonga replication system."
@@ -24,6 +24,7 @@ require "http_parser"
24
24
  require "gqtp"
25
25
  require "groonga/command/parser"
26
26
 
27
+ require "fluent/input"
27
28
  require "fluent/process"
28
29
 
29
30
  module Fluent
@@ -55,10 +56,12 @@ module Fluent
55
56
  end
56
57
 
57
58
  def start
59
+ super
58
60
  @input.start
59
61
  end
60
62
 
61
63
  def shutdown
64
+ super
62
65
  @input.shutdown
63
66
  end
64
67
 
@@ -86,13 +89,29 @@ module Fluent
86
89
  config_param :real_host, :string
87
90
  config_param :real_port, :integer, :default => nil
88
91
  DEFAULT_EMIT_COMMANDS = [
89
- /\Atable_/,
90
- /\Acolumn_/,
92
+ "clearlock",
93
+ "column_copy",
94
+ "column_create",
95
+ "column_remove",
96
+ "column_rename",
97
+ "config_delete",
98
+ "config_set",
91
99
  "delete",
92
- /\Aplugin_/,
100
+ "load",
101
+ "lock_acquire",
102
+ "lock_clear",
103
+ "lock_release",
104
+ "logical_table_remove",
105
+ "object_remove",
106
+ "plugin_register",
107
+ "plugin_unregister",
93
108
  "register",
109
+ "reindex",
110
+ "table_copy",
111
+ "table_create",
112
+ "table_remove",
113
+ "table_rename",
94
114
  "truncate",
95
- "load",
96
115
  ]
97
116
  config_param :emit_commands, :default => DEFAULT_EMIT_COMMANDS do |value|
98
117
  commands = value.split(/\s*,\s*/)
@@ -152,8 +171,9 @@ module Fluent
152
171
  end
153
172
 
154
173
  def emit(command, params)
155
- return unless emit_command?(command)
156
- @input_plugin.router.emit("groonga.command.#{command}",
174
+ normalized_command = command.split(".")[0]
175
+ return unless emit_command?(normalized_command)
176
+ @input_plugin.router.emit("groonga.command.#{normalized_command}",
157
177
  Engine.now,
158
178
  params)
159
179
  end
@@ -191,13 +211,17 @@ module Fluent
191
211
  end
192
212
 
193
213
  def on_connect
194
- @parser = HTTP::Parser.new(self)
195
214
  @repeater = @input.create_repeater(self)
215
+ @repeater.on_connect_failed do
216
+ close
217
+ end
218
+ @request_handler = RequestHandler.new(@input, @repeater)
219
+ @response_handler = ResponseHandler.new(self)
196
220
  end
197
221
 
198
222
  def on_read(data)
199
223
  begin
200
- @parser << data
224
+ @request_handler << data
201
225
  rescue HTTP::Parser::Error
202
226
  $log.error("[input][groonga][error] " +
203
227
  "failed to parse HTTP request:",
@@ -207,8 +231,55 @@ module Fluent
207
231
  end
208
232
  end
209
233
 
234
+ def write(data)
235
+ @response_handler << data
236
+ super
237
+ end
238
+
239
+ def on_response_complete(response)
240
+ if need_emit?(response)
241
+ @input.emit(@request_handler.command,
242
+ @request_handler.params)
243
+ end
244
+ on_write_complete do
245
+ @repeater.close
246
+ end
247
+ end
248
+
249
+ private
250
+ def need_emit?(response)
251
+ case @request_handler.command
252
+ when "load", "object_remove"
253
+ return true
254
+ end
255
+
256
+ case response
257
+ when Array
258
+ return_code = response[0][0]
259
+ return_code.zero?
260
+ else
261
+ false
262
+ end
263
+ end
264
+ end
265
+
266
+ class RequestHandler
267
+ attr_reader :command
268
+ attr_reader :params
269
+ def initialize(input, repeater)
270
+ @input = input
271
+ @repeater = repeater
272
+ @parser = Http::Parser.new(self)
273
+ end
274
+
275
+ def <<(chunk)
276
+ @parser << chunk
277
+ end
278
+
210
279
  def on_message_begin
211
280
  @body = ""
281
+ @command = nil
282
+ @params = nil
212
283
  end
213
284
 
214
285
  def on_headers_complete(headers)
@@ -244,8 +315,52 @@ module Fluent
244
315
  if command == "load"
245
316
  params["values"] = @body unless @body.empty?
246
317
  end
247
- @input.emit(command, params)
318
+ @command = command
319
+ @params = params
320
+ end
321
+ end
322
+ end
323
+
324
+ class ResponseHandler
325
+ def initialize(handler)
326
+ @handler = handler
327
+ @parser = Http::Parser.new(self)
328
+ end
329
+
330
+ def <<(chunk)
331
+ @parser << chunk
332
+ end
333
+
334
+ def on_message_begin
335
+ @body = ""
336
+ @content_type = nil
337
+ end
338
+
339
+ def on_headers_complete(headers)
340
+ headers.each do |name, value|
341
+ case name
342
+ when /\AContent-Type\z/i
343
+ @content_type = value
344
+ end
345
+ end
346
+ end
347
+
348
+ def on_body(chunk)
349
+ @body << chunk
350
+ end
351
+
352
+ def on_message_complete
353
+ case @content_type
354
+ when /\Aapplication\/json\z/
355
+ response = JSON.parse(@body)
356
+ when /\Aapplication\/x-msgpack\z/
357
+ response = MessagePack.unpack(@body)
358
+ when /\Atext\/x-groonga-command-list/
359
+ response = @body
360
+ else
361
+ response = nil
248
362
  end
363
+ @handler.on_response_complete(response)
249
364
  end
250
365
  end
251
366
  end
data/test/test_input.rb CHANGED
@@ -101,11 +101,16 @@ EOC
101
101
  end
102
102
 
103
103
  def test_target_command
104
+ @real_response["Content-Type"] = "application/json"
105
+ @real_response.body = JSON.generate([[0, 0.0, 0.0], true])
104
106
  @driver.expect_emit("groonga.command.table_create",
105
107
  @now,
106
- {"name" => "Users"})
108
+ {
109
+ "name" => "Users",
110
+ "flags" => "TABLE_NO_KEY",
111
+ })
107
112
  @driver.run do
108
- get("/d/table_create", "name" => "Users")
113
+ get("/d/table_create", "name" => "Users", "flags" => "TABLE_NO_KEY")
109
114
  assert_equal("200", @last_response.code)
110
115
  end
111
116
  end
@@ -119,6 +124,8 @@ EOC
119
124
  end
120
125
 
121
126
  def test_load
127
+ @real_response["Content-Type"] = "application/json"
128
+ @real_response.body = JSON.generate([[0, 0.0, 0.0], 2])
122
129
  json = <<-EOJ
123
130
  [
124
131
  {"name": "Alice"},
data/test/test_output.rb CHANGED
@@ -34,7 +34,8 @@ class GroongaOutputTest < Test::Unit::TestCase
34
34
 
35
35
  private
36
36
  def create_driver(tag)
37
- driver = Fluent::Test::OutputTestDriver.new(Fluent::GroongaOutput, tag)
37
+ driver = Fluent::Test::BufferedOutputTestDriver.new(Fluent::GroongaOutput,
38
+ tag)
38
39
  driver.configure(configuration)
39
40
  driver
40
41
  end
@@ -99,9 +100,8 @@ EOC
99
100
  @response_body = JSON.generate([[0, 0.0, 0.0], true])
100
101
  driver = create_driver("groonga.command.table_create")
101
102
  time = Time.parse("2012-10-26T08:45:42Z").to_i
102
- driver.run do
103
- driver.emit({"name" => "Users"}, time)
104
- end
103
+ driver.emit({"name" => "Users"}, time)
104
+ driver.run
105
105
  assert_equal("/d/table_create?name=Users",
106
106
  @request_parser.request_url)
107
107
  end
@@ -119,9 +119,8 @@ EOC
119
119
  @response_body = JSON.generate([[0, 0.0, 0.0], [1]])
120
120
  driver = create_driver("log")
121
121
  time = Time.parse("2012-10-26T08:45:42Z").to_i
122
- driver.run do
123
- driver.emit({"message" => "1st message"}, time)
124
- end
122
+ driver.emit({"message" => "1st message"}, time)
123
+ driver.run
125
124
  assert_equal("/d/load?table=Logs",
126
125
  @request_parser.request_url)
127
126
  assert_equal([{"message" => "1st message"}],
@@ -132,10 +131,9 @@ EOC
132
131
  @response_body = JSON.generate([[0, 0.0, 0.0], [2]])
133
132
  driver = create_driver("log")
134
133
  time = Time.parse("2012-10-26T08:45:42Z").to_i
135
- driver.run do
136
- driver.emit({"message" => "1st message"}, time)
137
- driver.emit({"message" => "2nd message"}, time + 1)
138
- end
134
+ driver.emit({"message" => "1st message"}, time)
135
+ driver.emit({"message" => "2nd message"}, time + 1)
136
+ driver.run
139
137
  assert_equal("/d/load?table=Logs",
140
138
  @request_parser.request_url)
141
139
  assert_equal([
@@ -232,10 +230,9 @@ EOC
232
230
  class CommandTest < self
233
231
  def test_basic_command
234
232
  driver = create_driver("groonga.command.table_create")
235
- time = Time.parse("2012-10-26T08:45:42Z")
236
- driver.run do
237
- driver.emit({"name" => "Users"}, time)
238
- end
233
+ time = Time.parse("2012-10-26T08:45:42Z").to_i
234
+ driver.emit({"name" => "Users"}, time)
235
+ driver.run
239
236
  assert_equal([
240
237
  [
241
238
  "--input-fd", actual_input_fd,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-groonga
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-05 00:00:00.000000000 Z
11
+ date: 2016-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd