groonga-query-log 1.7.5 → 1.7.7

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: ddc6abfd57bfd9684c695179c7cac74c76ea66fffb0b87b9a0d44726a16128b6
4
- data.tar.gz: 52dfaf4698c92587f155e3d4e0fd70fcc7c94b7c6ae58fdab43e72695a3e7722
3
+ metadata.gz: af3ac522ec27ea395b44209b8ab56521de14b828d67bf4b8d4dad52bb0df2d1c
4
+ data.tar.gz: c570a4a49aad267b71047d992e0593afac1290135711a7f45b8114ded4232dbd
5
5
  SHA512:
6
- metadata.gz: 0747f843b5cce48e3540cace8c2be2ab4200c7d6c406917a56b7eb05dbd047437249400f25178045d29b1aef8c84253e6c3a70ef806db9f581ae47392a34c2a5
7
- data.tar.gz: 47391f44a1d86c8aa37ae8893f87381e49fddf15100762938cacb73b742b0a909c2b32e574564d32415c82e8ca2c5b618f0c86b0028c288b0570685a4b3f0d60
6
+ metadata.gz: 7f0dc1247dc380bd50f8b249fcc7976a800bb67de75f10e4cd600741508f4236d89aa750277043336dc4abd561641804cf53056373338ef9ae2dd2b0f9cc5c0e
7
+ data.tar.gz: ddcce99bb10e8b8876fbbce95d9c0c49f5d1b8ca7e6ce8beb4a9178624ab169475ce49173c33f1e1a5796909ae20c1fa1976126033c944757859f18e9a05689f
data/doc/text/news.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # News
2
2
 
3
+ ## 1.7.7: 2024-04-08
4
+
5
+ ### Improvements
6
+
7
+ * `run-regression-test`: Added a test to verify that the `request_cancel` command can be successfully cancelled.
8
+
9
+ * `analyze-load`: Added support for reporting throughput.
10
+
11
+ ## 1.7.6: 2021-02-24
12
+
13
+ ### Improvements
14
+
15
+ * `replayer`: Ignored `load` without `values`.
16
+
17
+ * `statistics`: Added `n_records` to each operation.
18
+
3
19
  ## 1.7.5: 2020-11-18
4
20
 
5
21
  ### Improvements
@@ -54,6 +54,7 @@ Gem::Specification.new do |spec|
54
54
 
55
55
  spec.add_runtime_dependency("charty")
56
56
  spec.add_runtime_dependency("diff-lcs")
57
+ spec.add_runtime_dependency("net-smtp")
57
58
  spec.add_runtime_dependency("groonga-client", ">= 0.6.2")
58
59
  spec.add_runtime_dependency("groonga-log", ">= 0.1.2")
59
60
 
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2017-2018 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2017-2024 Sutou Kouhei <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -147,9 +147,15 @@ module GroongaQueryLog
147
147
  n_column_errors = nil
148
148
  total = nil
149
149
  end
150
+ if n_loaded_records and n_loaded_records > 0
151
+ throughput = statistic.elapsed_in_seconds / n_loaded_records
152
+ else
153
+ throughput = nil
154
+ end
150
155
  entry = [
151
156
  statistic.start_time.iso8601,
152
157
  statistic.elapsed_in_seconds,
158
+ throughput,
153
159
  load_command.table,
154
160
  n_loaded_records,
155
161
  n_record_errors,
@@ -171,6 +177,7 @@ module GroongaQueryLog
171
177
  header = [
172
178
  "start_time",
173
179
  "elapsed",
180
+ "throughput",
174
181
  "table",
175
182
  "n_loaded_records",
176
183
  "n_record_errors",
@@ -67,6 +67,8 @@ module GroongaQueryLog
67
67
  @debug_rewrite = false
68
68
  @omit_rate = 0.0
69
69
  @max_limit = -1
70
+ @verify_cancel = false
71
+ @cancel_max_wait = 5.0
70
72
 
71
73
  @care_order = true
72
74
  @ignored_drilldown_keys = []
@@ -426,6 +428,20 @@ module GroongaQueryLog
426
428
  "(#{@notifier_options[:mail_only_on_failure]})") do |boolean|
427
429
  @notifier_options[:mail_only_on_failure] = boolean
428
430
  end
431
+ parser.on("--[no-]verify-cancel",
432
+ "Verify cancellation",
433
+ "(#{@verify_cancel})") do |boolean|
434
+ @verify_cancel = boolean
435
+ end
436
+ parser.on("--cancel-max-wait=SECONDS", Float,
437
+ "Used with --verify_cancel. " +
438
+ "You can specify the maximum number of seconds to wait " +
439
+ "before sending request_cancel command. " +
440
+ "For example, if you specify 5.0 in this option, " +
441
+ "wait randomly between 0~5.0 seconds before sending request_cancel command.",
442
+ "(#{@cancel_max_wait})") do |seconds|
443
+ @cancel_max_wait = seconds
444
+ end
429
445
  parser
430
446
  end
431
447
 
@@ -478,6 +494,8 @@ module GroongaQueryLog
478
494
  :verify_performance => @verify_performance,
479
495
  :performance_verfifier_options => @performance_verfifier_options,
480
496
  :read_timeout => @read_timeout,
497
+ :verify_cancel => @verify_cancel,
498
+ :cancel_max_wait => @cancel_max_wait,
481
499
  }
