groonga-query-log 1.6.5 → 1.7.0
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 +4 -4
- data/doc/text/news.md +44 -0
- data/lib/groonga-query-log/command/extract.rb +2 -0
- data/lib/groonga-query-log/command/format-regression-test-logs.rb +24 -2
- data/lib/groonga-query-log/command/run-regression-test.rb +46 -35
- data/lib/groonga-query-log/formattable.rb +7 -0
- data/lib/groonga-query-log/performance-verifier.rb +15 -4
- data/lib/groonga-query-log/server-verifier.rb +42 -13
- data/lib/groonga-query-log/version.rb +1 -1
- data/test/command/test-format-regression-test-logs.rb +20 -2
- data/test/fixtures/regression-test-logs/slow-elapsed-times.log +6 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 137657847fe22ae9bd436e1a2a99467c93cc7134cde90f710451f1d6c205c083
|
4
|
+
data.tar.gz: 68455fe3c51c12a8b1ee1a5106d99ff86a52b14eebbd2077b2284523fe560498
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: baa54b40acddcb3c6b2fe46a4a7566eb402dc4f1be8327200832614ee3274e6de49116b644bf149c7d87dcc58f920e61ddb81a5c0486c4648164bc6a3503d4f9
|
7
|
+
data.tar.gz: 747d1d1fc84cbeabf2445882e7d70274c6b94994787ea056150c9a18f661992436a29acded2d19cb0a152a2159ef0d7c29dca9e0b8690f82564873f31f99ef35
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,49 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 1.7.0: 2020-05-31
|
4
|
+
|
5
|
+
### Fixes
|
6
|
+
|
7
|
+
* `server-verifier`: Fixed a bug that performance verification
|
8
|
+
doesn't work.
|
9
|
+
|
10
|
+
## 1.6.9: 2020-05-30
|
11
|
+
|
12
|
+
### Fixes
|
13
|
+
|
14
|
+
* `server-verifier`: Fixed a bug that performance verification
|
15
|
+
doesn't work.
|
16
|
+
|
17
|
+
## 1.6.8: 2020-05-30
|
18
|
+
|
19
|
+
### Improvements
|
20
|
+
|
21
|
+
* `server-verifier`: Stopped sorting elapsed times.
|
22
|
+
|
23
|
+
* `run-regression-test`: Ensured killing Groonga server on start up
|
24
|
+
error.
|
25
|
+
|
26
|
+
## 1.6.7: 2020-05-30
|
27
|
+
|
28
|
+
### Improvements
|
29
|
+
|
30
|
+
* `extract`: Added support for no command request case such as `/`.
|
31
|
+
|
32
|
+
* `server-verifier`: Reduced the number of requests for performance
|
33
|
+
verification.
|
34
|
+
|
35
|
+
* `server-verifier`: Added all elapsed times on slow.
|
36
|
+
|
37
|
+
* `format-regression-test-logs`: Added support for all elapsed times
|
38
|
+
on slow.
|
39
|
+
|
40
|
+
## 1.6.6: 2020-05-20
|
41
|
+
|
42
|
+
### Fixes
|
43
|
+
|
44
|
+
* `run-regression-test`: Fixed a bug that
|
45
|
+
`--old-groonga-warm-up-command` is ignored.
|
46
|
+
|
3
47
|
## 1.6.5: 2020-05-19
|
4
48
|
|
5
49
|
### Improvements
|
@@ -74,6 +74,8 @@ module GroongaQueryLog
|
|
74
74
|
elapsed_time_old = nil
|
75
75
|
elapsed_time_new = nil
|
76
76
|
elapsed_time_ratio = nil
|
77
|
+
elapsed_times_old = nil
|
78
|
+
elapsed_times_new = nil
|
77
79
|
|
78
80
|
input.each_line do |line|
|
79
81
|
unless line.valid_encoding?
|
@@ -100,11 +102,21 @@ module GroongaQueryLog
|
|
100
102
|
elapsed_time_old = Float($POSTMATCH.chomp)
|
101
103
|
when /\Aelapsed_time_new: /
|
102
104
|
elapsed_time_new = Float($POSTMATCH.chomp)
|
105
|
+
when /\Aelapsed_times_old: /
|
106
|
+
elapsed_times_old = $POSTMATCH.chomp.split.collect do |value|
|
107
|
+
Float(value)
|
108
|
+
end
|
109
|
+
when /\Aelapsed_times_new: /
|
110
|
+
elapsed_times_new = $POSTMATCH.chomp.split.collect do |value|
|
111
|
+
Float(value)
|
112
|
+
end
|
103
113
|
when /\Aelapsed_time_ratio: /
|
104
114
|
elapsed_time_ratio = Float($POSTMATCH.chomp)
|
105
115
|
report_slow(command,
|
106
116
|
elapsed_time_old,
|
107
117
|
elapsed_time_new,
|
118
|
+
elapsed_times_old,
|
119
|
+
elapsed_times_new,
|
108
120
|
elapsed_time_ratio)
|
109
121
|
end
|
110
122
|
end
|
@@ -196,11 +208,21 @@ module GroongaQueryLog
|
|
196
208
|
def report_slow(command,
|
197
209
|
elapsed_time_old,
|
198
210
|
elapsed_time_new,
|
211
|
+
elapsed_times_old,
|
212
|
+
elapsed_times_new,
|
199
213
|
elapsed_time_ratio)
|
200
214
|
report_command(command)
|
215
|
+
elapsed_times_old ||= [elapsed_time_old]
|
216
|
+
elapsed_times_new ||= [elapsed_time_new]
|
201
217
|
@output.puts("Slow:")
|
202
|
-
@output.puts(" Old: %s" %
|
203
|
-
|
218
|
+
@output.puts(" Old: %s (%s)" % [
|
219
|
+
format_elapsed_time(elapsed_time_old),
|
220
|
+
format_elapsed_times(elapsed_times_old),
|
221
|
+
])
|
222
|
+
@output.puts(" New: %s (%s)" % [
|
223
|
+
format_elapsed_time(elapsed_time_new),
|
224
|
+
format_elapsed_times(elapsed_times_new),
|
225
|
+
])
|
204
226
|
@output.puts(" Ratio: +%.1f%%" % ((elapsed_time_ratio * 100) - 100))
|
205
227
|
end
|
206
228
|
|
@@ -212,7 +212,7 @@ module GroongaQueryLog
|
|
212
212
|
@new_groonga_env[key] = value
|
213
213
|
end
|
214
214
|
|
215
|
-
parser.on("--
|
215
|
+
parser.on("--new-groonga-warm-up-commands=COMMAND",
|
216
216
|
"Run COMMAND before running tests to warm new groonga up",
|
217
217
|
"You can specify this option multiple times",
|
218
218
|
"to specify multiple warm up commands",
|
@@ -559,6 +559,7 @@ module GroongaQueryLog
|
|
559
559
|
@host = "127.0.0.1"
|
560
560
|
@port = find_unused_port
|
561
561
|
@options = options
|
562
|
+
@pid = nil
|
562
563
|
end
|
563
564
|
|
564
565
|
def run
|
@@ -579,25 +580,28 @@ module GroongaQueryLog
|
|
579
580
|
spawn_args << @database_path.to_s
|
580
581
|
@pid = spawn(*spawn_args)
|
581
582
|
|
582
|
-
n_retries = 10
|
583
583
|
begin
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
584
|
+
n_retries = 60
|
585
|
+
begin
|
586
|
+
send_command("status")
|
587
|
+
rescue SystemCallError
|
588
|
+
sleep(1)
|
589
|
+
n_retries -= 1
|
590
|
+
raise if n_retries.zero?
|
591
|
+
retry
|
592
|
+
end
|
591
593
|
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
594
|
+
if @options[:warm_up]
|
595
|
+
send_command("dump?dump_records=no")
|
596
|
+
warm_up_commands = @options[:warm_up_commands] || []
|
597
|
+
warm_up_commands.each do |command|
|
598
|
+
send_command(command)
|
599
|
+
end
|
597
600
|
end
|
601
|
+
rescue
|
602
|
+
shutdown
|
603
|
+
raise
|
598
604
|
end
|
599
|
-
|
600
|
-
yield if block_given?
|
601
605
|
end
|
602
606
|
|
603
607
|
def ensure_database
|
@@ -688,11 +692,14 @@ module GroongaQueryLog
|
|
688
692
|
end
|
689
693
|
|
690
694
|
def shutdown
|
695
|
+
return if @pid.nil?
|
691
696
|
begin
|
692
697
|
send_command("shutdown")
|
693
698
|
rescue SystemCallError
|
699
|
+
Process.kill(:KILL, @pid)
|
694
700
|
end
|
695
701
|
Process.waitpid(@pid)
|
702
|
+
@pid = nil
|
696
703
|
end
|
697
704
|
|
698
705
|
def n_leaked_objects
|
@@ -769,7 +776,6 @@ module GroongaQueryLog
|
|
769
776
|
@n_clients = options[:n_clients] || 1
|
770
777
|
@stop_on_failure = options[:stop_on_failure]
|
771
778
|
@options = options
|
772
|
-
@n_ready_waits = 2
|
773
779
|
@n_executed_commands = 0
|
774
780
|
end
|
775
781
|
|
@@ -777,21 +783,39 @@ module GroongaQueryLog
|
|
777
783
|
@old.ensure_database
|
778
784
|
@new.ensure_database
|
779
785
|
|
786
|
+
ready_queue = Thread::Queue.new
|
787
|
+
wait_queue = Thread::Queue.new
|
780
788
|
old_thread = Thread.new do
|
781
|
-
@old.run
|
782
|
-
|
789
|
+
@old.run
|
790
|
+
begin
|
791
|
+
ready_queue.push(true)
|
792
|
+
wait_queue.pop
|
793
|
+
ensure
|
794
|
+
@old.shutdown
|
783
795
|
end
|
784
796
|
end
|
785
797
|
new_thread = Thread.new do
|
786
|
-
@new.run
|
787
|
-
|
798
|
+
@new.run
|
799
|
+
begin
|
800
|
+
ready_queue.push(true)
|
801
|
+
wait_queue.pop
|
802
|
+
ensure
|
803
|
+
@new.shutdown
|
788
804
|
end
|
789
805
|
end
|
806
|
+
test_thread = Thread.new do
|
807
|
+
ready_queue.pop
|
808
|
+
ready_queue.pop
|
809
|
+
run_test
|
810
|
+
wait_queue.push(true)
|
811
|
+
wait_queue.push(true)
|
812
|
+
end
|
790
813
|
|
791
814
|
old_thread_success = old_thread.value
|
792
815
|
new_thread_success = new_thread.value
|
816
|
+
test_thread_success = test_thread.value
|
793
817
|
|
794
|
-
old_thread_success and new_thread_success
|
818
|
+
old_thread_success and new_thread_success and test_thread_success
|
795
819
|
end
|
796
820
|
|
797
821
|
def n_executed_commands
|
@@ -800,9 +824,6 @@ module GroongaQueryLog
|
|
800
824
|
|
801
825
|
private
|
802
826
|
def run_test
|
803
|
-
@n_ready_waits -= 1
|
804
|
-
return true unless @n_ready_waits.zero?
|
805
|
-
|
806
827
|
same = true
|
807
828
|
query_log_paths.each do |query_log_path|
|
808
829
|
log_path = test_log_path(query_log_path)
|
@@ -835,16 +856,6 @@ module GroongaQueryLog
|
|
835
856
|
puts("Interrupt: #{query_log_path}")
|
836
857
|
end
|
837
858
|
end
|
838
|
-
|
839
|
-
old_thread = Thread.new do
|
840
|
-
@old.shutdown
|
841
|
-
end
|
842
|
-
new_thread = Thread.new do
|
843
|
-
@new.shutdown
|
844
|
-
end
|
845
|
-
old_thread.join
|
846
|
-
new_thread.join
|
847
|
-
|
848
859
|
same
|
849
860
|
end
|
850
861
|
|
@@ -30,5 +30,12 @@ module GroongaQueryLog
|
|
30
30
|
"%.1fmin" % (elapsed_time / 60)
|
31
31
|
end
|
32
32
|
end
|
33
|
+
|
34
|
+
def format_elapsed_times(elapsed_times)
|
35
|
+
formatted_epalsed_times = elapsed_times.collect do |elapsed_time|
|
36
|
+
format_elapsed_time(elapsed_time)
|
37
|
+
end
|
38
|
+
formatted_epalsed_times.join(" ")
|
39
|
+
end
|
33
40
|
end
|
34
41
|
end
|
@@ -47,10 +47,18 @@ module GroongaQueryLog
|
|
47
47
|
diff_ratio > @threshold_ratio
|
48
48
|
end
|
49
49
|
|
50
|
+
def old_elapsed_times
|
51
|
+
collect_elapsed_times(@old_responses)
|
52
|
+
end
|
53
|
+
|
50
54
|
def old_elapsed_time
|
51
55
|
choose_target_elapsed_time(@old_responses)
|
52
56
|
end
|
53
57
|
|
58
|
+
def new_elapsed_times
|
59
|
+
collect_elapsed_times(@new_responses)
|
60
|
+
end
|
61
|
+
|
54
62
|
def new_elapsed_time
|
55
63
|
choose_target_elapsed_time(@new_responses)
|
56
64
|
end
|
@@ -66,18 +74,21 @@ module GroongaQueryLog
|
|
66
74
|
end
|
67
75
|
end
|
68
76
|
|
69
|
-
def
|
70
|
-
|
77
|
+
def collect_elapsed_times(responses)
|
78
|
+
responses.collect do |response|
|
71
79
|
response.elapsed_time
|
72
80
|
end
|
73
|
-
|
81
|
+
end
|
82
|
+
|
83
|
+
def choose_target_elapsed_time(responses)
|
84
|
+
sorted_elapsed_times = collect_elapsed_times(responses).sort
|
74
85
|
|
75
86
|
strategy = @options.choose_strategy
|
76
87
|
case strategy
|
77
88
|
when :fastest
|
78
89
|
sorted_elapsed_times.first
|
79
90
|
when :median
|
80
|
-
sorted_elapsed_times[
|
91
|
+
sorted_elapsed_times[sorted_elapsed_times.size / 2]
|
81
92
|
else
|
82
93
|
message =
|
83
94
|
"choose strategy must be :fastest or :median: #{strategy.inspect}"
|
@@ -187,24 +187,46 @@ module GroongaQueryLog
|
|
187
187
|
return
|
188
188
|
end
|
189
189
|
|
190
|
-
|
190
|
+
if @options.verify_performance?
|
191
|
+
verify_performance(command,
|
192
|
+
groonga1_client,
|
193
|
+
groonga2_client,
|
194
|
+
response1,
|
195
|
+
response2)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def verify_performance(command,
|
200
|
+
groonga1_client,
|
201
|
+
groonga2_client,
|
202
|
+
response1,
|
203
|
+
response2)
|
191
204
|
responses1 = [response1]
|
192
205
|
responses2 = [response2]
|
193
|
-
n_tries = 4
|
194
|
-
n_tries.times do
|
195
|
-
responses1 << groonga1_client.execute(command)
|
196
|
-
responses2 << groonga2_client.execute(command)
|
197
|
-
end
|
198
206
|
verifier = PerformanceVerifier.new(command,
|
199
207
|
responses1,
|
200
208
|
responses2,
|
201
209
|
@options.performance_verifier_options)
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
210
|
+
return unless verifier.slow?
|
211
|
+
|
212
|
+
n_tries = 4
|
213
|
+
n_tries.times do
|
214
|
+
responses1 << groonga1_client.execute(command)
|
215
|
+
responses2 << groonga2_client.execute(command)
|
216
|
+
verifier = PerformanceVerifier.new(command,
|
217
|
+
responses1,
|
218
|
+
responses2,
|
219
|
+
@options.performance_verifier_options)
|
220
|
+
if verifier.slow?
|
221
|
+
@slow = true
|
222
|
+
@events.push([:slow,
|
223
|
+
command,
|
224
|
+
verifier.old_elapsed_time,
|
225
|
+
verifier.new_elapsed_time,
|
226
|
+
verifier.old_elapsed_times,
|
227
|
+
verifier.new_elapsed_times])
|
228
|
+
return
|
229
|
+
end
|
208
230
|
end
|
209
231
|
end
|
210
232
|
|
@@ -233,11 +255,18 @@ module GroongaQueryLog
|
|
233
255
|
output.flush
|
234
256
|
end
|
235
257
|
|
236
|
-
def report_slow(output,
|
258
|
+
def report_slow(output,
|
259
|
+
command,
|
260
|
+
old_elapsed_time,
|
261
|
+
new_elapsed_time,
|
262
|
+
old_elapsed_times,
|
263
|
+
new_elapsed_times)
|
237
264
|
command_source = command.original_source || command.to_uri_format
|
238
265
|
output.puts("command: #{command_source}")
|
239
266
|
output.puts("elapsed_time_old: #{old_elapsed_time}")
|
240
267
|
output.puts("elapsed_time_new: #{new_elapsed_time}")
|
268
|
+
output.puts("elapsed_times_old: #{old_elapsed_times.join(' ')}")
|
269
|
+
output.puts("elapsed_times_new: #{new_elapsed_times.join(' ')}")
|
241
270
|
output.puts("elapsed_time_ratio: #{new_elapsed_time / old_elapsed_time}")
|
242
271
|
output.flush
|
243
272
|
end
|
@@ -109,14 +109,32 @@ Arguments:
|
|
109
109
|
query: column_create
|
110
110
|
table: Entries
|
111
111
|
Slow:
|
112
|
-
Old: 174.8usec
|
113
|
-
New: 201.7usec
|
112
|
+
Old: 174.8usec (174.8usec)
|
113
|
+
New: 201.7usec (201.7usec)
|
114
114
|
Ratio: +15.4%
|
115
115
|
OUTPUT
|
116
116
|
assert_equal([true, output],
|
117
117
|
run_command([fixture_path("slow.log")]))
|
118
118
|
end
|
119
119
|
|
120
|
+
def test_slow_elapsed_times
|
121
|
+
output = <<-OUTPUT
|
122
|
+
Command:
|
123
|
+
/d/select?match_columns=description&query=column_create&table=Entries
|
124
|
+
Name: select
|
125
|
+
Arguments:
|
126
|
+
match_columns: description
|
127
|
+
query: column_create
|
128
|
+
table: Entries
|
129
|
+
Slow:
|
130
|
+
Old: 174.8usec (174.8usec 184.8usec)
|
131
|
+
New: 201.7usec (201.7usec 211.7usec)
|
132
|
+
Ratio: +15.4%
|
133
|
+
OUTPUT
|
134
|
+
assert_equal([true, output],
|
135
|
+
run_command([fixture_path("slow-elapsed-times.log")]))
|
136
|
+
end
|
137
|
+
|
120
138
|
sub_test_case(".new") do
|
121
139
|
def setup
|
122
140
|
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
command: /d/select?match_columns=description&query=column_create&table=Entries
|
2
|
+
elapsed_time_old: 0.0001747608184814453
|
3
|
+
elapsed_time_new: 0.0002017021179199219
|
4
|
+
elapsed_times_old: 0.0001747608184814453 0.0001847608184814453
|
5
|
+
elapsed_times_new: 0.0002017021179199219 0.0002117021179199219
|
6
|
+
elapsed_time_ratio: 1.154160982264666
|
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.
|
4
|
+
version: 1.7.0
|
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-05-
|
11
|
+
date: 2020-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: charty
|
@@ -272,6 +272,7 @@ files:
|
|
272
272
|
- test/fixtures/query.log
|
273
273
|
- test/fixtures/regression-test-logs/command-format.log
|
274
274
|
- test/fixtures/regression-test-logs/error.log
|
275
|
+
- test/fixtures/regression-test-logs/slow-elapsed-times.log
|
275
276
|
- test/fixtures/regression-test-logs/slow.log
|
276
277
|
- test/fixtures/regression-test-logs/url-format.log
|
277
278
|
- test/fixtures/reporter/console.expected
|
@@ -345,6 +346,7 @@ test_files:
|
|
345
346
|
- test/fixtures/query.log
|
346
347
|
- test/fixtures/regression-test-logs/command-format.log
|
347
348
|
- test/fixtures/regression-test-logs/error.log
|
349
|
+
- test/fixtures/regression-test-logs/slow-elapsed-times.log
|
348
350
|
- test/fixtures/regression-test-logs/slow.log
|
349
351
|
- test/fixtures/regression-test-logs/url-format.log
|
350
352
|
- test/fixtures/reporter/console.expected
|