Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
8f5ebbe2c7
commit
ff490fb7df
|
|
@ -172,7 +172,6 @@ export default {
|
|||
treeWidth,
|
||||
diffFilesLength: 0,
|
||||
virtualScrollCurrentIndex: -1,
|
||||
disableVirtualScroller: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -414,6 +413,7 @@ export default {
|
|||
'setShowTreeList',
|
||||
'navigateToDiffFileIndex',
|
||||
'setFileByFile',
|
||||
'disableVirtualScroller',
|
||||
]),
|
||||
subscribeToEvents() {
|
||||
notesEventHub.$once('fetchDiffData', this.fetchData);
|
||||
|
|
@ -522,11 +522,11 @@ export default {
|
|||
// To make sure the user is using the find function we need to wait for blur
|
||||
// and max 1000ms to be sure it the search box is filtered
|
||||
if (delta >= 0 && delta < 1000) {
|
||||
this.disableVirtualScroller = true;
|
||||
this.disableVirtualScroller();
|
||||
|
||||
if (window.gon?.features?.diffSearchingUsageData) {
|
||||
api.trackRedisHllUserEvent('i_code_review_user_searches_diff');
|
||||
api.trackRedisCounterEvent('user_searches_diffs');
|
||||
api.trackRedisCounterEvent('diff_searches');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -651,7 +651,7 @@ export default {
|
|||
<div v-if="isBatchLoading" class="loading"><gl-loading-icon size="lg" /></div>
|
||||
<template v-else-if="renderDiffFiles">
|
||||
<dynamic-scroller
|
||||
v-if="!disableVirtualScroller && isVirtualScrollingEnabled"
|
||||
v-if="isVirtualScrollingEnabled"
|
||||
ref="virtualScroller"
|
||||
:items="diffs"
|
||||
:min-item-size="70"
|
||||
|
|
|
|||
|
|
@ -520,14 +520,14 @@ export const toggleActiveFileByHash = ({ commit }, hash) => {
|
|||
commit(types.VIEW_DIFF_FILE, hash);
|
||||
};
|
||||
|
||||
export const scrollToFile = ({ state, commit }, path) => {
|
||||
export const scrollToFile = ({ state, commit, getters }, path) => {
|
||||
if (!state.treeEntries[path]) return;
|
||||
|
||||
const { fileHash } = state.treeEntries[path];
|
||||
|
||||
commit(types.VIEW_DIFF_FILE, fileHash);
|
||||
|
||||
if (window.gon?.features?.diffsVirtualScrolling) {
|
||||
if (getters.isVirtualScrollingEnabled) {
|
||||
eventHub.$emit('scrollToFileHash', fileHash);
|
||||
|
||||
setTimeout(() => {
|
||||
|
|
@ -535,6 +535,10 @@ export const scrollToFile = ({ state, commit }, path) => {
|
|||
});
|
||||
} else {
|
||||
document.location.hash = fileHash;
|
||||
|
||||
setTimeout(() => {
|
||||
handleLocationHash();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -844,3 +848,5 @@ export function reviewFile({ commit, state }, { file, reviewed = true }) {
|
|||
setReviewsForMergeRequest(mrPath, reviews);
|
||||
commit(types.SET_MR_FILE_REVIEWS, reviews);
|
||||
}
|
||||
|
||||
export const disableVirtualScroller = ({ commit }) => commit(types.DISABLE_VIRTUAL_SCROLLING);
|
||||
|
|
|
|||
|
|
@ -177,6 +177,10 @@ export function suggestionCommitMessage(state, _, rootState) {
|
|||
export const isVirtualScrollingEnabled = (state) => {
|
||||
const vSrollerCookie = Cookies.get('diffs_virtual_scrolling');
|
||||
|
||||
if (state.disableVirtualScroller) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (vSrollerCookie) {
|
||||
return vSrollerCookie === 'true';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,4 +43,5 @@ export default () => ({
|
|||
defaultSuggestionCommitMessage: '',
|
||||
mrReviews: {},
|
||||
latestDiff: true,
|
||||
disableVirtualScroller: false,
|
||||
});
|
||||
|
|
|
|||
|
|
@ -47,3 +47,4 @@ export const SET_DIFF_FILE_VIEWER = 'SET_DIFF_FILE_VIEWER';
|
|||
export const SET_SHOW_SUGGEST_POPOVER = 'SET_SHOW_SUGGEST_POPOVER';
|
||||
|
||||
export const TOGGLE_LINE_DISCUSSIONS = 'TOGGLE_LINE_DISCUSSIONS';
|
||||
export const DISABLE_VIRTUAL_SCROLLING = 'DISABLE_VIRTUAL_SCROLLING';
|
||||
|
|
|
|||
|
|
@ -362,4 +362,7 @@ export default {
|
|||
[types.SET_MR_FILE_REVIEWS](state, newReviews) {
|
||||
state.mrReviews = newReviews;
|
||||
},
|
||||
[types.DISABLE_VIRTUAL_SCROLLING](state) {
|
||||
state.disableVirtualScroller = true;
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7,19 +7,17 @@ module Gitlab
|
|||
#
|
||||
# Each host in the load balancer uses the same credentials as the primary
|
||||
# database.
|
||||
#
|
||||
# This class *requires* that `ActiveRecord::Base.retrieve_connection`
|
||||
# always returns a connection to the primary.
|
||||
class LoadBalancer
|
||||
CACHE_KEY = :gitlab_load_balancer_host
|
||||
|
||||
attr_reader :host_list
|
||||
|
||||
# hosts - The hostnames/addresses of the additional databases.
|
||||
def initialize(hosts = [])
|
||||
def initialize(hosts = [], model = ActiveRecord::Base)
|
||||
@host_list = HostList.new(hosts.map { |addr| Host.new(addr, self) })
|
||||
@connection_db_roles = {}.compare_by_identity
|
||||
@connection_db_roles_count = {}.compare_by_identity
|
||||
@model = model
|
||||
end
|
||||
|
||||
# Yields a connection that can be used for reads.
|
||||
|
|
@ -94,7 +92,7 @@ module Gitlab
|
|||
# Instead of immediately grinding to a halt we'll retry the operation
|
||||
# a few times.
|
||||
retry_with_backoff do
|
||||
connection = ActiveRecord::Base.retrieve_connection
|
||||
connection = pool.connection
|
||||
track_connection_role(connection, ROLE_PRIMARY)
|
||||
|
||||
yield connection
|
||||
|
|
@ -109,7 +107,7 @@ module Gitlab
|
|||
def db_role_for_connection(connection)
|
||||
return @connection_db_roles[connection] if @connection_db_roles[connection]
|
||||
return ROLE_REPLICA if @host_list.manage_pool?(connection.pool)
|
||||
return ROLE_PRIMARY if connection.pool == ActiveRecord::Base.connection_pool
|
||||
return ROLE_PRIMARY if connection.pool == pool
|
||||
end
|
||||
|
||||
# Returns a host to use for queries.
|
||||
|
|
@ -117,21 +115,21 @@ module Gitlab
|
|||
# Hosts are scoped per thread so that multiple threads don't
|
||||
# accidentally re-use the same host + connection.
|
||||
def host
|
||||
RequestStore[CACHE_KEY] ||= @host_list.next
|
||||
request_cache[CACHE_KEY] ||= @host_list.next
|
||||
end
|
||||
|
||||
# Releases the host and connection for the current thread.
|
||||
def release_host
|
||||
if host = RequestStore[CACHE_KEY]
|
||||
if host = request_cache[CACHE_KEY]
|
||||
host.disable_query_cache!
|
||||
host.release_connection
|
||||
end
|
||||
|
||||
RequestStore.delete(CACHE_KEY)
|
||||
request_cache.delete(CACHE_KEY)
|
||||
end
|
||||
|
||||
def release_primary_connection
|
||||
ActiveRecord::Base.connection_pool.release_connection
|
||||
pool.release_connection
|
||||
end
|
||||
|
||||
# Returns the transaction write location of the primary.
|
||||
|
|
@ -152,7 +150,7 @@ module Gitlab
|
|||
|
||||
return false unless host
|
||||
|
||||
RequestStore[CACHE_KEY] = host
|
||||
request_cache[CACHE_KEY] = host
|
||||
|
||||
true
|
||||
end
|
||||
|
|
@ -209,6 +207,17 @@ module Gitlab
|
|||
|
||||
private
|
||||
|
||||
# ActiveRecord::ConnectionAdapters::ConnectionHandler handles fetching,
|
||||
# and caching for connections pools for each "connection", so we
|
||||
# leverage that.
|
||||
def pool
|
||||
ActiveRecord::Base.connection_handler.retrieve_connection_pool(
|
||||
@model.connection_specification_name,
|
||||
role: ActiveRecord::Base.writing_role,
|
||||
shard: ActiveRecord::Base.default_shard
|
||||
)
|
||||
end
|
||||
|
||||
def ensure_caching!
|
||||
host.enable_query_cache! unless host.query_cache_enabled
|
||||
end
|
||||
|
|
@ -228,6 +237,11 @@ module Gitlab
|
|||
@connection_db_roles_count.delete(connection)
|
||||
end
|
||||
end
|
||||
|
||||
def request_cache
|
||||
base = RequestStore[:gitlab_load_balancer] ||= {}
|
||||
base[pool] ||= {}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -9229,6 +9229,9 @@ msgstr ""
|
|||
msgid "Could not draw the lines for job relationships"
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not fetch policy because existing policy YAML is invalid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not find design."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -17987,6 +17990,9 @@ msgstr ""
|
|||
msgid "Invalid pod_name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid policy type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid query"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -24906,6 +24912,9 @@ msgstr ""
|
|||
msgid "Policies"
|
||||
msgstr ""
|
||||
|
||||
msgid "Policy management project does have any policies in %{policy_path}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Policy project doesn't exist"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -25671,6 +25680,9 @@ msgstr ""
|
|||
msgid "Project does not exist or you don't have permission to perform this action"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project does not have a policy configuration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project export could not be deleted."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -29430,6 +29442,9 @@ msgstr ""
|
|||
msgid "SecurityPolicies|Description"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityPolicies|Edit policy"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityPolicies|Enforcement status"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -29442,6 +29457,9 @@ msgstr ""
|
|||
msgid "SecurityPolicies|Network"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityPolicies|Policies"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityPolicies|Policy type"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -30372,6 +30390,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Settings|Unable to load the merge request options settings. Try reloading the page."
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -40064,6 +40085,9 @@ msgstr ""
|
|||
msgid "type must be Debian"
|
||||
msgstr ""
|
||||
|
||||
msgid "type parameter is missing and is required"
|
||||
msgstr ""
|
||||
|
||||
msgid "unicode domains should use IDNA encoding"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -874,6 +874,7 @@ describe('DiffsStoreActions', () => {
|
|||
|
||||
describe('scrollToFile', () => {
|
||||
let commit;
|
||||
const getters = { isVirtualScrollingEnabled: false };
|
||||
|
||||
beforeEach(() => {
|
||||
commit = jest.fn();
|
||||
|
|
@ -888,7 +889,7 @@ describe('DiffsStoreActions', () => {
|
|||
},
|
||||
};
|
||||
|
||||
scrollToFile({ state, commit }, 'path');
|
||||
scrollToFile({ state, commit, getters }, 'path');
|
||||
|
||||
expect(document.location.hash).toBe('#test');
|
||||
});
|
||||
|
|
@ -902,7 +903,7 @@ describe('DiffsStoreActions', () => {
|
|||
},
|
||||
};
|
||||
|
||||
scrollToFile({ state, commit }, 'path');
|
||||
scrollToFile({ state, commit, getters }, 'path');
|
||||
|
||||
expect(commit).toHaveBeenCalledWith(types.VIEW_DIFF_FILE, 'test');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
|
|||
let(:conflict_error) { Class.new(RuntimeError) }
|
||||
|
||||
let(:lb) { described_class.new(%w(localhost localhost)) }
|
||||
let(:request_cache) { lb.send(:request_cache) }
|
||||
|
||||
before do
|
||||
allow(Gitlab::Database.main).to receive(:create_connection_pool)
|
||||
|
|
@ -123,8 +124,9 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
|
|||
|
||||
describe '#read_write' do
|
||||
it 'yields a connection for a write' do
|
||||
expect { |b| lb.read_write(&b) }
|
||||
.to yield_with_args(ActiveRecord::Base.retrieve_connection)
|
||||
connection = ActiveRecord::Base.connection_pool.connection
|
||||
|
||||
expect { |b| lb.read_write(&b) }.to yield_with_args(connection)
|
||||
end
|
||||
|
||||
it 'uses a retry with exponential backoffs' do
|
||||
|
|
@ -260,13 +262,24 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
|
|||
end
|
||||
|
||||
it 'stores the host in a thread-local variable' do
|
||||
RequestStore.delete(described_class::CACHE_KEY)
|
||||
request_cache.delete(described_class::CACHE_KEY)
|
||||
|
||||
expect(lb.host_list).to receive(:next).once.and_call_original
|
||||
|
||||
lb.host
|
||||
lb.host
|
||||
end
|
||||
|
||||
it 'does not create conflicts with other load balancers when caching hosts' do
|
||||
lb1 = described_class.new(%w(localhost localhost), ActiveRecord::Base)
|
||||
lb2 = described_class.new(%w(localhost localhost), Ci::CiDatabaseRecord)
|
||||
|
||||
host1 = lb1.host
|
||||
host2 = lb2.host
|
||||
|
||||
expect(lb1.send(:request_cache)[described_class::CACHE_KEY]).to eq(host1)
|
||||
expect(lb2.send(:request_cache)[described_class::CACHE_KEY]).to eq(host2)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#release_host' do
|
||||
|
|
@ -277,7 +290,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
|
|||
|
||||
lb.release_host
|
||||
|
||||
expect(RequestStore[described_class::CACHE_KEY]).to be_nil
|
||||
expect(request_cache[described_class::CACHE_KEY]).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -415,7 +428,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
|
|||
describe '#select_up_to_date_host' do
|
||||
let(:location) { 'AB/12345'}
|
||||
let(:hosts) { lb.host_list.hosts }
|
||||
let(:set_host) { RequestStore[described_class::CACHE_KEY] }
|
||||
let(:set_host) { request_cache[described_class::CACHE_KEY] }
|
||||
|
||||
subject { lb.select_up_to_date_host(location) }
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue