ci-queue 0.41.0 → 0.42.0

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
  SHA256:
3
- metadata.gz: 23effff409f076f80b7af3728d46a4122a59ca1a5a4c3bd1de5162250d60e72f
4
- data.tar.gz: ae3c402de5003a6acb3ad002305b85c092ae76d4850634892cab935e03d4479b
3
+ metadata.gz: fb0b6d2c1537200e0a3540652972d25456cda0fe2115a65a884c8f5feeb17ff7
4
+ data.tar.gz: 7ac240806fdf6f16edfa314c59dccb22b379dbc2795d23d0c4ad19f4a46956d1
5
5
  SHA512:
6
- metadata.gz: 0601ef053acbb457931feec6428c627cdc1ef3d8d3e76cdd54a98f02ef6f8f6f531a38be13dc3c40d2800ca0e9efe00c91c21a569470887978e8ba997880933a
7
- data.tar.gz: c95d7058762b67a059c4868b1d69a8fd99d5f6098d70fa08d71ec7533f7674b8c0886d1090c41db0ba200273b0cbb1c5fbb0fc12ecadddab04f2fb6a9ec950f3
6
+ metadata.gz: feaea129a7c672e57372e6475dc0fdc049c1e8b7815994b9ece3b4db0cbf6970ba19c222ed6bf9a652c7e68c7781e46edbd45e0eaa0da2b4e4d31b3856980aed
7
+ data.tar.gz: e2b9112e41b223c85b0acc20a7129d2ec517a816e73a42bea381ce696af8821dbaee1c5151d5002784630b1c0104b6c342d91b6273dd12de01c063d5bef5b1fe
@@ -46,7 +46,7 @@ module CI
46
46
  private
47
47
 
48
48
  def current_timestamp
49
- Time.now.to_i
49
+ CI::Queue.time_now.to_i
50
50
  end
51
51
  end
52
52
 
@@ -5,7 +5,7 @@ module CI
5
5
  attr_accessor :timeout, :worker_id, :max_requeues, :grind_count, :failure_file, :export_flaky_tests_file
6
6
  attr_accessor :requeue_tolerance, :namespace, :failing_test, :statsd_endpoint
7
7
  attr_accessor :max_test_duration, :max_test_duration_percentile, :track_test_duration
8
- attr_accessor :max_test_failed, :redis_ttl, :warnings_file
8
+ attr_accessor :max_test_failed, :redis_ttl, :warnings_file, :debug_log
9
9
  attr_reader :circuit_breakers
10
10
  attr_writer :seed, :build_id
11
11
  attr_writer :queue_init_timeout, :report_timeout, :inactive_workers_timeout
@@ -19,6 +19,7 @@ module CI
19
19
  flaky_tests: load_flaky_tests(env['CI_QUEUE_FLAKY_TESTS']),
20
20
  statsd_endpoint: env['CI_QUEUE_STATSD_ADDR'],
21
21
  redis_ttl: env['CI_QUEUE_REDIS_TTL']&.to_i || 8 * 60 * 60,
22
+ debug_log: env['CI_QUEUE_DEBUG_LOG'],
22
23
  )
23
24
  end
24
25
 
@@ -36,8 +37,7 @@ module CI
36
37
  grind_count: nil, max_duration: nil, failure_file: nil, max_test_duration: nil,
37
38
  max_test_duration_percentile: 0.5, track_test_duration: false, max_test_failed: nil,
38
39
  queue_init_timeout: nil, redis_ttl: 8 * 60 * 60, report_timeout: nil, inactive_workers_timeout: nil,
39
- export_flaky_tests_file: nil, warnings_file: nil
40
- )
40
+ export_flaky_tests_file: nil, warnings_file: nil, debug_log: nil)
41
41
  @build_id = build_id
42
42
  @circuit_breakers = [CircuitBreaker::Disabled]
43
43
  @failure_file = failure_file
@@ -62,6 +62,7 @@ module CI
62
62
  @inactive_workers_timeout = inactive_workers_timeout
63
63
  @export_flaky_tests_file = export_flaky_tests_file
64
64
  @warnings_file = warnings_file
65
+ @debug_log = debug_log
65
66
  end
66
67
 
67
68
  def queue_init_timeout
@@ -11,19 +11,50 @@ module CI
11
11
  ::SocketError, # https://github.com/redis/redis-rb/pull/631
12
12
  ].freeze
13
13
 
14
+ module RedisInstrumentation
15
+ def call(command, redis_config)
16
+ result = super
17
+ logger = redis_config.custom[:debug_log]
18
+ logger.info("#{command}: #{result}")
19
+ result
20
+ end
21
+
22
+ def call_pipelined(commands, redis_config)
23
+ result = super
24
+ logger = redis_config.custom[:debug_log]
25
+ logger.info("#{commands}: #{result}")
26
+ result
27
+ end
28
+ end
29
+
14
30
  def initialize(redis_url, config)
15
31
  @redis_url = redis_url
32
+ @config = config
16
33
  if ::Redis::VERSION > "5.0.0"