482
500
  directory_options.merge(options)
483
501
  end
@@ -517,7 +535,7 @@ module GroongaQueryLog
517
535
  end
518
536
  formatted << "\n"
519
537
  unless n_leaked_objects.zero?
520
- formatted << "\nLeaked: #{n_leaked_objects}"
538
+ formatted << "\nLeaked: #{n_leaked_objects}\n"
521
539
  end
522
540
  unless success
523
541
  output = StringIO.new
@@ -945,6 +963,11 @@ module GroongaQueryLog
945
963
  command_line << "--read-timeout"
946
964
  command_line << @options[:read_timeout].to_s
947
965
  end
966
+ if @options[:verify_cancel]
967
+ command_line << "--verify_cancel"
968
+ command_line << "--cancel-max-wait"
969
+ command_line << @options[:cancel_max_wait].to_s
970
+ end
948
971
  verify_server = VerifyServer.new
949
972
  same = verify_server.run(command_line, &callback)
950
973
  @n_executed_commands = verify_server.n_executed_commands
@@ -287,6 +287,22 @@ module GroongaQueryLog
287
287
  @options.max_limit = limit
288
288
  end
289
289
 
290
+ parser.on("--[no-]verify-cancel",
291
+ "Verify cancellation",
292
+ "(#{@options.verify_cancel?})") do |boolean|
293
+ @options.verify_cancel = boolean
294
+ end
295
+
296
+ parser.on("--cancel-max-wait=SECONDS", Float,
297
+ "Used with --verify_cancel. " +
298
+ "You can specify the maximum number of seconds to wait " +
299
+ "before sending request_cancel command. " +
300
+ "For example, if you specify 5.0 in this option, " +
301
+ "wait randomly between 0~5.0 seconds before sending request_cancel command.",
302
+ "(#{@options.cancel_max_wait})") do |seconds|
303
+ @options.cancel_max_wait = seconds
304
+ end
305
+
290
306
  create_parser_performance(parser)
291
307
 
292
308
  parser.separator("")
@@ -47,6 +47,7 @@ module GroongaQueryLog
47
47
  parser.parse(input) do |statistic|
48
48
  next if statistic.command.nil?
49
49
  next unless target_command?(statistic.command)
50
+ next unless available_command?(statistic.command)
50
51
  # TODO: validate orignal_source is one line
51
52
  output.puts(statistic.command.original_source)
52
53
  output.flush
@@ -132,6 +133,15 @@ module GroongaQueryLog
132
133
  @options.target_command_name?(command.command_name)
133
134
  end
134
135
 
136
+ def available_command?(command)
137
+ case command.command_name
138
+ when "load"
139
+ not command.values.nil?
140
+ else
141
+ true
142
+ end
143
+ end
144
+
135
145
  class NullOutput
136
146
  class << self
137
147
  def open
@@ -27,12 +27,15 @@ require "groonga-query-log/response-comparer"
27
27
 
28
28
  module GroongaQueryLog
29
29
  class ServerVerifier
30
+ GRN_CANCEL = -77
31
+
30
32
  attr_reader :n_executed_commands
31
33
  def initialize(options)
32
34
  @options = options
33
35
  @queue = SizedQueue.new(@options.request_queue_size)
34
36
  @events = Queue.new
35
37
  @n_executed_commands = 0
38
+ @request_id_counter = 0
36
39
  end
37
40
 
38
41
  def verify(input, &callback)
@@ -167,9 +170,15 @@ module GroongaQueryLog
167
170
  @options.stop_on_failure? and failed?
168
171
  end
169
172
 
173
+ def generate_request_id
174
+ (@request_id_counter += 1).to_s
175
+ end
176
+
170
177
  def verify_command(groonga1_client, groonga2_client, command)
171
178
  command["cache"] = "no" if @options.disable_cache?
172
179
  command["cache"] = "no" if @options.verify_performance?
180
+ command["request_id"] = generate_request_id if @options.verify_cancel?
181
+
173
182
  if @options.max_limit >= 0 and command["limit"]
