Commit cc9bb318 authored by Jacob Vosmaer's avatar Jacob Vosmaer Committed by Kerri Miller

Add cleanup migration for JobWaiter Redis keys

parent db3d0380
---
title: Add cleanup migration for JobWaiter Redis keys
merge_request: 43882
author:
type: fixed
# frozen_string_literal: true
class SetJobWaiterTtl < ActiveRecord::Migration[6.0]
DOWNTIME = false
SCRIPT = <<~LUA.freeze
if redis.call("ttl", KEYS[1]) < 0 then
redis.call("expire", KEYS[1], 21600)
end
LUA
def up
Gitlab::Redis::SharedState.with do |redis|
cursor_init = '0'
cursor = cursor_init
loop do
cursor, keys = redis.scan(cursor, match: 'gitlab:job_waiter:*')
redis.pipelined do |redis|
keys.each { |k| redis.eval(SCRIPT, keys: [k]) }
end
break if cursor == cursor_init
end
end
end
def down
end
end
febc66dbb48fbd281223ab9466cc5d94e945e8164fa9db0ee149c29e653b3eb2
\ No newline at end of file
# frozen_string_literal: true
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20200930144340_set_job_waiter_ttl.rb')
RSpec.describe SetJobWaiterTtl, :redis do
it 'sets TTLs where necessary' do
waiter_with_ttl = Gitlab::JobWaiter.new.key
waiter_without_ttl = Gitlab::JobWaiter.new.key
key_with_ttl = "foo:bar"
key_without_ttl = "foo:qux"
Gitlab::Redis::SharedState.with do |redis|
redis.set(waiter_with_ttl, "zzz", ex: 2000)
redis.set(waiter_without_ttl, "zzz")
redis.set(key_with_ttl, "zzz", ex: 2000)
redis.set(key_without_ttl, "zzz")
described_class.new.up
# This is the point of the migration. We know the migration uses a TTL of 21_600
expect(redis.ttl(waiter_without_ttl)).to be > 20_000
# Other TTL's should be untouched by the migration
expect(redis.ttl(waiter_with_ttl)).to be_between(1000, 2000)
expect(redis.ttl(key_with_ttl)).to be_between(1000, 2000)
expect(redis.ttl(key_without_ttl)).to eq(-1)
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment