Merge branch 'if-64315-mget_sessions_in_chunks' into 'master'

Do Redis lookup in batches in ActiveSession.sessions_from_ids

See merge request gitlab-org/gitlab-ce!30561
This commit is contained in:
Thong Kuah 2019-07-17 11:07:27 +00:00
commit 9c3dfd2085
3 changed files with 26 additions and 4 deletions

View File

@ -3,6 +3,8 @@
class ActiveSession
include ActiveModel::Model
SESSION_BATCH_SIZE = 200
attr_accessor :created_at, :updated_at,
:session_id, :ip_address,
:browser, :os, :device_name, :device_type,
@ -106,10 +108,12 @@ class ActiveSession
Gitlab::Redis::SharedState.with do |redis|
session_keys = session_ids.map { |session_id| "#{Gitlab::Redis::SharedState::SESSION_NAMESPACE}:#{session_id}" }
redis.mget(session_keys).compact.map do |raw_session|
# rubocop:disable Security/MarshalLoad
Marshal.load(raw_session)
# rubocop:enable Security/MarshalLoad
session_keys.each_slice(SESSION_BATCH_SIZE).flat_map do |session_keys_batch|
redis.mget(session_keys_batch).compact.map do |raw_session|
# rubocop:disable Security/MarshalLoad
Marshal.load(raw_session)
# rubocop:enable Security/MarshalLoad
end
end
end
end

View File

@ -0,0 +1,5 @@
---
title: Do Redis lookup in batches in ActiveSession.sessions_from_ids
merge_request: 30561
author:
type: performance

View File

@ -132,6 +132,19 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_shared_state do
expect(ActiveSession.sessions_from_ids([])).to eq([])
end
it 'uses redis lookup in batches' do
stub_const('ActiveSession::SESSION_BATCH_SIZE', 1)
redis = double(:redis)
expect(Gitlab::Redis::SharedState).to receive(:with).and_yield(redis)
sessions = ['session-a', 'session-b']
mget_responses = sessions.map { |session| [Marshal.dump(session)]}
expect(redis).to receive(:mget).twice.and_return(*mget_responses)
expect(ActiveSession.sessions_from_ids([1, 2])).to eql(sessions)
end
end
describe '.set' do