174
183
  limit = command["limit"].to_i
175
184
  if limit >= 0
@@ -181,8 +190,26 @@ module GroongaQueryLog
181
190
  command["output_type"] = "json"
182
191
  rewrite_filter(command, "filter")
183
192
  rewrite_filter(command, "scorer")
193
+
184
194
  response1 = groonga1_client.execute(command)
185
- response2 = groonga2_client.execute(command)
195
+ # groonga2 is new Groonga.
196
+ response2 = nil
197
+ if @options.verify_cancel?
198
+ request = groonga2_client.execute(command) do |response|
199
+ response2 = response
200
+ end
201
+ # Randomize timing of sending request_cancel command
202
+ sleep(rand(0..@options.cancel_max_wait))
203
+ @options.groonga2.create_client do |cancel_client|
204
+ cancel_client.execute("request_cancel", id: command.request_id)
205
+ end
206
+ request.wait
207
+
208
+ return if response2.return_code == GRN_CANCEL
209
+ else
210
+ response2 = groonga2_client.execute(command)
211
+ end
212
+
186
213
  compare_options = {
187
214
  :care_order => @options.care_order,
188
215
  :ignored_drilldown_keys => @options.ignored_drilldown_keys,
@@ -326,6 +353,8 @@ module GroongaQueryLog
326
353
  attr_writer :debug_rewrite
327
354
  attr_writer :omit_rate
328
355
  attr_accessor :max_limit
356
+ attr_writer :verify_cancel
357
+ attr_writer :cancel_max_wait
329
358
  def initialize
330
359
  @groonga1 = GroongaOptions.new
331
360
  @groonga2 = GroongaOptions.new
@@ -361,6 +390,8 @@ module GroongaQueryLog
361
390
  @debug_rewrite = false
362
391
  @omit_rate = 0.0
363
392
  @max_limit = -1
393
+ @verify_cancel = false
394
+ @cancel_max_wait = 5.0
364
395
  end
365
396
 
366
397
  def request_queue_size
@@ -460,6 +491,14 @@ module GroongaQueryLog
460
491
  def omit_rate
461
492
  @omit_rate
462
493
  end
494
+
495
+ def verify_cancel?
496
+ @verify_cancel
497
+ end
498
+
499
+ def cancel_max_wait
500
+ @cancel_max_wait
501
+ end
463
502
  end
464
503
 
465
504
  class GroongaOptions
@@ -152,6 +152,7 @@ module GroongaQueryLog
152
152
  operation_data["relative_elapsed"] = operation[:relative_elapsed_in_seconds]
153
153
  operation_data["context"] = operation[:context]
154
154
  operation_data["slow"] = operation[:slow?]
155
+ operation_data["n_records"] = operation[:n_records]
155
156
  operations << operation_data
156
157
  end
157
158
  data["operations"] = operations
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2020 Sutou Kouhei <kou@clear-code.com>
1
+ # Copyright (C) 2012-2021 Sutou Kouhei <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -15,5 +15,5 @@
15
15
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
  module GroongaQueryLog
18
- VERSION = "1.7.5"
18
+ VERSION = "1.7.7"
19
19
  end
@@ -1,5 +1,5 @@
1
1
  # Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
2
- # Copyright (C) 2014-2019 Sutou Kouhei <kou@clear-code.com>
2
+ # Copyright (C) 2014-2021 Sutou Kouhei <kou@clear-code.com>
3
3
  #
4
4
  # This library is free software; you can redistribute it and/or
5
5
  # modify it under the terms of the GNU Lesser General Public
@@ -42,6 +42,7 @@ class AnalyzerCommandTest < Test::Unit::TestCase
42
42
  end
43
43
 
44
44
  def test_no_specified
45
+ require_tty
45
46
  assert_equal("Error: Please specify input log files.\n",
46
47
  run_analyzer)
47
48
  end
@@ -1,5 +1,5 @@
1
1
  # Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
2
- # Copyright (C) 2015-2018 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2015-2021 Sutou Kouhei <kou@clear-code.com>
3
3
  #
4
4
  # This library is free software; you can redistribute it and/or
5
5
  # modify it under the terms of the GNU Lesser General Public
@@ -45,6 +45,7 @@ column_create --flags "COLUMN_SCALAR" --name "title" --table "Comments" --type "
45
45
  end
46
46
 
47
47
  def test_no_specified
48
+ require_tty
48
49
  assert_equal("Error: Please specify input log files.\n",
49
50
  run_extractor)
50
51
  end
@@ -1,2 +1,2 @@
1
1
  {"start_time":START_TIME,"end_time":END_TIME,"elapsed":0.003128856,"return_code":0,"slow":false,"command":{"raw":"load --table Video","name":"load","parameters":[{"key":"table","value":"Video"}]},"operations":[]}
2
- {"start_time":START_TIME,"end_time":END_TIME,"elapsed":0.00121714,"return_code":0,"slow":false,"command":{"raw":"select --table Users --query follower:@groonga --output_columns _key,name","name":"select","parameters":[{"key":"table","value":"Users"},{"key":"query","value":"follower:@groonga"},{"key":"output_columns","value":"_key,name"}]},"operations":[{"name":"filter","relative_elapsed":0.0008429529999999999,"context":"Users.follower match \"groonga\"","slow":false},{"name":"select","relative_elapsed":2.7947e-05,"context":null,"slow":false},{"name":"output","relative_elapsed":0.000195852,"context":"_key,name","slow":false}]}
2
+ {"start_time":START_TIME,"end_time":END_TIME,"elapsed":0.00121714,"return_code":0,"slow":false,"command":{"raw":"select --table Users --query follower:@groonga --output_columns _key,name","name":"select","parameters":[{"key":"table","value":"Users"},{"key":"query","value":"follower:@groonga"},{"key":"output_columns","value":"_key,name"}]},"operations":[{"name":"filter","relative_elapsed":0.0008429529999999999,"context":"Users.follower match \"groonga\"","slow":false,"n_records":2},{"name":"select","relative_elapsed":2.7947e-05,"context":null,"slow":false,"n_records":2},{"name":"output","relative_elapsed":0.000195852,"context":"_key,name","slow":false,"n_records":2}]}
@@ -1,4 +1,4 @@
1
1
  [
2
2
  {"start_time":START_TIME,"end_time":END_TIME,"elapsed":0.003128856,"return_code":0,"slow":false,"command":{"raw":"load --table Video","name":"load","parameters":[{"key":"table","value":"Video"}]},"operations":[]},
3
- {"start_time":START_TIME,"end_time":END_TIME,"elapsed":0.00121714,"return_code":0,"slow":false,"command":{"raw":"select --table Users --query follower:@groonga --output_columns _key,name","name":"select","parameters":[{"key":"table","value":"Users"},{"key":"query","value":"follower:@groonga"},{"key":"output_columns","value":"_key,name"}]},"operations":[{"name":"filter","relative_elapsed":0.0008429529999999999,"context":"Users.follower match \"groonga\"","slow":false},{"name":"select","relative_elapsed":2.7947e-05,"context":null,"slow":false},{"name":"output","relative_elapsed":0.000195852,"context":"_key,name","slow":false}]}
3
+ {"start_time":START_TIME,"end_time":END_TIME,"elapsed":0.00121714,"return_code":0,"slow":false,"command":{"raw":"select --table Users --query follower:@groonga --output_columns _key,name","name":"select","parameters":[{"key":"table","value":"Users"},{"key":"query","value":"follower:@groonga"},{"key":"output_columns","value":"_key,name"}]},"operations":[{"name":"filter","relative_elapsed":0.0008429529999999999,"context":"Users.follower match \"groonga\"","slow":false,"n_records":2},{"name":"select","relative_elapsed":2.7947e-05,"context":null,"slow":false,"n_records":2},{"name":"output","relative_elapsed":0.000195852,"context":"_key,name","slow":false,"n_records":2}]}
4
4
  ]
data/test/helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2011-2017 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2011-2021 Sutou Kouhei <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -29,6 +29,10 @@ module Helper
29
29
  end
30
30
 
31
31
  module Command
32
+ def require_tty
33
+ omit("Require tty") unless $stdin.tty?
34
+ end
35
+
32
36
  def open_error_output
33
37
  Tempfile.open("groonga-query-log.error") do |error|
34
38
  error.sync = true
@@ -51,7 +51,7 @@ class ReplayerTest < Test::Unit::TestCase
51
51
  :read_timeout => 60,
52
52
  }
53
53
  expected_open_options = default_options.merge(expected_options)
54
- mock(Groonga::Client).open(expected_open_options).yields(client) do
54
+ mock(Groonga::Client).open(**expected_open_options).yields(client) do
55
55
  client
56
56
  end
57
57
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groonga-query-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.5
4
+ version: 1.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-18 00:00:00.000000000 Z
11
+ date: 2024-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: charty
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: net-smtp
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: groonga-client
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -315,7 +329,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
315
329
  - !ruby/object:Gem::Version
316
330
  version: '0'
317
331
  requirements: []
318
- rubygems_version: 3.2.0.rc.2
332
+ rubygems_version: 3.3.5
319
333
  signing_key:
320
334
  specification_version: 4
321
335
  summary: Groonga-query-log is a collection of library and tools to process [Groonga](http://groonga.org/)'s