Commit a958ab44 authored by Sean McGivern's avatar Sean McGivern

Remove Sidekiq worker tags

This removes all Sidekiq workers tags except for `needs_own_queue`.
Workers tags are documented as short-lived metadata annotations, and are
primarily for use in the GitLab.com deployment. All of the removed tags
are no longer needed:

1. `requires_disk_io` - we added this to workers that accessed shared
   files over NFS when we started migrating Sidekiq away from VMs to
   Kubernetes. These workers no longer use NFS, we just hadn't tidied up
   the tags.
2. `exclude_from_kubernetes` - similarly, in our Kubernetes migration we
   ended up in a state where some workers ran on VMs and others ran on
   Kubernetes, but there was no particular reason for these workers not
   to run on Kubernetes. We didn't remove it earlier because the
   migration was still in progress. This tag was just there to simplify
   the queue selectors, but now that all of Sidekiq on GitLab.com runs
   on Kubernetes, we definitely don't need it.
3. `exclude_from_gitlab_com` - some workers never run on GitLab.com.
   When we were using a queue per worker, there was a small overhead to
   running extra queues, and that overhead added up at GitLab.com's
   scale. Now that we are using [routing rules] to put jobs in far fewer
   queues, we don't need this exclusion any more.

We do want to keep the `needs_own_queue` tag for now, as it applies to
the last point: not every worker can be put in a queue with other
workers, and this annotation helps us keep track of those.

[routing rules]: https://docs.gitlab.com/ee/administration/operations/extra_sidekiq_routing.html
parent a762ccc6
This diff is collapsed.
......@@ -13,7 +13,6 @@ module Analytics
DEFAULT_DELAY = 3.minutes.freeze
feature_category :devops_reports
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -12,7 +12,6 @@ module Analytics
feature_category :devops_reports
urgency :low
tags :exclude_from_kubernetes
idempotent!
......
......@@ -10,7 +10,6 @@ class ApproveBlockedPendingApprovalUsersWorker
idempotent!
feature_category :users
tags :exclude_from_kubernetes
def perform(current_user_id)
current_user = User.find(current_user_id)
......
......@@ -6,7 +6,6 @@ class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker
data_consistency :always
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options retry: false, dead: false
......
......@@ -7,7 +7,6 @@ module BulkImports
data_consistency :always
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options retry: false, dead: false
......
......@@ -9,7 +9,6 @@ module BulkImports
NDJSON_PIPELINE_PERFORM_DELAY = 1.minute
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options retry: false, dead: false
......
......@@ -10,7 +10,6 @@ module BulkImports
idempotent!
loggable_arguments 2, 3
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION
def perform(user_id, portable_id, portable_class, relation)
......
......@@ -10,7 +10,6 @@ module Ci
include LimitedCapacity::Worker
feature_category :continuous_integration
tags :exclude_from_kubernetes
idempotent!
def perform_work(*args)
......
......@@ -9,8 +9,6 @@ module Ci
sidekiq_options retry: 3
include PipelineQueue
tags :exclude_from_kubernetes
idempotent!
def perform(pipeline_id, failure_reason)
......
......@@ -10,7 +10,6 @@ module Ci
include PipelineQueue
urgency :low
tags :exclude_from_kubernetes
idempotent!
def perform(job_id)
......
......@@ -11,7 +11,6 @@ module Ci
queue_namespace :pipeline_background
feature_category :code_testing
tags :exclude_from_kubernetes
idempotent!
......
......@@ -15,7 +15,6 @@ module Ci
deduplicate :until_executed, including_scheduled: true
idempotent!
feature_category :continuous_integration
tags :exclude_from_kubernetes
def perform
service = ::Ci::PipelineArtifacts::DestroyAllExpiredService.new
......
......@@ -12,7 +12,6 @@ module Ci
# rubocop:enable Scalability/CronWorkerContext
feature_category :continuous_integration
tags :exclude_from_kubernetes
idempotent!
def perform(*args)
......
......@@ -9,8 +9,6 @@ module Ci
sidekiq_options retry: 3
include PipelineBackgroundQueue
tags :exclude_from_kubernetes
idempotent!
def perform(pipeline_id)
......
......@@ -6,6 +6,5 @@ module ChaosQueue
included do
queue_namespace :chaos
feature_category_not_owned!
tags :exclude_from_gitlab_com
end
end
......@@ -12,7 +12,6 @@ module ContainerExpirationPolicies
queue_namespace :container_repository
feature_category :container_registry
tags :exclude_from_kubernetes
urgency :low
worker_resource_boundary :unknown
idempotent!
......
......@@ -9,7 +9,6 @@ module Database
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :database
tags :exclude_from_kubernetes
idempotent!
LEASE_TIMEOUT_MULTIPLIER = 3
......
......@@ -10,7 +10,6 @@ module Deployments
queue_namespace :deployment
feature_category :continuous_delivery
tags :exclude_from_kubernetes
def perform(deployment_id)
Deployments::OlderDeploymentsDropService.new(deployment_id).execute
......
......@@ -9,7 +9,6 @@ module DesignManagement
sidekiq_options retry: 3
feature_category :design_management
tags :exclude_from_kubernetes
idempotent!
urgency :low
......
......@@ -10,7 +10,6 @@ class DestroyPagesDeploymentsWorker
loggable_arguments 0, 1
sidekiq_options retry: 3
feature_category :pages
tags :exclude_from_kubernetes
def perform(project_id, last_deployment_id = nil)
project = Project.find_by_id(project_id)
......
......@@ -9,7 +9,6 @@ class DisallowTwoFactorForGroupWorker
include ExceptionBacktrace
feature_category :subgroups
tags :exclude_from_kubernetes
idempotent!
def perform(group_id)
......
......@@ -11,7 +11,6 @@ class DisallowTwoFactorForSubgroupsWorker
INTERVAL = 2.seconds.to_i
feature_category :subgroups
tags :exclude_from_kubernetes
idempotent!
def perform(group_id)
......
......@@ -11,7 +11,6 @@ module Environments
idempotent!
worker_has_external_dependencies!
feature_category :continuous_delivery
tags :exclude_from_kubernetes
def perform(environment_id, params)
Environment.find_by_id(environment_id).try do |environment|
......
......@@ -9,7 +9,6 @@ module Experiments
sidekiq_options retry: 3
feature_category :users
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -13,7 +13,6 @@ class FlushCounterIncrementsWorker
sidekiq_options retry: 3
feature_category_not_owned!
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executing, including_scheduled: true
......
......@@ -5,7 +5,6 @@ module Gitlab
class ImportPullRequestMergedByWorker # rubocop:disable Scalability/IdempotentWorker
include ObjectImporter
tags :exclude_from_kubernetes
worker_resource_boundary :cpu
def representation_class
......
......@@ -5,7 +5,6 @@ module Gitlab
class ImportPullRequestReviewWorker # rubocop:disable Scalability/IdempotentWorker
include ObjectImporter
tags :exclude_from_kubernetes
worker_resource_boundary :cpu
def representation_class
......
......@@ -12,8 +12,6 @@ module Gitlab
include GithubImport::Queue
include StageMethods
tags :exclude_from_kubernetes
# client - An instance of Gitlab::GithubImport::Client.
# project - An instance of Project.
def import(client, project)
......
......@@ -12,8 +12,6 @@ module Gitlab
include GithubImport::Queue
include StageMethods
tags :exclude_from_kubernetes
# client - An instance of Gitlab::GithubImport::Client.
# project - An instance of Project.
def import(client, project)
......
......@@ -15,7 +15,6 @@ class GitlabPerformanceBarStatsWorker
STATS_KEY_EXPIRE = 30.minutes.to_i
feature_category :metrics
tags :exclude_from_kubernetes
idempotent!
def perform(lease_uuid)
......
......@@ -9,7 +9,6 @@ class GroupDestroyWorker # rubocop:disable Scalability/IdempotentWorker
include ExceptionBacktrace
feature_category :subgroups
tags :requires_disk_io, :exclude_from_kubernetes
def perform(group_id, user_id)
begin
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#migration_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
# @param [Integer] start initial ID of the batch
# @param [Integer] finish last ID of the batch
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#migration_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
attr_reader :project_id
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#rollback_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
attr_reader :project_id
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#rollback_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
# @param [Integer] start initial ID of the batch
# @param [Integer] finish last ID of the batch
......
......@@ -11,7 +11,6 @@ module IncidentManagement
queue_namespace :incident_management
feature_category :incident_management
tags :exclude_from_kubernetes
def perform(incident_id, user_id)
return if incident_id.blank? || user_id.blank?
......
......@@ -10,7 +10,6 @@ class IssueRebalancingWorker
idempotent!
urgency :low
feature_category :issue_tracking
tags :exclude_from_kubernetes
deduplicate :until_executed, including_scheduled: true
def perform(ignore = nil, project_id = nil, root_namespace_id = nil)
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ class MemberInvitationReminderEmailsWorker # rubocop:disable Scalability/Idempot
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :subgroups
tags :exclude_from_kubernetes
urgency :low
def perform
......
......@@ -10,7 +10,6 @@ class MergeRequestCleanupRefsWorker
sidekiq_options retry: 3
feature_category :code_review
tags :exclude_from_kubernetes
idempotent!
# Hard-coded to 4 for now. Will be configurable later on via application settings.
......
......@@ -10,7 +10,6 @@ module Metrics
sidekiq_options retry: 3
feature_category :metrics
tags :exclude_from_kubernetes
idempotent!
......
......@@ -9,7 +9,6 @@ module Namespaces
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :subgroups
tags :exclude_from_kubernetes
urgency :low
def perform
......
......@@ -9,7 +9,6 @@ module Namespaces
sidekiq_options retry: 3
feature_category :issue_tracking
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executing
......
......@@ -9,7 +9,6 @@ module Namespaces
sidekiq_options retry: 3
feature_category :subgroups
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executing
......
......@@ -10,7 +10,6 @@ module Namespaces
feature_category :product_analytics
worker_resource_boundary :cpu
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executed
......
......@@ -9,7 +9,6 @@ module Namespaces
sidekiq_options retry: 3
feature_category :users
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -10,7 +10,6 @@ module Packages
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :package_registry
tags :exclude_from_kubernetes
idempotent!
......
......@@ -10,7 +10,6 @@ module Packages
sidekiq_options retry: 3
feature_category :package_registry
tags :exclude_from_kubernetes
idempotent!
......
......@@ -13,7 +13,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
def perform(package_file_id, user_id)
@package_file_id = package_file_id
......
......@@ -12,7 +12,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
deduplicate :until_executing
idempotent!
......
......@@ -13,7 +13,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
deduplicate :until_executing
idempotent!
......
......@@ -11,7 +11,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
deduplicate :until_executing
def perform(package_file_id)
......
......@@ -8,7 +8,6 @@ class PagesDomainSslRenewalWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
feature_category :pages
tags :requires_disk_io, :exclude_from_kubernetes
def perform(domain_id)
domain = PagesDomain.find_by_id(domain_id)
......
......@@ -8,7 +8,6 @@ class PagesDomainVerificationWorker # rubocop:disable Scalability/IdempotentWork
sidekiq_options retry: 3
feature_category :pages
tags :requires_disk_io, :exclude_from_kubernetes
# rubocop: disable CodeReuse/ActiveRecord
def perform(domain_id)
......
......@@ -8,7 +8,6 @@ class PagesRemoveWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
feature_category :pages
tags :exclude_from_kubernetes
loggable_arguments 0
def perform(project_id)
......
......@@ -10,7 +10,6 @@ class PagesTransferWorker # rubocop:disable Scalability/IdempotentWorker
TransferFailedError = Class.new(StandardError)
feature_category :pages
tags :exclude_from_kubernetes
loggable_arguments 0, 1
def perform(method, args)
......
......@@ -9,7 +9,6 @@ class PagesUpdateConfigurationWorker
idempotent!
feature_category :pages
tags :exclude_from_kubernetes
def self.perform_async(*args)
return unless ::Settings.pages.local_store.enabled
......
......@@ -8,7 +8,6 @@ class PagesWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
feature_category :pages
loggable_arguments 0, 1
tags :requires_disk_io, :exclude_from_kubernetes
worker_resource_boundary :cpu
def perform(action, *arg)
......
......@@ -9,7 +9,6 @@ module PersonalAccessTokens
include CronjobQueue
feature_category :authentication_and_authorization
tags :exclude_from_kubernetes
def perform(*args)
notification_service = NotificationService.new
......
......@@ -9,7 +9,6 @@ class ProjectDestroyWorker # rubocop:disable Scalability/IdempotentWorker
include ExceptionBacktrace
feature_category :source_code_management
tags :requires_disk_io, :exclude_from_kubernetes
def perform(project_id, user_id, params)
project = Project.find(project_id)
......
......@@ -5,8 +5,6 @@ module Projects
extend ::Gitlab::Utils::Override
include GitGarbageCollectMethods
tags :exclude_from_kubernetes
private
override :find_resource
......
......@@ -9,7 +9,6 @@ module Projects
sidekiq_options retry: 3
feature_category :source_code_management
tags :exclude_from_kubernetes
idempotent!
def perform(project_id)
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationGroupWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationInheritDescendantWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationInheritWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationProjectWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -9,7 +9,6 @@ module Releases
sidekiq_options retry: 3
feature_category :release_evidence
tags :exclude_from_kubernetes
# pipeline_id is optional for backward compatibility with existing jobs
# caller should always try to provide the pipeline and pass nil only
......
......@@ -9,7 +9,6 @@ module Releases
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :release_evidence
tags :exclude_from_kubernetes
def perform
releases = Release.without_evidence.released_within_2hrs
......
......@@ -8,7 +8,6 @@ class RemoveUnacceptedMemberInvitesWorker # rubocop:disable Scalability/Idempote
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :authentication_and_authorization
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -8,7 +8,6 @@ class ScheduleMergeRequestCleanupRefsWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :code_review
tags :exclude_from_kubernetes
idempotent!
def perform
......
......@@ -9,7 +9,6 @@ module SshKeys
include CronjobQueue
feature_category :compliance_management
tags :exclude_from_kubernetes
idempotent!
BATCH_SIZE = 500
......
......@@ -9,7 +9,6 @@ module SshKeys
include CronjobQueue
feature_category :compliance_management
tags :exclude_from_kubernetes
idempotent!
def perform
......
......@@ -9,8 +9,6 @@ module TodosDestroyer
sidekiq_options retry: 3
include TodosDestroyerQueue
tags :exclude_from_kubernetes
idempotent!
def perform(target_id, target_type)
......
......@@ -12,7 +12,6 @@ module UserStatusCleanup
# rubocop:enable Scalability/CronWorkerContext
feature_category :users
tags :exclude_from_kubernetes
idempotent!
......
......@@ -9,7 +9,6 @@ module Users
include CronjobQueue
feature_category :utilization
tags :exclude_from_kubernetes
NUMBER_OF_BATCHES = 50
BATCH_SIZE = 200
......
......@@ -7,7 +7,6 @@ module WebHooks
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -5,8 +5,6 @@ module Wikis
extend ::Gitlab::Utils::Override
include GitGarbageCollectMethods
tags :exclude_from_kubernetes
private
override :find_resource
......
......@@ -11,7 +11,6 @@ class ActiveUserCountThresholdWorker # rubocop:disable Scalability/IdempotentWor
# rubocop:enable Scalability/CronWorkerContext
feature_category :license
tags :exclude_from_kubernetes
def perform
License.with_valid_license do |license|
......
This diff is collapsed.
......@@ -12,7 +12,6 @@ module Analytics
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :devops_reports
tags :exclude_from_kubernetes
idempotent!
WORKERS_GAP = 5.seconds
......
......@@ -12,7 +12,6 @@ module Analytics
feature_category :devops_reports
idempotent!
tags :exclude_from_kubernetes
def perform(enabled_namespace_id)
enabled_namespace = EnabledNamespace.find(enabled_namespace_id)
......
......@@ -10,7 +10,6 @@ module ApprovalRules
idempotent!
feature_category :source_code_management
tags :exclude_from_kubernetes
def perform(rule_id, data)
rule = MergeRequests::ExternalStatusCheck.find(rule_id)
......
......@@ -7,6 +7,5 @@ module GeoQueue
included do
queue_namespace :geo
feature_category :geo_replication
tags :exclude_from_gitlab_com
end
end
......@@ -12,7 +12,6 @@ class DastSiteValidationWorker
sidekiq_retry_in { 25 }
feature_category :dynamic_application_security_testing
tags :exclude_from_kubernetes
def perform(_dast_site_validation_id)
# Scheduled for removal in %15.0
......
......@@ -10,7 +10,6 @@ module Deployments
idempotent!
feature_category :continuous_delivery
tags :exclude_from_kubernetes
queue_namespace :deployment
def perform(environment_id)
......
......@@ -13,7 +13,6 @@ module Dora
idempotent!
queue_namespace :dora_metrics
feature_category :continuous_delivery
tags :exclude_from_kubernetes
def perform(environment_id, date)
Environment.find_by_id(environment_id).try do |environment|
......
......@@ -9,7 +9,6 @@ class ElasticAssociationIndexerWorker # rubocop:disable Scalability/IdempotentWo
feature_category :global_search
worker_resource_boundary :cpu
tags :exclude_from_kubernetes
loggable_arguments 0, 2
def perform(class_name, id, indexed_associations)
......
......@@ -9,7 +9,6 @@ class ElasticRemoveExpiredNamespaceSubscriptionsFromIndexCronWorker
include CronjobQueue
feature_category :global_search
tags :exclude_from_kubernetes
idempotent!
def perform
......
......@@ -7,8 +7,6 @@ module Geo
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
tags :exclude_from_gitlab_com
def perform
unless ::Geo::ContainerRepositoryRegistry.replication_enabled?
log_info('Container Registry replication is not enabled')
......
......@@ -2,8 +2,6 @@
module Geo
class DesignRepositoryShardSyncWorker < RepositoryShardSyncWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
private
def schedule_job(project_id)
......
......@@ -12,7 +12,6 @@ module Geo
idempotent!
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
loggable_arguments 0
def perform(replicable_name, replicable_id)
......
......@@ -7,8 +7,6 @@ module Geo
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
tags :exclude_from_gitlab_com
private
# Cannot utilise backoff because there are no events currently being
......
......@@ -13,7 +13,6 @@ module Geo
# rubocop:enable Scalability/CronWorkerContext
feature_category :geo_replication
tags :exclude_from_gitlab_com
LEASE_TIMEOUT = 5.minutes
......
......@@ -13,7 +13,6 @@ module Geo
include ::Gitlab::Geo::LogHelpers
feature_category :geo_replication
tags :exclude_from_gitlab_com
def perform
return if Gitlab::Database.read_only?
......
......@@ -4,7 +4,6 @@ module Geo
class RepositoryShardSyncWorker < Geo::Scheduler::Secondary::SchedulerWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: false
loggable_arguments 0
tags :exclude_from_gitlab_com
attr_accessor :shard_name
......
......@@ -2,8 +2,6 @@
module Geo
class RepositorySyncWorker < Geo::Scheduler::Secondary::PerShardSchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def schedule_job(shard_name)
Geo::RepositoryShardSyncWorker.perform_async(shard_name)
Geo::DesignRepositoryShardSyncWorker.perform_async(shard_name)
......
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