Commit 6167615a authored by Douglas Barbosa Alexandre's avatar Douglas Barbosa Alexandre

Merge branch 'follow-up-geo-sync-disabled-wikis' into 'master'

CE port of https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/6906

See merge request gitlab-org/gitlab-ce!21903
parents 4ca1afec 15d011d6
...@@ -86,7 +86,7 @@ class Project < ActiveRecord::Base ...@@ -86,7 +86,7 @@ class Project < ActiveRecord::Base
after_create :create_project_feature, unless: :project_feature after_create :create_project_feature, unless: :project_feature
after_create -> { SiteStatistic.track(STATISTICS_ATTRIBUTE) } after_create -> { SiteStatistic.track(STATISTICS_ATTRIBUTE) }
before_destroy :untrack_site_statistics before_destroy -> { SiteStatistic.untrack(STATISTICS_ATTRIBUTE) }
after_create :create_ci_cd_settings, after_create :create_ci_cd_settings,
unless: :ci_cd_settings, unless: :ci_cd_settings,
...@@ -2110,11 +2110,6 @@ class Project < ActiveRecord::Base ...@@ -2110,11 +2110,6 @@ class Project < ActiveRecord::Base
Gitlab::PagesTransfer.new.rename_project(path_before, self.path, namespace.full_path) Gitlab::PagesTransfer.new.rename_project(path_before, self.path, namespace.full_path)
end end
def untrack_site_statistics
SiteStatistic.untrack(STATISTICS_ATTRIBUTE)
self.project_feature.untrack_statistics_for_deletion!
end
# rubocop: disable CodeReuse/ServiceClass # rubocop: disable CodeReuse/ServiceClass
def execute_rename_repository_hooks!(full_path_before) def execute_rename_repository_hooks!(full_path_before)
# When we import a project overwriting the original project, there # When we import a project overwriting the original project, there
......
...@@ -21,7 +21,6 @@ class ProjectFeature < ActiveRecord::Base ...@@ -21,7 +21,6 @@ class ProjectFeature < ActiveRecord::Base
ENABLED = 20 ENABLED = 20
FEATURES = %i(issues merge_requests wiki snippets builds repository).freeze FEATURES = %i(issues merge_requests wiki snippets builds repository).freeze
STATISTICS_ATTRIBUTE = 'wikis_count'.freeze
class << self class << self
def access_level_attribute(feature) def access_level_attribute(feature)
...@@ -55,9 +54,6 @@ class ProjectFeature < ActiveRecord::Base ...@@ -55,9 +54,6 @@ class ProjectFeature < ActiveRecord::Base
default_value_for :wiki_access_level, value: ENABLED, allows_nil: false default_value_for :wiki_access_level, value: ENABLED, allows_nil: false
default_value_for :repository_access_level, value: ENABLED, allows_nil: false default_value_for :repository_access_level, value: ENABLED, allows_nil: false
after_create ->(model) { SiteStatistic.track(STATISTICS_ATTRIBUTE) if model.wiki_enabled? }
after_update :update_site_statistics
def feature_available?(feature, user) def feature_available?(feature, user)
get_permission(user, access_level(feature)) get_permission(user, access_level(feature))
end end
...@@ -82,30 +78,8 @@ class ProjectFeature < ActiveRecord::Base ...@@ -82,30 +78,8 @@ class ProjectFeature < ActiveRecord::Base
issues_access_level > DISABLED issues_access_level > DISABLED
end end
# This is a workaround for the removal hooks not been triggered when removing a Project.
#
# ProjectFeature is removed using database cascade index rule.
# This method is called by Project model when deletion starts.
def untrack_statistics_for_deletion!
return unless wiki_enabled?
SiteStatistic.untrack(STATISTICS_ATTRIBUTE)
end
private private
def update_site_statistics
return unless wiki_access_level_changed?
if self.wiki_access_level_was == DISABLED
# possible new states are PRIVATE / ENABLED, both should be tracked
SiteStatistic.track(STATISTICS_ATTRIBUTE)
elsif self.wiki_access_level == DISABLED
# old state was either PRIVATE / ENABLED, only untrack if new state is DISABLED
SiteStatistic.untrack(STATISTICS_ATTRIBUTE)
end
end
# Validates builds and merge requests access level # Validates builds and merge requests access level
# which cannot be higher than repository access level # which cannot be higher than repository access level
def repository_children_level def repository_children_level
......
...@@ -4,7 +4,7 @@ class SiteStatistic < ActiveRecord::Base ...@@ -4,7 +4,7 @@ class SiteStatistic < ActiveRecord::Base
# prevents the creation of multiple rows # prevents the creation of multiple rows
default_value_for :id, 1 default_value_for :id, 1
COUNTER_ATTRIBUTES = %w(repositories_count wikis_count).freeze COUNTER_ATTRIBUTES = %w(repositories_count).freeze
REQUIRED_SCHEMA_VERSION = 20180629153018 REQUIRED_SCHEMA_VERSION = 20180629153018
# Tracks specific attribute # Tracks specific attribute
......
# frozen_string_literal: true
class RemoveWikisCountFromSiteStatistics < ActiveRecord::Migration
def change
remove_column :site_statistics, :wikis_count, :integer
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20180914201132) do ActiveRecord::Schema.define(version: 20180917172041) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
...@@ -1908,7 +1908,6 @@ ActiveRecord::Schema.define(version: 20180914201132) do ...@@ -1908,7 +1908,6 @@ ActiveRecord::Schema.define(version: 20180914201132) do
create_table "site_statistics", force: :cascade do |t| create_table "site_statistics", force: :cascade do |t|
t.integer "repositories_count", default: 0, null: false t.integer "repositories_count", default: 0, null: false
t.integer "wikis_count", default: 0, null: false
end end
create_table "snippets", force: :cascade do |t| create_table "snippets", force: :cascade do |t|
......
...@@ -10,14 +10,6 @@ namespace :gitlab do ...@@ -10,14 +10,6 @@ namespace :gitlab do
SiteStatistic.update_all('repositories_count = (SELECT COUNT(*) FROM projects)') SiteStatistic.update_all('repositories_count = (SELECT COUNT(*) FROM projects)')
end end
puts 'OK!'.color(:green) puts 'OK!'.color(:green)
print '* Wikis... '
SiteStatistic.transaction do
# see https://gitlab.com/gitlab-org/gitlab-ce/issues/48967
ActiveRecord::Base.connection.execute('SET LOCAL statement_timeout TO 0') if Gitlab::Database.postgresql?
SiteStatistic.update_all('wikis_count = (SELECT COUNT(*) FROM project_features WHERE wiki_access_level != 0)')
end
puts 'OK!'.color(:green)
puts puts
end end
end end
...@@ -2,6 +2,5 @@ FactoryBot.define do ...@@ -2,6 +2,5 @@ FactoryBot.define do
factory :site_statistics, class: 'SiteStatistic' do factory :site_statistics, class: 'SiteStatistic' do
id 1 id 1
repositories_count 999 repositories_count 999
wikis_count 555
end end
end end
...@@ -119,46 +119,4 @@ describe ProjectFeature do ...@@ -119,46 +119,4 @@ describe ProjectFeature do
end end
end end
end end
context 'Site Statistics' do
set(:project_with_wiki) { create(:project, :wiki_enabled) }
set(:project_without_wiki) { create(:project, :wiki_disabled) }
context 'when creating a project' do
it 'tracks wiki availability when wikis are enabled by default' do
expect { create(:project) }.to change { SiteStatistic.fetch.wikis_count }.by(1)
end
it 'does not track wiki availability when wikis are disabled by default' do
expect { create(:project, :wiki_disabled) }.not_to change { SiteStatistic.fetch.wikis_count }
end
end
context 'when updating a project_feature' do
it 'untracks wiki availability when disabling wiki access' do
expect { project_with_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::DISABLED) }
.to change { SiteStatistic.fetch.wikis_count }.by(-1)
end
it 'tracks again wiki availability when re-enabling wiki access as public' do
expect { project_without_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::ENABLED) }
.to change { SiteStatistic.fetch.wikis_count }.by(1)
end
it 'tracks again wiki availability when re-enabling wiki access as private' do
expect { project_without_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::PRIVATE) }
.to change { SiteStatistic.fetch.wikis_count }.by(1)
end
end
context 'when removing a project' do
it 'untracks wiki availability when removing a project with previous wiki access' do
expect { project_with_wiki.destroy }.to change { SiteStatistic.fetch.wikis_count }.by(-1)
end
it 'does not untrack wiki availability when removing a project without wiki access' do
expect { project_without_wiki.destroy }.not_to change { SiteStatistic.fetch.wikis_count }
end
end
end
end end
...@@ -25,7 +25,6 @@ describe SiteStatistic do ...@@ -25,7 +25,6 @@ describe SiteStatistic do
it 'increases the attribute counter' do it 'increases the attribute counter' do
expect { described_class.track('repositories_count') }.to change { statistics.reload.repositories_count }.by(1) expect { described_class.track('repositories_count') }.to change { statistics.reload.repositories_count }.by(1)
expect { described_class.track('wikis_count') }.to change { statistics.reload.wikis_count }.by(1)
end end
it 'doesnt increase the attribute counter when an exception happens during transaction' do it 'doesnt increase the attribute counter when an exception happens during transaction' do
...@@ -56,7 +55,6 @@ describe SiteStatistic do ...@@ -56,7 +55,6 @@ describe SiteStatistic do
it 'decreases the attribute counter' do it 'decreases the attribute counter' do
expect { described_class.untrack('repositories_count') }.to change { statistics.reload.repositories_count }.by(-1) expect { described_class.untrack('repositories_count') }.to change { statistics.reload.repositories_count }.by(-1)
expect { described_class.untrack('wikis_count') }.to change { statistics.reload.wikis_count }.by(-1)
end end
it 'doesnt decrease the attribute counter when an exception happens during transaction' do it 'doesnt decrease the attribute counter when an exception happens during transaction' do
......
...@@ -35,14 +35,6 @@ describe Groups::DestroyService do ...@@ -35,14 +35,6 @@ describe Groups::DestroyService do
it { expect(NotificationSetting.unscoped.all).not_to include(notification_setting) } it { expect(NotificationSetting.unscoped.all).not_to include(notification_setting) }
end end
context 'site statistics' do
it 'doesnt trigger project deletion hooks twice' do
expect_any_instance_of(Project).to receive(:untrack_site_statistics).once
destroy_group(group, user, async)
end
end
context 'mattermost team' do context 'mattermost team' do
let!(:chat_team) { create(:chat_team, namespace: group) } let!(:chat_team) { create(:chat_team, namespace: group) }
......
...@@ -6,7 +6,7 @@ describe 'rake gitlab:refresh_site_statistics' do ...@@ -6,7 +6,7 @@ describe 'rake gitlab:refresh_site_statistics' do
Rake.application.rake_require 'tasks/gitlab/site_statistics' Rake.application.rake_require 'tasks/gitlab/site_statistics'
create(:project) create(:project)
SiteStatistic.fetch.update(repositories_count: 0, wikis_count: 0) SiteStatistic.fetch.update(repositories_count: 0)
end end
let(:task) { 'gitlab:refresh_site_statistics' } let(:task) { 'gitlab:refresh_site_statistics' }
...@@ -15,10 +15,9 @@ describe 'rake gitlab:refresh_site_statistics' do ...@@ -15,10 +15,9 @@ describe 'rake gitlab:refresh_site_statistics' do
run_rake_task(task) run_rake_task(task)
expect(SiteStatistic.fetch.repositories_count).to eq(1) expect(SiteStatistic.fetch.repositories_count).to eq(1)
expect(SiteStatistic.fetch.wikis_count).to eq(1)
end end
it 'displays message listing counters' do it 'displays message listing counters' do
expect { run_rake_task(task) }.to output(/Updating Site Statistics counters:.* Repositories\.\.\. OK!.* Wikis\.\.\. OK!/m).to_stdout expect { run_rake_task(task) }.to output(/Updating Site Statistics counters:.* Repositories\.\.\. OK!/m).to_stdout
end end
end end
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