Commit da84e420 authored by 🤖 GitLab Bot 🤖's avatar 🤖 GitLab Bot 🤖

Merge branch 'ce-to-ee-2018-11-20' into 'master'

CE upstream - 2018-11-20 07:15 UTC

See merge request gitlab-org/gitlab-ee!8526
parents f382173e 3dda245a
...@@ -401,7 +401,7 @@ group :test do ...@@ -401,7 +401,7 @@ group :test do
gem 'rails-controller-testing' if rails5? # Rails5 only gem. gem 'rails-controller-testing' if rails5? # Rails5 only gem.
gem 'test_after_commit', '~> 1.1' unless rails5? # Remove this gem when migrated to rails 5.0. It's been integrated to rails 5.0. gem 'test_after_commit', '~> 1.1' unless rails5? # Remove this gem when migrated to rails 5.0. It's been integrated to rails 5.0.
gem 'sham_rack', '~> 1.3.6' gem 'sham_rack', '~> 1.3.6'
gem 'concurrent-ruby', '~> 1.0.5' gem 'concurrent-ruby', '~> 1.1'
gem 'test-prof', '~> 0.2.5' gem 'test-prof', '~> 0.2.5'
gem 'rspec_junit_formatter' gem 'rspec_junit_formatter'
end end
......
...@@ -136,9 +136,9 @@ GEM ...@@ -136,9 +136,9 @@ GEM
concord (0.1.5) concord (0.1.5)
adamantium (~> 0.2.0) adamantium (~> 0.2.0)
equalizer (~> 0.0.9) equalizer (~> 0.0.9)
concurrent-ruby (1.0.5) concurrent-ruby (1.1.3)
concurrent-ruby-ext (1.0.5) concurrent-ruby-ext (1.1.3)
concurrent-ruby (= 1.0.5) concurrent-ruby (= 1.1.3)
connection_pool (2.2.2) connection_pool (2.2.2)
crack (0.4.3) crack (0.4.3)
safe_yaml (~> 1.0.0) safe_yaml (~> 1.0.0)
...@@ -406,7 +406,7 @@ GEM ...@@ -406,7 +406,7 @@ GEM
json (~> 1.8) json (~> 1.8)
multi_xml (>= 0.5.2) multi_xml (>= 0.5.2)
httpclient (2.8.3) httpclient (2.8.3)
i18n (1.1.0) i18n (1.1.1)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
icalendar (2.4.1) icalendar (2.4.1)
ice_nine (0.11.2) ice_nine (0.11.2)
...@@ -472,7 +472,7 @@ GEM ...@@ -472,7 +472,7 @@ GEM
activesupport (>= 4) activesupport (>= 4)
railties (>= 4) railties (>= 4)
request_store (~> 1.0) request_store (~> 1.0)
loofah (2.2.2) loofah (2.2.3)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.7.0) mail (2.7.0)
...@@ -481,7 +481,7 @@ GEM ...@@ -481,7 +481,7 @@ GEM
memoist (0.16.0) memoist (0.16.0)
memoizable (0.4.2) memoizable (0.4.2)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
method_source (0.9.0) method_source (0.9.2)
mime-types (3.2.2) mime-types (3.2.2)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2018.0812) mime-types-data (3.2018.0812)
...@@ -504,7 +504,7 @@ GEM ...@@ -504,7 +504,7 @@ GEM
net-ssh (5.0.1) net-ssh (5.0.1)
netrc (0.11.0) netrc (0.11.0)
nio4r (2.3.1) nio4r (2.3.1)
nokogiri (1.8.4) nokogiri (1.8.5)
mini_portile2 (~> 2.3.0) mini_portile2 (~> 2.3.0)
nokogumbo (1.5.0) nokogumbo (1.5.0)
nokogiri nokogiri
...@@ -632,7 +632,7 @@ GEM ...@@ -632,7 +632,7 @@ GEM
get_process_mem (~> 0.2) get_process_mem (~> 0.2)
puma (>= 2.7, < 4) puma (>= 2.7, < 4)
pyu-ruby-sasl (0.0.3.3) pyu-ruby-sasl (0.0.3.3)
rack (2.0.5) rack (2.0.6)
rack-accept (0.4.5) rack-accept (0.4.5)
rack (>= 0.4) rack (>= 0.4)
rack-attack (4.4.1) rack-attack (4.4.1)
...@@ -796,8 +796,8 @@ GEM ...@@ -796,8 +796,8 @@ GEM
ruby-progressbar (1.9.0) ruby-progressbar (1.9.0)
ruby-saml (1.7.2) ruby-saml (1.7.2)
nokogiri (>= 1.5.10) nokogiri (>= 1.5.10)
ruby_parser (3.9.0) ruby_parser (3.11.0)
sexp_processor (~> 4.1) sexp_processor (~> 4.9)
rubyntlm (0.6.2) rubyntlm (0.6.2)
rubypants (0.2.0) rubypants (0.2.0)
rubyzip (1.2.2) rubyzip (1.2.2)
...@@ -837,7 +837,7 @@ GEM ...@@ -837,7 +837,7 @@ GEM
sentry-raven (2.7.2) sentry-raven (2.7.2)
faraday (>= 0.7.6, < 1.0) faraday (>= 0.7.6, < 1.0)
settingslogic (2.0.9) settingslogic (2.0.9)
sexp_processor (4.9.0) sexp_processor (4.11.0)
sham_rack (1.3.6) sham_rack (1.3.6)
rack rack
shoulda-matchers (3.1.2) shoulda-matchers (3.1.2)
...@@ -997,7 +997,7 @@ DEPENDENCIES ...@@ -997,7 +997,7 @@ DEPENDENCIES
chronic (~> 0.10.2) chronic (~> 0.10.2)
chronic_duration (~> 0.10.6) chronic_duration (~> 0.10.6)
commonmarker (~> 0.17) commonmarker (~> 0.17)
concurrent-ruby (~> 1.0.5) concurrent-ruby (~> 1.1)
connection_pool (~> 2.0) connection_pool (~> 2.0)
creole (~> 0.5.0) creole (~> 0.5.0)
database_cleaner (~> 1.5.0) database_cleaner (~> 1.5.0)
......
...@@ -133,9 +133,9 @@ GEM ...@@ -133,9 +133,9 @@ GEM
concord (0.1.5) concord (0.1.5)
adamantium (~> 0.2.0) adamantium (~> 0.2.0)
equalizer (~> 0.0.9) equalizer (~> 0.0.9)
concurrent-ruby (1.0.5) concurrent-ruby (1.1.3)
concurrent-ruby-ext (1.0.5) concurrent-ruby-ext (1.1.3)
concurrent-ruby (= 1.0.5) concurrent-ruby (= 1.1.3)
connection_pool (2.2.2) connection_pool (2.2.2)
crack (0.4.3) crack (0.4.3)
safe_yaml (~> 1.0.0) safe_yaml (~> 1.0.0)
...@@ -469,7 +469,7 @@ GEM ...@@ -469,7 +469,7 @@ GEM
activesupport (>= 4) activesupport (>= 4)
railties (>= 4) railties (>= 4)
request_store (~> 1.0) request_store (~> 1.0)
loofah (2.2.2) loofah (2.2.3)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.7.0) mail (2.7.0)
...@@ -500,7 +500,7 @@ GEM ...@@ -500,7 +500,7 @@ GEM
net-ntp (2.1.3) net-ntp (2.1.3)
net-ssh (5.0.1) net-ssh (5.0.1)
netrc (0.11.0) netrc (0.11.0)
nokogiri (1.8.4) nokogiri (1.8.5)
mini_portile2 (~> 2.3.0) mini_portile2 (~> 2.3.0)
nokogumbo (1.5.0) nokogumbo (1.5.0)
nokogiri nokogiri
...@@ -788,8 +788,8 @@ GEM ...@@ -788,8 +788,8 @@ GEM
ruby-progressbar (1.9.0) ruby-progressbar (1.9.0)
ruby-saml (1.7.2) ruby-saml (1.7.2)
nokogiri (>= 1.5.10) nokogiri (>= 1.5.10)
ruby_parser (3.9.0) ruby_parser (3.11.0)
sexp_processor (~> 4.1) sexp_processor (~> 4.9)
rubyntlm (0.6.2) rubyntlm (0.6.2)
rubypants (0.2.0) rubypants (0.2.0)
rubyzip (1.2.2) rubyzip (1.2.2)
...@@ -829,7 +829,7 @@ GEM ...@@ -829,7 +829,7 @@ GEM
sentry-raven (2.7.2) sentry-raven (2.7.2)
faraday (>= 0.7.6, < 1.0) faraday (>= 0.7.6, < 1.0)
settingslogic (2.0.9) settingslogic (2.0.9)
sexp_processor (4.9.0) sexp_processor (4.11.0)
sham_rack (1.3.6) sham_rack (1.3.6)
rack rack
shoulda-matchers (3.1.2) shoulda-matchers (3.1.2)
...@@ -988,7 +988,7 @@ DEPENDENCIES ...@@ -988,7 +988,7 @@ DEPENDENCIES
chronic (~> 0.10.2) chronic (~> 0.10.2)
chronic_duration (~> 0.10.6) chronic_duration (~> 0.10.6)
commonmarker (~> 0.17) commonmarker (~> 0.17)
concurrent-ruby (~> 1.0.5) concurrent-ruby (~> 1.1)
connection_pool (~> 2.0) connection_pool (~> 2.0)
creole (~> 0.5.0) creole (~> 0.5.0)
database_cleaner (~> 1.5.0) database_cleaner (~> 1.5.0)
......
...@@ -39,7 +39,7 @@ function blockTagText(text, textArea, blockTag, selected) { ...@@ -39,7 +39,7 @@ function blockTagText(text, textArea, blockTag, selected) {
} }
} }
function moveCursor({ textArea, tag, wrapped, removedLastNewLine, select }) { function moveCursor({ textArea, tag, positionBetweenTags, removedLastNewLine, select }) {
var pos; var pos;
if (!textArea.setSelectionRange) { if (!textArea.setSelectionRange) {
return; return;
...@@ -51,7 +51,7 @@ function moveCursor({ textArea, tag, wrapped, removedLastNewLine, select }) { ...@@ -51,7 +51,7 @@ function moveCursor({ textArea, tag, wrapped, removedLastNewLine, select }) {
return textArea.setSelectionRange(startPosition, endPosition); return textArea.setSelectionRange(startPosition, endPosition);
} }
if (textArea.selectionStart === textArea.selectionEnd) { if (textArea.selectionStart === textArea.selectionEnd) {
if (wrapped) { if (positionBetweenTags) {
pos = textArea.selectionStart - tag.length; pos = textArea.selectionStart - tag.length;
} else { } else {
pos = textArea.selectionStart; pos = textArea.selectionStart;
...@@ -67,7 +67,6 @@ function moveCursor({ textArea, tag, wrapped, removedLastNewLine, select }) { ...@@ -67,7 +67,6 @@ function moveCursor({ textArea, tag, wrapped, removedLastNewLine, select }) {
export function insertMarkdownText({ textArea, text, tag, blockTag, selected, wrap, select }) { export function insertMarkdownText({ textArea, text, tag, blockTag, selected, wrap, select }) {
var textToInsert, var textToInsert,
inserted,
selectedSplit, selectedSplit,
startChar, startChar,
removedLastNewLine, removedLastNewLine,
...@@ -155,7 +154,7 @@ export function insertMarkdownText({ textArea, text, tag, blockTag, selected, wr ...@@ -155,7 +154,7 @@ export function insertMarkdownText({ textArea, text, tag, blockTag, selected, wr
return moveCursor({ return moveCursor({
textArea, textArea,
tag: tag.replace(textPlaceholder, selected), tag: tag.replace(textPlaceholder, selected),
wrap, positionBetweenTags: wrap && selected.length === 0,
removedLastNewLine, removedLastNewLine,
select, select,
}); });
...@@ -171,10 +170,6 @@ function updateText({ textArea, tag, blockTag, wrap, select }) { ...@@ -171,10 +170,6 @@ function updateText({ textArea, tag, blockTag, wrap, select }) {
return insertMarkdownText({ textArea, text, tag, blockTag, selected, wrap, select }); return insertMarkdownText({ textArea, text, tag, blockTag, selected, wrap, select });
} }
function replaceRange(s, start, end, substitute) {
return s.substring(0, start) + substitute + s.substring(end);
}
export function addMarkdownListeners(form) { export function addMarkdownListeners(form) {
return $('.js-md', form) return $('.js-md', form)
.off('click') .off('click')
......
...@@ -58,7 +58,7 @@ class EventsFinder ...@@ -58,7 +58,7 @@ class EventsFinder
def by_target_type(events) def by_target_type(events)
return events unless Event::TARGET_TYPES[params[:target_type]] return events unless Event::TARGET_TYPES[params[:target_type]]
events.where(target_type: Event::TARGET_TYPES[params[:target_type]]) events.where(target_type: Event::TARGET_TYPES[params[:target_type]].name)
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
......
...@@ -100,7 +100,7 @@ module Ci ...@@ -100,7 +100,7 @@ module Ci
scope :matches_tag_ids, -> (tag_ids) do scope :matches_tag_ids, -> (tag_ids) do
matcher = ::ActsAsTaggableOn::Tagging matcher = ::ActsAsTaggableOn::Tagging
.where(taggable_type: CommitStatus) .where(taggable_type: CommitStatus.name)
.where(context: 'tags') .where(context: 'tags')
.where('taggable_id = ci_builds.id') .where('taggable_id = ci_builds.id')
.where.not(tag_id: tag_ids).select('1') .where.not(tag_id: tag_ids).select('1')
...@@ -110,7 +110,7 @@ module Ci ...@@ -110,7 +110,7 @@ module Ci
scope :with_any_tags, -> do scope :with_any_tags, -> do
matcher = ::ActsAsTaggableOn::Tagging matcher = ::ActsAsTaggableOn::Tagging
.where(taggable_type: CommitStatus) .where(taggable_type: CommitStatus.name)
.where(context: 'tags') .where(context: 'tags')
.where('taggable_id = ci_builds.id').select('1') .where('taggable_id = ci_builds.id').select('1')
......
...@@ -86,7 +86,7 @@ module Avatarable ...@@ -86,7 +86,7 @@ module Avatarable
params[:model].upload_paths(params[:identifier]) params[:model].upload_paths(params[:identifier])
end end
Upload.where(uploader: AvatarUploader, path: paths).find_each do |upload| Upload.where(uploader: AvatarUploader.name, path: paths).find_each do |upload|
model = model_class.instantiate('id' => upload.model_id) model = model_class.instantiate('id' => upload.model_id)
loader.call({ model: model, identifier: File.basename(upload.path) }, upload) loader.call({ model: model, identifier: File.basename(upload.path) }, upload)
......
...@@ -45,7 +45,7 @@ module Todos ...@@ -45,7 +45,7 @@ module Todos
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def remove_confidential_issue_todos def remove_confidential_issue_todos
Todo.where( Todo.where(
target_id: confidential_issues.select(:id), target_type: Issue, user_id: user.id target_id: confidential_issues.select(:id), target_type: Issue.name, user_id: user.id
).delete_all ).delete_all
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
......
...@@ -14,9 +14,9 @@ module Todos ...@@ -14,9 +14,9 @@ module Todos
def execute def execute
ProjectFeature.where(project_id: project_ids).each do |project_features| ProjectFeature.where(project_id: project_ids).each do |project_features|
target_types = [] target_types = []
target_types << Issue if private?(project_features.issues_access_level) target_types << Issue.name if private?(project_features.issues_access_level)
target_types << MergeRequest if private?(project_features.merge_requests_access_level) target_types << MergeRequest.name if private?(project_features.merge_requests_access_level)
target_types << Commit if private?(project_features.repository_access_level) target_types << Commit.name if private?(project_features.repository_access_level)
next if target_types.empty? next if target_types.empty?
......
- labels.each do |label|
%span.label-row.btn-group{ role: "group", aria: { label: label.name }, style: "color: #{text_color_for_bg(label.color)}" }
= link_to_label(label, subject: @project, css_class: 'btn btn-transparent')
%button.btn.btn-transparent.label-remove.js-label-filter-remove{ type: "button", style: "background-color: #{label.color};", data: { label: label.title } }
= icon("times")
---
title: Refine cursor positioning in Markdown Editor for wrap tags
merge_request: 23085
author: Johann Hubert Sonntagbauer
type: changed
---
title: Enable even more frozen string for lib/gitlab
merge_request:
author: gfyoung
type: performance
---
title: 'Rails5: Passing a class as a value in an Active Record query is deprecated'
merge_request: 23164
author: Jasper Maes
type: other
---
title: Bump nokogiri, loofah, and rack gems for security updates
merge_request: 23204
author:
type: security
---
title: Show what RPC is called in the performance bar
merge_request: 23140
author:
type: other
...@@ -1682,6 +1682,11 @@ include: ...@@ -1682,6 +1682,11 @@ include:
NOTE: **Note:** NOTE: **Note:**
The remote file must be publicly accessible through a simple GET request, as we don't support authentication schemas in the remote URL. The remote file must be publicly accessible through a simple GET request, as we don't support authentication schemas in the remote URL.
NOTE: **Note:**
In order to include files from another repository inside your local network,
you may need to enable the **Allow requests to the local network from hooks and services** checkbox
located in the **Settings > Network > Outbound requests** section within the **Admin area**.
--- ---
......
# frozen_string_literal: true # frozen_string_literal: true
# Gitaly note: JV: seems to be completely migrated (behind feature flags).
module Gitlab module Gitlab
module Git module Git
class Blob class Blob
......
...@@ -885,12 +885,6 @@ module Gitlab ...@@ -885,12 +885,6 @@ module Gitlab
Gitlab::GitalyClient::ConflictsService.new(self, our_commit_oid, their_commit_oid) Gitlab::GitalyClient::ConflictsService.new(self, our_commit_oid, their_commit_oid)
end end
def gitaly_migrate(method, status: Gitlab::GitalyClient::MigrationStatus::OPT_IN, &block)
wrapped_gitaly_errors do
Gitlab::GitalyClient.migrate(method, status: status, &block)
end
end
def clean_stale_repository_files def clean_stale_repository_files
wrapped_gitaly_errors do wrapped_gitaly_errors do
gitaly_repository_client.cleanup if exists? gitaly_repository_client.cleanup if exists?
......
...@@ -9,11 +9,6 @@ require 'grpc/health/v1/health_services_pb' ...@@ -9,11 +9,6 @@ require 'grpc/health/v1/health_services_pb'
module Gitlab module Gitlab
module GitalyClient module GitalyClient
include Gitlab::Metrics::Methods include Gitlab::Metrics::Methods
module MigrationStatus
DISABLED = 1
OPT_IN = 2
OPT_OUT = 3
end
class TooManyInvocationsError < StandardError class TooManyInvocationsError < StandardError
attr_reader :call_site, :invocation_count, :max_call_stack attr_reader :call_site, :invocation_count, :max_call_stack
...@@ -31,7 +26,7 @@ module Gitlab ...@@ -31,7 +26,7 @@ module Gitlab
end end
end end
SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION'.freeze SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION'
MAXIMUM_GITALY_CALLS = 35 MAXIMUM_GITALY_CALLS = 35
CLIENT_NAME = (Sidekiq.server? ? 'gitlab-sidekiq' : 'gitlab-web').freeze CLIENT_NAME = (Sidekiq.server? ? 'gitlab-sidekiq' : 'gitlab-web').freeze
...@@ -43,11 +38,6 @@ module Gitlab ...@@ -43,11 +38,6 @@ module Gitlab
self.query_time = 0 self.query_time = 0
define_histogram :gitaly_migrate_call_duration_seconds do
docstring "Gitaly migration call execution timings"
base_labels gitaly_enabled: nil, feature: nil
end
define_histogram :gitaly_controller_action_duration_seconds do define_histogram :gitaly_controller_action_duration_seconds do
docstring "Gitaly endpoint histogram by controller and action combination" docstring "Gitaly endpoint histogram by controller and action combination"
base_labels Gitlab::Metrics::Transaction::BASE_LABELS.merge(gitaly_service: nil, rpc: nil) base_labels Gitlab::Metrics::Transaction::BASE_LABELS.merge(gitaly_service: nil, rpc: nil)
...@@ -126,7 +116,6 @@ module Gitlab ...@@ -126,7 +116,6 @@ module Gitlab
def self.call(storage, service, rpc, request, remote_storage: nil, timeout: nil) def self.call(storage, service, rpc, request, remote_storage: nil, timeout: nil)
start = Gitlab::Metrics::System.monotonic_time start = Gitlab::Metrics::System.monotonic_time
request_hash = request.is_a?(Google::Protobuf::MessageExts) ? request.to_h : {} request_hash = request.is_a?(Google::Protobuf::MessageExts) ? request.to_h : {}
@current_call_id ||= SecureRandom.uuid
enforce_gitaly_request_limits(:call) enforce_gitaly_request_limits(:call)
...@@ -145,9 +134,7 @@ module Gitlab ...@@ -145,9 +134,7 @@ module Gitlab
current_transaction_labels.merge(gitaly_service: service.to_s, rpc: rpc.to_s), current_transaction_labels.merge(gitaly_service: service.to_s, rpc: rpc.to_s),
duration) duration)
add_call_details(id: @current_call_id, feature: service, duration: duration, request: request_hash) add_call_details(feature: "#{service}##{rpc}", duration: duration, request: request_hash, rpc: rpc)
@current_call_id = nil
end end
def self.handle_grpc_unavailable!(ex) def self.handle_grpc_unavailable!(ex)
...@@ -222,7 +209,7 @@ module Gitlab ...@@ -222,7 +209,7 @@ module Gitlab
result result
end end
SERVER_FEATURE_FLAGS = %w[gogit_findcommit].freeze SERVER_FEATURE_FLAGS = %w[].freeze
def self.server_feature_flags def self.server_feature_flags
SERVER_FEATURE_FLAGS.map do |f| SERVER_FEATURE_FLAGS.map do |f|
...@@ -237,82 +224,8 @@ module Gitlab ...@@ -237,82 +224,8 @@ module Gitlab
params['gitaly_token'].presence || Gitlab.config.gitaly['token'] params['gitaly_token'].presence || Gitlab.config.gitaly['token']
end end
# Evaluates whether a feature toggle is on or off def self.feature_enabled?(feature_name)
def self.feature_enabled?(feature_name, status: MigrationStatus::OPT_IN) Feature.enabled?("gitaly_#{feature_name}")
# Disabled features are always off!
return false if status == MigrationStatus::DISABLED
feature = Feature.get("gitaly_#{feature_name}")
# If the feature has been set, always evaluate
if Feature.persisted?(feature)
if feature.percentage_of_time_value > 0
# Probabilistically enable this feature
return Random.rand() * 100 < feature.percentage_of_time_value
end
return feature.enabled?
end
# If the feature has not been set, the default depends
# on it's status
case status
when MigrationStatus::OPT_OUT
true
when MigrationStatus::OPT_IN
opt_into_all_features? && !explicit_opt_in_required.include?(feature_name)
else
false
end
rescue => ex
# During application startup feature lookups in SQL can fail
Rails.logger.warn "exception while checking Gitaly feature status for #{feature_name}: #{ex}"
false
end
# We have a mechanism to let GitLab automatically opt in to all Gitaly
# features. We want to be able to exclude some features from automatic
# opt-in. This function has an override in EE.
def self.explicit_opt_in_required
[]
end
# opt_into_all_features? returns true when the current environment
# is one in which we opt into features automatically
def self.opt_into_all_features?
Rails.env.development? || ENV["GITALY_FEATURE_DEFAULT_ON"] == "1"
end
private_class_method :opt_into_all_features?
def self.migrate(feature, status: MigrationStatus::OPT_IN)
# Enforce limits at both the `migrate` and `call` sites to ensure that
# problems are not hidden by a feature being disabled
enforce_gitaly_request_limits(:migrate)
is_enabled = feature_enabled?(feature, status: status)
metric_name = feature.to_s
metric_name += "_gitaly" if is_enabled
Gitlab::Metrics.measure(metric_name) do
# Some migrate calls wrap other migrate calls
allow_n_plus_1_calls do
feature_stack = Thread.current[:gitaly_feature_stack] ||= []
feature_stack.unshift(feature)
begin
start = Gitlab::Metrics::System.monotonic_time
@current_call_id = SecureRandom.uuid
call_details = { id: @current_call_id }
yield is_enabled
ensure
total_time = Gitlab::Metrics::System.monotonic_time - start
gitaly_migrate_call_duration_seconds.observe({ gitaly_enabled: is_enabled, feature: feature }, total_time)
feature_stack.shift
Thread.current[:gitaly_feature_stack] = nil if feature_stack.empty?
add_call_details(call_details.merge(feature: feature, duration: total_time))
end
end
end
end end
# Ensures that Gitaly is not being abuse through n+1 misuse etc # Ensures that Gitaly is not being abuse through n+1 misuse etc
...@@ -368,38 +281,20 @@ module Gitlab ...@@ -368,38 +281,20 @@ module Gitlab
end end
private_class_method :decrement_call_count private_class_method :decrement_call_count
# Returns an estimate of the number of Gitaly calls made for this # Returns the of the number of Gitaly calls made for this request
# request
def self.get_request_count def self.get_request_count
return 0 unless Gitlab::SafeRequestStore.active? get_call_count("gitaly_call_actual")
gitaly_migrate_count = get_call_count("gitaly_migrate_actual")
gitaly_call_count = get_call_count("gitaly_call_actual")
# Using the maximum of migrate and call_count will provide an
# indicator of how many Gitaly calls will be made, even
# before a feature is enabled. This provides us with a single
# metric, but not an exact number, but this tradeoff is acceptable
if gitaly_migrate_count > gitaly_call_count
gitaly_migrate_count
else
gitaly_call_count
end
end end
def self.reset_counts def self.reset_counts
return unless Gitlab::SafeRequestStore.active? return unless Gitlab::SafeRequestStore.active?
%w[migrate call].each do |call_site| Gitlab::SafeRequestStore["gitaly_call_actual"] = 0
Gitlab::SafeRequestStore["gitaly_#{call_site}_actual"] = 0 Gitlab::SafeRequestStore["gitaly_call_permitted"] = 0
Gitlab::SafeRequestStore["gitaly_#{call_site}_permitted"] = 0
end
end end
def self.add_call_details(details) def self.add_call_details(details)
id = details.delete(:id) return unless Gitlab::SafeRequestStore[:peek_enabled]
return unless id && Gitlab::SafeRequestStore[:peek_enabled]
Gitlab::SafeRequestStore['gitaly_call_details'] ||= {} Gitlab::SafeRequestStore['gitaly_call_details'] ||= {}
Gitlab::SafeRequestStore['gitaly_call_details'][id] ||= {} Gitlab::SafeRequestStore['gitaly_call_details'][id] ||= {}
......
# frozen_string_literal: true
module Gitlab module Gitlab
module HookData module HookData
class BaseBuilder class BaseBuilder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module HookData module HookData
class IssuableBuilder < BaseBuilder class IssuableBuilder < BaseBuilder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module HookData module HookData
class IssueBuilder < BaseBuilder class IssueBuilder < BaseBuilder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module HookData module HookData
class MergeRequestBuilder < BaseBuilder class MergeRequestBuilder < BaseBuilder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module HookData module HookData
class NoteBuilder < BaseBuilder class NoteBuilder < BaseBuilder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module HookData module HookData
class WikiPageBuilder < BaseBuilder class WikiPageBuilder < BaseBuilder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module I18n module I18n
class MetadataEntry class MetadataEntry
......
# frozen_string_literal: true
module Gitlab module Gitlab
module I18n module I18n
class PoLinter class PoLinter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module I18n module I18n
class TranslationEntry class TranslationEntry
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Import module Import
class Logger < ::Gitlab::JsonLogger class Logger < ::Gitlab::JsonLogger
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
module AfterExportStrategies module AfterExportStrategies
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
module AfterExportStrategies module AfterExportStrategies
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
module AfterExportStrategies module AfterExportStrategies
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class AfterExportStrategyBuilder class AfterExportStrategyBuilder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class AttributeCleaner class AttributeCleaner
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class AttributesFinder class AttributesFinder
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class AvatarRestorer class AvatarRestorer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class AvatarSaver class AvatarSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
module CommandLineUtil module CommandLineUtil
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
Error = Class.new(StandardError) Error = Class.new(StandardError)
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class FileImporter class FileImporter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
# Given a class, it finds or creates a new object # Given a class, it finds or creates a new object
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class HashUtil class HashUtil
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class Importer class Importer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
# Generates a hash that conforms with http://apidock.com/rails/Hash/to_json # Generates a hash that conforms with http://apidock.com/rails/Hash/to_json
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class LfsRestorer class LfsRestorer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class LfsSaver class LfsSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class MembersMapper class MembersMapper
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class MergeRequestParser class MergeRequestParser
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class ProjectTreeRestorer class ProjectTreeRestorer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class ProjectTreeSaver class ProjectTreeSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class Reader class Reader
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class RelationFactory class RelationFactory
...@@ -213,7 +215,7 @@ module Gitlab ...@@ -213,7 +215,7 @@ module Gitlab
def update_note_for_missing_author(author_name) def update_note_for_missing_author(author_name)
@relation_hash['note'] = '*Blank note*' if @relation_hash['note'].blank? @relation_hash['note'] = '*Blank note*' if @relation_hash['note'].blank?
@relation_hash['note'] += missing_author_note(@relation_hash['updated_at'], author_name) @relation_hash['note'] = "#{@relation_hash['note']}#{missing_author_note(@relation_hash['updated_at'], author_name)}"
end end
def admin_user? def admin_user?
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class RepoRestorer class RepoRestorer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class RepoSaver class RepoSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class Saver class Saver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class Shared class Shared
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class StatisticsRestorer class StatisticsRestorer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class UploadsManager class UploadsManager
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class UploadsRestorer < UploadsSaver class UploadsRestorer < UploadsSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class UploadsSaver class UploadsSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class VersionChecker class VersionChecker
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class VersionSaver class VersionSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class WikiRepoSaver < RepoSaver class WikiRepoSaver < RepoSaver
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ImportExport module ImportExport
class WikiRestorer < RepoRestorer class WikiRestorer < RepoRestorer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
class ConfigMap class ConfigMap
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Helm module Helm
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Helm module Helm
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Helm module Helm
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Helm module Helm
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Helm module Helm
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Helm module Helm
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Helm module Helm
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
class Namespace class Namespace
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Kubernetes module Kubernetes
module Pod module Pod
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class BaseFormatter class BaseFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class BranchFormatter < BaseFormatter class BranchFormatter < BaseFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class Client class Client
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class CommentFormatter < BaseFormatter class CommentFormatter < BaseFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class Importer class Importer
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class IssuableFormatter < BaseFormatter class IssuableFormatter < BaseFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class IssueFormatter < IssuableFormatter class IssueFormatter < IssuableFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class LabelFormatter < BaseFormatter class LabelFormatter < BaseFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class MilestoneFormatter < BaseFormatter class MilestoneFormatter < BaseFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class ProjectCreator class ProjectCreator
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class PullRequestFormatter < IssuableFormatter class PullRequestFormatter < IssuableFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class ReleaseFormatter < BaseFormatter class ReleaseFormatter < BaseFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class UserFormatter class UserFormatter
......
# frozen_string_literal: true
module Gitlab module Gitlab
module LegacyGithubImport module LegacyGithubImport
class WikiFormatter class WikiFormatter
......
# frozen_string_literal: true
# Class to parse manifest file and build a list of repositories for import # Class to parse manifest file and build a list of repositories for import
# #
# <manifest> # <manifest>
......
# frozen_string_literal: true
module Gitlab module Gitlab
module ManifestImport module ManifestImport
class ProjectCreator class ProjectCreator
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
class BackgroundTransaction < Transaction class BackgroundTransaction < Transaction
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
# Class for calculating the difference between two numeric values. # Class for calculating the difference between two numeric values.
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
module InfluxDb module InfluxDb
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
# Module for instrumenting methods. # Module for instrumenting methods.
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
# Class for tracking timing information about method calls # Class for tracking timing information about method calls
......
# frozen_string_literal: true
# rubocop:disable Style/ClassVars # rubocop:disable Style/ClassVars
module Gitlab module Gitlab
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
module Methods module Methods
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
# Class for storing details of a single metric (label, value, etc). # Class for storing details of a single metric (label, value, etc).
......
# frozen_string_literal: true
module Gitlab module Gitlab
module Metrics module Metrics
# Mocks ::Prometheus::Client::Metric and all derived metrics # Mocks ::Prometheus::Client::Metric and all derived metrics
......
# frozen_string_literal: true
require 'prometheus/client' require 'prometheus/client'
module Gitlab module Gitlab
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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