17
34
  @redis = ::Redis.new(
18
35
  url: redis_url,
19
36
  # Booting a CI worker is costly, so in case of a Redis blip,
20
37
  # it makes sense to retry for a while before giving up.
21
38
  reconnect_attempts: [0, 0, 0.1, 0.5, 1, 3, 5],
39
+ middlewares: custom_middlewares,
40
+ custom: custom_config,
22
41
  )
23
42
  else
24
43
  @redis = ::Redis.new(url: redis_url)
25
44
  end
26
- @config = config
45
+ end
46
+
47
+ def custom_config
48
+ return unless config.debug_log
49
+
50
+ require 'logger'
51
+ { debug_log: Logger.new(config.debug_log) }
52
+ end
53
+
54
+ def custom_middlewares
55
+ return unless config.debug_log
56
+
57
+ [RedisInstrumentation]
27
58
  end
28
59
 
29
60
  def exhausted?
@@ -32,7 +63,7 @@ module CI
32
63
 
33
64
  def expired?
34
65
  if (created_at = redis.get(key('created-at')))
35
- (created_at.to_f + config.redis_ttl + TEN_MINUTES) < Time.now.to_f
66
+ (created_at.to_f + config.redis_ttl + TEN_MINUTES) < CI::Queue.time_now.to_f
36
67
  else
37
68
  # if there is no created at set anymore we assume queue is expired
38
69
  true
@@ -46,7 +46,7 @@ module CI
46
46
 
47
47
  def active_workers?
48
48
  # if there are running jobs we assume there are still agents active
49
- redis.zrangebyscore(key('running'), Time.now.to_f - config.timeout, "+inf", limit: [0,1]).count > 0
49
+ redis.zrangebyscore(key('running'), CI::Queue.time_now.to_f - config.timeout, "+inf", limit: [0,1]).count > 0
50
50
  end
51
51
  end
52
52
  end
@@ -175,7 +175,7 @@ module CI
175
175
  key('worker', worker_id, 'queue'),
176
176
  key('owners'),
177
177
  ],
178
- argv: [Time.now.to_f],
178
+ argv: [CI::Queue.time_now.to_f],
179
179
  )
180
180
  end
181
181
 
@@ -188,7 +188,7 @@ module CI
188
188
  key('worker', worker_id, 'queue'),
189
189
  key('owners'),
190
190
  ],
191
- argv: [Time.now.to_f, timeout],
191
+ argv: [CI::Queue.time_now.to_f, timeout],
192
192
  )
193
193
 
194
194
  if lost_test
@@ -53,7 +53,7 @@ module CI
53
53
  end
54
54
 
55
55
  def expired?
56
- (@created_at.to_f TEN_MINUTES) < Time.now.to_f
56
+ (@created_at.to_f TEN_MINUTES) < CI::Queue.time_now.to_f
57
57
  end
58
58
 
59
59
  def populated?
@@ -2,7 +2,7 @@
2
2
 
3
3
  module CI
4
4
  module Queue
5
- VERSION = '0.41.0'
5
+ VERSION = '0.42.0'
6
6
  DEV_SCRIPTS_ROOT = ::File.expand_path('../../../../../redis', __FILE__)
7
7
  RELEASE_SCRIPTS_ROOT = ::File.expand_path('../redis', __FILE__)
8
8
  end
data/lib/ci/queue.rb CHANGED
@@ -24,6 +24,15 @@ module CI
24
24
  RESERVED_LOST_TEST = :RESERVED_LOST_TEST
25
25
  end
26
26
 
27
+ GET_NOW = ::Time.method(:now)
28
+ private_constant :GET_NOW
29
+ def time_now
30
+ # Mocks like freeze_time should be cleaned when ci-queue runs, however,
31
+ # we experienced cases when tests were enqueued with wrong timestamps, so we
32
+ # safeguard Time.now here.
33
+ GET_NOW.call
34
+ end
35
+
27
36
  def requeueable?(test_result)
28
37
  requeueable.nil? || requeueable.call(test_result)
29
38
  end
@@ -63,7 +63,7 @@ module Minitest
63
63
  end
64
64
  end
65
65
 
66
- queue.rescue_connection_errors { queue.created_at = Time.now.to_f }
66
+ queue.rescue_connection_errors { queue.created_at = CI::Queue.time_now.to_f }
67
67
 
68
68
  set_load_path
69
69
  Minitest.queue = queue
@@ -586,6 +586,10 @@ module Minitest
586
586
  self.verbose = true
587
587
  end
588
588
 
589
+ opts.on("--debug-log FILE", "Path to debug log file for e.g. Redis instrumentation") do |path|
590
+ queue_config.debug_log = path
591
+ end
592
+
589
593
  opts.separator ""
590
594
  opts.separator " retry: Replays a previous run in the same order."
591
595
 
@@ -187,7 +187,7 @@ module Minitest
187
187
  private
188
188
 
189
189
  def current_timestamp
190
- Time.now.to_i
190
+ CI::Queue.time_now.to_i
191
191
  end
192
192
  end
193
193
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ci-queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.41.0
4
+ version: 0.42.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-04 00:00:00.000000000 Z
11
+ date: 2024-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler