Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-04-13 03:08:51 +00:00
parent fa1b90364d
commit b9abe85151
27 changed files with 452 additions and 117 deletions

View File

@ -122,7 +122,6 @@ Lint/UnusedBlockArgument:
- 'ee/lib/tasks/gitlab/elastic.rake'
- 'ee/lib/tasks/gitlab/indexer.rake'
- 'ee/lib/tasks/gitlab/seed/insights.rake'
- 'ee/spec/config/metrics/every_metric_definition_spec.rb'
- 'ee/spec/elastic/migrate/20220118150500_delete_orphaned_commits_spec.rb'
- 'ee/spec/elastic/migrate/20220119120500_populate_commit_permissions_in_main_index_spec.rb'
- 'ee/spec/elastic/migrate/20220613120500_migrate_commits_to_separate_index_spec.rb'

View File

@ -0,0 +1,24 @@
# frozen_string_literal: true
module Metrics
# Update metrics regarding GitLab instance wide
#
# Anything that is not specific to a machine, process, request or any other context
# can be updated from this services.
#
# Examples of metrics that qualify:
# * Global counters (instance users, instance projects...)
# * State of settings stored in the database (whether a feature is active or not, tuning values...)
#
class GlobalMetricsUpdateService
def execute
return unless ::Gitlab::Metrics.prometheus_metrics_enabled?
maintenance_mode_metric.set({}, (::Gitlab.maintenance_mode? ? 1 : 0))
end
def maintenance_mode_metric
::Gitlab::Metrics.gauge(:gitlab_maintenance_mode, 'Is GitLab Maintenance Mode enabled?')
end
end
end

View File

@ -543,6 +543,15 @@
:weight: 1
:idempotent: true
:tags: []
- :name: cronjob:metrics_global_metrics_update
:worker_name: Metrics::GlobalMetricsUpdateWorker
:feature_category: :metrics
:has_external_dependencies: false
:urgency: :low
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags: []
- :name: cronjob:namespaces_in_product_marketing_emails
:worker_name: Namespaces::InProductMarketingEmailsWorker
:feature_category: :experimentation_activation

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
module Metrics
class GlobalMetricsUpdateWorker
include ApplicationWorker
idempotent!
data_consistency :sticky
feature_category :metrics
include ExclusiveLeaseGuard
# rubocop:disable Scalability/CronWorkerContext
# This worker does not perform work scoped to a context
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
LEASE_TIMEOUT = 2.minutes
def perform
try_obtain_lease { ::Metrics::GlobalMetricsUpdateService.new.execute }
end
def lease_timeout
LEASE_TIMEOUT
end
end
end

View File

@ -0,0 +1,8 @@
---
name: limited_commit_parser
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117188
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/406461
milestone: '15.11'
type: development
group: group::source code
default_enabled: false

View File

@ -685,6 +685,9 @@ Settings.cron_jobs['ci_runners_stale_machines_cleanup_worker']['job_class'] = 'C
Settings.cron_jobs['cleanup_dangling_debian_package_files_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['cleanup_dangling_debian_package_files_worker']['cron'] ||= '20 21 * * *'
Settings.cron_jobs['cleanup_dangling_debian_package_files_worker']['job_class'] = 'Packages::Debian::CleanupDanglingPackageFilesWorker'
Settings.cron_jobs['global_metrics_update_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['global_metrics_update_worker']['cron'] ||= '*/1 * * * *'
Settings.cron_jobs['global_metrics_update_worker']['job_class'] ||= 'Metrics::GlobalMetricsUpdateWorker'
Gitlab.ee do
Settings.cron_jobs['analytics_devops_adoption_create_all_snapshots_worker'] ||= Settingslogic.new({})

View File

@ -0,0 +1,23 @@
---
key_path: database.mode
description: What PostgreSQL database mode is used. Possible values are
"single-database", "single-database-ci-connection", or "multiple-databases"
product_section: enablement
product_stage: enablement
product_group: database
product_category: database
value_type: string
status: active
milestone: "15.11"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115900
time_frame: none
instrumentation_class: DatabaseMode
data_source: system
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate

View File

@ -1,83 +1,8 @@
# frozen_string_literal: true
class SwapIssueUserMentionsNoteIdToBigintForGitlabDotCom < Gitlab::Database::Migration[2.1]
include Gitlab::Database::MigrationHelpers::ConvertToBigint
# No-op, moved to db/post_migrate/20230413041917_swap_issue_user_mentions_note_id_to_bigint_for_gitlab_dot_com_2.rb
def up; end
disable_ddl_transaction!
TABLE_NAME = 'issue_user_mentions'
def up
return unless should_run?
swap
end
def down
return unless should_run?
swap
add_concurrent_index TABLE_NAME, :note_id_convert_to_bigint, unique: true,
name: 'index_issue_user_mentions_on_note_id_convert_to_bigint',
where: 'note_id_convert_to_bigint IS NOT NULL'
add_concurrent_foreign_key TABLE_NAME, :notes, column: :note_id_convert_to_bigint,
name: 'fk_issue_user_mentions_note_id_convert_to_bigint',
on_delete: :cascade,
validate: false
end
def swap
# This will replace the existing index_issue_user_mentions_on_note_id
add_concurrent_index TABLE_NAME, :note_id_convert_to_bigint, unique: true,
name: 'index_issue_user_mentions_on_note_id_convert_to_bigint',
where: 'note_id_convert_to_bigint IS NOT NULL'
# This will replace the existing issue_user_mentions_on_issue_id_and_note_id_index
add_concurrent_index TABLE_NAME, [:issue_id, :note_id_convert_to_bigint], unique: true,
name: 'tmp_issue_user_mentions_on_issue_id_and_note_id_index'
# This will replace the existing issue_user_mentions_on_issue_id_index
add_concurrent_index TABLE_NAME, :issue_id, unique: true,
name: 'tmp_issue_user_mentions_on_issue_id_index',
where: 'note_id_convert_to_bigint IS NULL'
# This will replace the existing fk_rails_3861d9fefa
add_concurrent_foreign_key TABLE_NAME, :notes, column: :note_id_convert_to_bigint,
name: 'fk_issue_user_mentions_note_id_convert_to_bigint',
on_delete: :cascade
with_lock_retries(raise_on_exhaustion: true) do
execute "LOCK TABLE notes, #{TABLE_NAME} IN ACCESS EXCLUSIVE MODE"
execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN note_id TO note_id_tmp"
execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN note_id_convert_to_bigint TO note_id"
execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN note_id_tmp TO note_id_convert_to_bigint"
function_name = Gitlab::Database::UnidirectionalCopyTrigger
.on_table(TABLE_NAME, connection: connection)
.name(:note_id, :note_id_convert_to_bigint)
execute "ALTER FUNCTION #{quote_table_name(function_name)} RESET ALL"
execute 'DROP INDEX IF EXISTS index_issue_user_mentions_on_note_id'
rename_index TABLE_NAME, 'index_issue_user_mentions_on_note_id_convert_to_bigint',
'index_issue_user_mentions_on_note_id'
execute 'DROP INDEX IF EXISTS issue_user_mentions_on_issue_id_and_note_id_index'
rename_index TABLE_NAME, 'tmp_issue_user_mentions_on_issue_id_and_note_id_index',
'issue_user_mentions_on_issue_id_and_note_id_index'
execute 'DROP INDEX IF EXISTS issue_user_mentions_on_issue_id_index'
rename_index TABLE_NAME, 'tmp_issue_user_mentions_on_issue_id_index',
'issue_user_mentions_on_issue_id_index'
execute "ALTER TABLE #{TABLE_NAME} DROP CONSTRAINT IF EXISTS fk_rails_3861d9fefa"
rename_constraint(TABLE_NAME, 'fk_issue_user_mentions_note_id_convert_to_bigint', 'fk_rails_3861d9fefa')
end
end
def should_run?
com_or_dev_or_test_but_not_jh?
end
def down; end
end

View File

@ -0,0 +1,93 @@
# frozen_string_literal: true
class SwapIssueUserMentionsNoteIdToBigintForGitlabDotCom2 < Gitlab::Database::Migration[2.1]
include Gitlab::Database::MigrationHelpers::ConvertToBigint
disable_ddl_transaction!
TABLE_NAME = 'issue_user_mentions'
def up
return unless should_run?
return if columns_alredy_swapped?
swap
end
def down
return unless should_run?
return unless columns_alredy_swapped?
swap
add_concurrent_index TABLE_NAME, :note_id_convert_to_bigint, unique: true,
name: 'index_issue_user_mentions_on_note_id_convert_to_bigint',
where: 'note_id_convert_to_bigint IS NOT NULL'
add_concurrent_foreign_key TABLE_NAME, :notes, column: :note_id_convert_to_bigint,
name: 'fk_issue_user_mentions_note_id_convert_to_bigint',
on_delete: :cascade,
validate: false
end
def swap
# This will replace the existing index_issue_user_mentions_on_note_id
add_concurrent_index TABLE_NAME, :note_id_convert_to_bigint, unique: true,
name: 'index_issue_user_mentions_on_note_id_convert_to_bigint',
where: 'note_id_convert_to_bigint IS NOT NULL'
# This will replace the existing issue_user_mentions_on_issue_id_and_note_id_index
add_concurrent_index TABLE_NAME, [:issue_id, :note_id_convert_to_bigint], unique: true,
name: 'tmp_issue_user_mentions_on_issue_id_and_note_id_index'
# This will replace the existing issue_user_mentions_on_issue_id_index
add_concurrent_index TABLE_NAME, :issue_id, unique: true,
name: 'tmp_issue_user_mentions_on_issue_id_index',
where: 'note_id_convert_to_bigint IS NULL'
# This will replace the existing fk_rails_3861d9fefa
add_concurrent_foreign_key TABLE_NAME, :notes, column: :note_id_convert_to_bigint,
name: 'fk_issue_user_mentions_note_id_convert_to_bigint',
on_delete: :cascade
with_lock_retries(raise_on_exhaustion: true) do
execute "LOCK TABLE notes, #{TABLE_NAME} IN ACCESS EXCLUSIVE MODE"
execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN note_id TO note_id_tmp"
execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN note_id_convert_to_bigint TO note_id"
execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN note_id_tmp TO note_id_convert_to_bigint"
function_name = Gitlab::Database::UnidirectionalCopyTrigger
.on_table(TABLE_NAME, connection: connection)
.name(:note_id, :note_id_convert_to_bigint)
execute "ALTER FUNCTION #{quote_table_name(function_name)} RESET ALL"
execute 'DROP INDEX IF EXISTS index_issue_user_mentions_on_note_id'
rename_index TABLE_NAME, 'index_issue_user_mentions_on_note_id_convert_to_bigint',
'index_issue_user_mentions_on_note_id'
execute 'DROP INDEX IF EXISTS issue_user_mentions_on_issue_id_and_note_id_index'
rename_index TABLE_NAME, 'tmp_issue_user_mentions_on_issue_id_and_note_id_index',
'issue_user_mentions_on_issue_id_and_note_id_index'
execute 'DROP INDEX IF EXISTS issue_user_mentions_on_issue_id_index'
rename_index TABLE_NAME, 'tmp_issue_user_mentions_on_issue_id_index',
'issue_user_mentions_on_issue_id_index'
execute "ALTER TABLE #{TABLE_NAME} DROP CONSTRAINT IF EXISTS fk_rails_3861d9fefa"
rename_constraint(TABLE_NAME, 'fk_issue_user_mentions_note_id_convert_to_bigint', 'fk_rails_3861d9fefa')
end
end
def should_run?
com_or_dev_or_test_but_not_jh?
end
def columns_alredy_swapped?
table_columns = columns(TABLE_NAME)
note_id = table_columns.find { |c| c.name == 'note_id' }
note_id_convert_to_bigint = table_columns.find { |c| c.name == 'note_id_convert_to_bigint' }
note_id_convert_to_bigint.sql_type == 'integer' && note_id.sql_type == 'bigint'
end
end

View File

@ -0,0 +1 @@
c359118e94c992bd19d8f0bd10f702bc117c944663a1f84f3d678bada242c09d

View File

@ -376,6 +376,7 @@ configuration option in `gitlab.yml`. These metrics are served from the
| `gitlab_memwd_violations_total` | Counter | 15.9 | Total number of times a Sidekiq process violated a memory threshold | |
| `gitlab_memwd_violations_handled_total` | Counter | 15.9 | Total number of times Sidekiq process memory violations were handled | |
| `sidekiq_watchdog_running_jobs_total` | Counter | 15.9 | Current running jobs when RSS limit was reached | `worker_class` |
| `gitlab_maintenance_mode` | Gauge | 15.11 | Is GitLab Maintenance Mode enabled? | |
## Database load balancing metrics **(PREMIUM SELF)**

View File

@ -22,6 +22,14 @@ Distributed tracing adds minimal overhead when disabled, but imposes only small
enabled and is therefore capable in any environment, including production. For this reason, it can
be useful in diagnosing production issues, particularly performance problems.
Services have different levels of support for distributed tracing. Custom
instrumentation code must be added to the application layer in addition to
pre-built instrumentation for the most common libraries.
For service-specific information, see:
- [Using Jaeger for Gitaly local development](https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/jaeger_for_local_development.md)
## Using Correlation IDs to investigate distributed requests
The GitLab application passes correlation IDs between the various components in a request. A
@ -80,12 +88,41 @@ In this example, we have the following hypothetical values:
## Using Jaeger in the GitLab Development Kit
The first tracing implementation that GitLab supports is Jaeger, and the
[GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit/) supports distributed tracing with
Jaeger out-of-the-box.
[GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit/)
supports distributed tracing with Jaeger out-of-the-box. GDK automatically adds
`GITLAB_TRACING` environment variables to add services.
The easiest way to access tracing from a GDK environment is through the
[performance-bar](../administration/monitoring/performance/performance_bar.md). This can be shown
by typing `p` `b` in the browser window.
Configure GDK for Jaeger by editing the `gdk.yml` file and adding the following
settings:
```yaml
tracer:
build_tags: tracer_static tracer_static_jaeger
jaeger:
enabled: true
listen_address: 127.0.0.1
version: 1.43.0
```
After modifying the `gdk.yml` file, reconfigure your GDK by running
the `gdk reconfigure` command. This ensures that your GDK is properly configured
and ready to use.
The above configuration sets the `tracer_static` and `tracer_static_jaeger`
build tags when rebuilding services written in Go for the first time. Any
changes made afterward require rebuilding them with those build tags. You can
either:
- Add those build tags to the default set of build tags.
- Manually attach them to the build command. For example, Gitaly supports adding
build tag out of the box. You can run
`make all WITH_BUNDLED_GIT=YesPlease BUILD_TAGS="tracer_static tracer_static_jaeger"`.
After reconfiguration, Jaeger dashboard is available at
`http://localhost:16686`. Another way to access tracing from a GDK environment
is through the
[performance-bar](../administration/monitoring/performance/performance_bar.md).
This can be shown by typing `p` `b` in the browser window.
Once the performance bar is enabled, select **Trace** in the performance bar to go to
the Jaeger UI.

View File

@ -70,7 +70,12 @@ don't need to perform this work in parallel.
This worker imports all pull requests. For every pull request a job for the
`Gitlab::GithubImport::ImportPullRequestWorker` worker is scheduled.
### 5. Stage::ImportPullRequestsMergedByWorker
### 5. Stage::ImportCollaboratorsWorker
This worker imports all repository collaborators. For every collaborator, we schedule a job
for the `Gitlab::GithubImport::ImportCollaboratorWorker` worker.
### 6. Stage::ImportPullRequestsMergedByWorker
This worker imports the pull requests' _merged-by_ user information. The
[_List pull requests_](https://docs.github.com/en/rest/pulls#list-pull-requests)
@ -79,21 +84,21 @@ individually to import this information. A
`Gitlab::GithubImport::ImportPullRequestMergedByWorker` job is scheduled for each fetched pull
request.
### 6. Stage::ImportPullRequestsReviewRequestsWorker
### 7. Stage::ImportPullRequestsReviewRequestsWorker
This worker imports assigned reviewers of pull requests. For each pull request, this worker:
- Fetches all assigned review requests.
- Schedules a `Gitlab::GithubImport::PullRequests::ImportReviewRequestWorker` job for each fetched review request.
### 7. Stage::ImportPullRequestsReviewsWorker
### 8. Stage::ImportPullRequestsReviewsWorker
This worker imports reviews of pull requests. For each pull request, this worker:
- Fetches all the pages of reviews.
- Schedules a `Gitlab::GithubImport::ImportPullRequestReviewWorker` job for each fetched review.
### 8. Stage::ImportIssuesAndDiffNotesWorker
### 9. Stage::ImportIssuesAndDiffNotesWorker
This worker imports all issues and pull request comments. For every issue, we
schedule a job for the `Gitlab::GithubImport::ImportIssueWorker` worker. For
@ -109,7 +114,7 @@ label links in the same worker removes the need for performing a separate crawl
through the API data, reducing the number of API calls necessary to import a
project.
### 9. Stage::ImportIssueEventsWorker
### 10. Stage::ImportIssueEventsWorker
This worker imports all issues and pull request events. For every event, we
schedule a job for the `Gitlab::GithubImport::ImportIssueEventWorker` worker.
@ -125,7 +130,7 @@ Therefore, both issues and pull requests have a common API for most related thin
NOTE:
This stage is optional and can consume significant extra import time (controlled by `Gitlab::GithubImport::Settings`).
### 10. Stage::ImportNotesWorker
### 11. Stage::ImportNotesWorker
This worker imports regular comments for both issues and pull requests. For
every comment, we schedule a job for the
@ -136,7 +141,7 @@ returns comments for both issues and pull requests. This means we have to wait
for all issues and pull requests to be imported before we can import regular
comments.
### 11. Stage::ImportAttachmentsWorker
### 12. Stage::ImportAttachmentsWorker
This worker imports note attachments that are linked inside Markdown.
For each entity with Markdown text in the project, we schedule a job of:
@ -155,7 +160,7 @@ Each job:
NOTE:
It's an optional stage that could consume significant extra import time (controlled by `Gitlab::GithubImport::Settings`).
### 12. Stage::ImportProtectedBranchesWorker
### 13. Stage::ImportProtectedBranchesWorker
This worker imports protected branch rules.
For every rule that exists on GitHub, we schedule a job of
@ -164,7 +169,7 @@ For every rule that exists on GitHub, we schedule a job of
Each job compares the branch protection rules from GitHub and GitLab and applies
the strictest of the rules to the branches in GitLab.
### 13. Stage::FinishImportWorker
### 14. Stage::FinishImportWorker
This worker completes the import process by performing some housekeeping
(such as flushing any caches) and by marking the import as completed.

View File

@ -78,3 +78,15 @@ For example, a histogram with 10 buckets and a label with 100 values would gener
entries in the export endpoint.
1. Trigger the relevant page or code that records the new metric.
1. Check that the new metric appears at `/-/metrics`.
For metrics that are not bounded to a specific context (`request`, `process`, `machine`, `namespace`, etc),
generate them from a cron-based Sidekiq job:
- For Geo related metrics, check `Geo::MetricsUpdateService`.
- For other "global" / instance-wide metrics, check: `Metrics::GlobalMetricsUpdateService`.
When exporting data from Sidekiq in an installation with more than one Sidekiq instance,
you are not guaranteed that the same exporter will always be queried.
You can read more and understand the caveats in [issue 406583](https://gitlab.com/gitlab-org/gitlab/-/issues/406583),
where we also discuss a possible solution using a push-gateway.

View File

@ -7,7 +7,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Import your project from GitHub to GitLab **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381902) in GitLab 15.8, GitLab no longer automatically creates namespaces or groups that don't exist. GitLab also no longer falls back to using the user's personal namespace if the namespace or group name is taken.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381902) in GitLab 15.8, GitLab no longer automatically creates namespaces or groups that don't exist. GitLab also no longer falls back to using the user's personal namespace if the namespace or group name is taken.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/388716) in GitLab 15.10, you no longer need to add any users to the parent group in GitLab to successfully import the **Require a pull request before merging - Allow specified actors to bypass required pull requests** branch protection rule.
You can import your GitHub projects from either GitHub.com or GitHub Enterprise. Importing projects does not
migrate or import any types of groups or organizations from GitHub to GitLab.
@ -52,9 +53,6 @@ To import projects from GitHub:
are properly mapped to the same user in GitLab. GitHub Enterprise does not require this field to be populated so you
may have to add it on existing accounts.
See also [Branch protection rules and project settings](#branch-protection-rules-and-project-settings) for additional
prerequisites for those imports.
Because of a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383047), if you are using GitHub as an OmniAuth provider, ensure that the URL
perimeter is specified in the [OmniAuth configuration](../../../integration/github.md#enable-github-oauth-in-gitlab).
@ -255,10 +253,7 @@ When they are imported, supported GitHub branch protection rules are mapped to e
| **Require signed commits** for the project's default branch | **Reject unsigned commits** GitLab [push rule](../repository/push_rules.md#prevent-unintended-consequences) **(PREMIUM)** | [GitLab 15.5](https://gitlab.com/gitlab-org/gitlab/-/issues/370949) |
| **Allow force pushes - Everyone** | **Allowed to force push** [branch protection setting](../protected_branches.md#allow-force-push-on-a-protected-branch) | [GitLab 15.6](https://gitlab.com/gitlab-org/gitlab/-/issues/370943) |
| **Require a pull request before merging - Require review from Code Owners** | **Require approval from code owners** [branch protection setting](../protected_branches.md#require-code-owner-approval-on-a-protected-branch) **(PREMIUM)** | [GitLab 15.6](https://gitlab.com/gitlab-org/gitlab/-/issues/376683) |
| **Require a pull request before merging - Allow specified actors to bypass required pull requests** (1) | List of users in the **Allowed to push** list of [branch protection settings](../protected_branches.md#configure-a-protected-branch) **(PREMIUM)**. Without a Premium license, the list of users that are allowed to push is limited to roles. | [GitLab 15.8](https://gitlab.com/gitlab-org/gitlab/-/issues/384939) |
1. To successfully import the **Require a pull request before merging - Allow specified actors to bypass required pull requests** rule, you must add to the parent group in GitLab
the users that are allowed to bypass required pull requests before you begin importing.
| **Require a pull request before merging - Allow specified actors to bypass required pull requests** | List of users in the **Allowed to push** list of [branch protection settings](../protected_branches.md#configure-a-protected-branch) **(PREMIUM)**. Without a **Premium** subscription, the list of users that are allowed to push is limited to roles. | [GitLab 15.8](https://gitlab.com/gitlab-org/gitlab/-/issues/384939) |
Mapping GitHub rule **Require status checks to pass before merging** to
[external status checks](../merge_requests/status_checks.md) was considered in issue

View File

@ -5,6 +5,8 @@ module Banzai
class CommitParser < BaseParser
self.reference_type = :commit
COMMITS_LIMIT = 1000
def referenced_by(nodes, options = {})
commit_ids = commit_ids_per_project(nodes)
projects = find_projects_for_hash_keys(commit_ids)
@ -19,6 +21,8 @@ module Banzai
end
def find_commits(project, ids)
return limited_commits(project, ids) if Feature.enabled?(:limited_commit_parser, project)
commits = []
return commits unless project.valid_repo?
@ -34,6 +38,14 @@ module Banzai
private
def limited_commits(project, ids)
return [] unless project.valid_repo?
ids = ids.take(COMMITS_LIMIT)
project.commits_by(oids: ids)
end
def can_read_reference?(user, ref_project, node)
can?(user, :download_code, ref_project)
end

View File

@ -51,6 +51,11 @@ module Gitlab
FULLY_QUALIFIED_IDENTIFIER = /^\w+\.\w+$/
## Database Modes
MODE_SINGLE_DATABASE = "single-database"
MODE_SINGLE_DATABASE_CI_CONNECTION = "single-database-ci-connection"
MODE_MULTIPLE_DATABASES = "multiple-databases"
def self.database_base_models
@database_base_models ||= {
# Note that we use ActiveRecord::Base here and not ApplicationRecord.
@ -138,7 +143,17 @@ module Gitlab
# Database configured. Returns false if the database is shared
def self.has_database?(database_name)
db_config = ::Gitlab::Database.database_base_models[database_name]&.connection_db_config
db_config.present? && ::Gitlab::Database.db_config_share_with(db_config).nil?
db_config.present? && db_config_share_with(db_config).nil?
end
def self.database_mode
if !has_config?(CI_DATABASE_NAME)
MODE_SINGLE_DATABASE
elsif has_database?(CI_DATABASE_NAME)
MODE_MULTIPLE_DATABASES
else
MODE_SINGLE_DATABASE_CI_CONNECTION
end
end
class PgUser < ApplicationRecord

View File

@ -0,0 +1,15 @@
# frozen_string_literal: true
module Gitlab
module Usage
module Metrics
module Instrumentations
class DatabaseMode < GenericMetric
value do
Gitlab::Database.database_mode
end
end
end
end
end
end

View File

@ -46754,6 +46754,9 @@ msgstr ""
msgid "Unable to load commits. Try again later."
msgstr ""
msgid "Unable to load current Workspaces. Please try again or contact an administrator."
msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
@ -50106,6 +50109,9 @@ msgstr ""
msgid "Workspaces|GitLab Workspaces is a powerful collaborative platform that provides a comprehensive set of tools for software development teams to manage their entire development lifecycle."
msgstr ""
msgid "Workspaces|Workspaces"
msgstr ""
msgid "Would you like to create a new branch?"
msgstr ""

View File

@ -5,8 +5,9 @@ require 'spec_helper'
RSpec.describe Banzai::ReferenceParser::CommitParser, feature_category: :source_code_management do
include ReferenceParserHelpers
let(:project) { create(:project, :public) }
let(:user) { create(:user) }
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:user) { create(:user) }
subject { described_class.new(Banzai::RenderContext.new(project, user)) }
let(:link) { empty_html_link }
@ -130,20 +131,50 @@ RSpec.describe Banzai::ReferenceParser::CommitParser, feature_category: :source_
end
describe '#find_commits' do
it 'returns an Array of commit objects' do
commit = double(:commit)
let_it_be(:ids) { project.repository.commits(project.default_branch, limit: 3).map(&:id) }
expect(project).to receive(:commit).with('123').and_return(commit)
expect(project).to receive(:valid_repo?).and_return(true)
it 'is empty when repo is invalid' do
allow(project).to receive(:valid_repo?).and_return(false)
expect(subject.find_commits(project, %w{123})).to eq([commit])
expect(subject.find_commits(project, ids)).to eq([])
end
it 'skips commit IDs for which no commit could be found' do
expect(project).to receive(:commit).with('123').and_return(nil)
expect(project).to receive(:valid_repo?).and_return(true)
it 'returns commits by the specified ids' do
expect(subject.find_commits(project, ids).map(&:id)).to eq(%w[
b83d6e391c22777fca1ed3012fce84f633d7fed0
498214de67004b1da3d820901307bed2a68a8ef6
1b12f15a11fc6e62177bef08f47bc7b5ce50b141
])
end
expect(subject.find_commits(project, %w{123})).to eq([])
it 'is limited' do
stub_const("#{described_class}::COMMITS_LIMIT", 1)
expect(subject.find_commits(project, ids).map(&:id)).to eq([
"b83d6e391c22777fca1ed3012fce84f633d7fed0"
])
end
context 'when limited_commit_parser feature flag disabled' do
before do
stub_feature_flags(limited_commit_parser: false)
end
it 'returns an Array of commit objects' do
commit = double(:commit)
expect(project).to receive(:commit).with('123').and_return(commit)
expect(project).to receive(:valid_repo?).and_return(true)
expect(subject.find_commits(project, %w{123})).to eq([commit])
end
it 'skips commit IDs for which no commit could be found' do
expect(project).to receive(:commit).with('123').and_return(nil)
expect(project).to receive(:valid_repo?).and_return(true)
expect(subject.find_commits(project, %w{123})).to eq([])
end
end
end

View File

@ -85,6 +85,29 @@ RSpec.describe Gitlab::Database, feature_category: :database do
end
end
describe '.database_mode' do
context 'three tier database config' do
it 'returns single-database if ci is not configured' do
skip_if_multiple_databases_are_setup(:ci)
expect(described_class.database_mode).to eq(::Gitlab::Database::MODE_SINGLE_DATABASE)
end
it 'returns single-database-ci-connection if ci is shared with main database' do
skip_if_multiple_databases_not_setup(:ci)
skip_if_database_exists(:ci)
expect(described_class.database_mode).to eq(::Gitlab::Database::MODE_SINGLE_DATABASE_CI_CONNECTION)
end
it 'returns multiple-database if ci has its own database' do
skip_if_shared_database(:ci)
expect(described_class.database_mode).to eq(::Gitlab::Database::MODE_MULTIPLE_DATABASES)
end
end
end
describe '.check_for_non_superuser' do
subject { described_class.check_for_non_superuser }

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMode, feature_category: :cell do
let(:expected_value) { Gitlab::Database.database_mode }
it_behaves_like 'a correct instrumented metric value', { time_frame: 'none' }
end

View File

@ -3,7 +3,8 @@
require 'spec_helper'
require_migration!
RSpec.describe SwapIssueUserMentionsNoteIdToBigintForGitlabDotCom, feature_category: :database do
# rubocop: disable RSpec/FilePath
RSpec.describe SwapIssueUserMentionsNoteIdToBigintForGitlabDotCom2, feature_category: :database do
describe '#up' do
before do
# A we call `schema_migrate_down!` before each example, and for this migration
@ -61,6 +62,23 @@ RSpec.describe SwapIssueUserMentionsNoteIdToBigintForGitlabDotCom, feature_categ
end
end
end
it 'is a no-op if columns are already swapped' do
connection = described_class.new.connection
connection.execute('ALTER TABLE issue_user_mentions ALTER COLUMN note_id TYPE bigint')
connection.execute('ALTER TABLE issue_user_mentions ALTER COLUMN note_id_convert_to_bigint TYPE integer')
allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(true)
migrate!
user_mentions = table(:issue_user_mentions)
user_mentions.reset_column_information
expect(user_mentions.columns.find { |c| c.name == 'note_id' }.sql_type).to eq('bigint')
expect(user_mentions.columns.find { |c| c.name == 'note_id_convert_to_bigint' }.sql_type).to eq('integer')
end
# rubocop: enable RSpec/AnyInstanceOf
end
end
# rubocop: enable RSpec/FilePath

View File

@ -0,0 +1,14 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Metrics::GlobalMetricsUpdateService, :prometheus, feature_category: :metrics do
describe '#execute' do
it 'sets gitlab_maintenance_mode gauge metric' do
metric = subject.maintenance_mode_metric
expect(Gitlab).to receive(:maintenance_mode?).and_return(true)
expect { subject.execute }.to change { metric.get }.from(0).to(1)
end
end
end

View File

@ -0,0 +1,30 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe ::Metrics::GlobalMetricsUpdateWorker, feature_category: :metrics do
subject { described_class.new }
describe '#perform' do
let(:service) { ::Metrics::GlobalMetricsUpdateService.new }
it 'delegates to ::Metrics::GlobalMetricsUpdateService' do
expect(::Metrics::GlobalMetricsUpdateService).to receive(:new).and_return(service)
expect(service).to receive(:execute)
subject.perform
end
context 'for an idempotent worker' do
include_examples 'an idempotent worker' do
it 'exports metrics' do
allow(Gitlab).to receive(:maintenance_mode?).and_return(true).at_least(1).time
perform_multiple
expect(service.maintenance_mode_metric.get).to eq(1)
end
end
end
end
end

View File

@ -26,7 +26,7 @@ require (
github.com/sirupsen/logrus v1.9.0
github.com/smartystreets/goconvey v1.7.2
github.com/stretchr/testify v1.8.2
gitlab.com/gitlab-org/gitaly/v15 v15.10.1
gitlab.com/gitlab-org/gitaly/v15 v15.10.2
gitlab.com/gitlab-org/golang-archive-zip v0.1.1
gitlab.com/gitlab-org/labkit v1.18.0
gocloud.dev v0.29.0

View File

@ -1918,8 +1918,8 @@ github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
gitlab.com/gitlab-org/gitaly/v15 v15.10.1 h1:43RZwVktIZLOq2GsRvQVUWZ4YiKPEueoWnmzz3T/UWk=
gitlab.com/gitlab-org/gitaly/v15 v15.10.1/go.mod h1:ZsyTd8zGxT4WuSZJ0G8ydJb60mauzEP0XJtZJEy/7bc=
gitlab.com/gitlab-org/gitaly/v15 v15.10.2 h1:e3uqhqYAsl20VddIBpGngY3t6+nK6QnZjY7MhufhV2k=
gitlab.com/gitlab-org/gitaly/v15 v15.10.2/go.mod h1:ZsyTd8zGxT4WuSZJ0G8ydJb60mauzEP0XJtZJEy/7bc=
gitlab.com/gitlab-org/golang-archive-zip v0.1.1 h1:35k9giivbxwF03+8A05Cm8YoxoakU8FBCj5gysjCTCE=
gitlab.com/gitlab-org/golang-archive-zip v0.1.1/go.mod h1:ZDtqpWPGPB9qBuZnZDrKQjIdJtkN7ZAoVwhT6H2o2kE=
gitlab.com/gitlab-org/labkit v1.18.0 h1:uYCIqDt/5V1hLIecTR4UNc1sD2+xiYplyKeyfpNN26A=