Commit b4f92f7b authored by Heinrich Lee Yu's avatar Heinrich Lee Yu

Merge branch...

Merge branch '325638-api-version-repos-namespace-project-branches-should-not-query-the-primary-databases' into 'master'

Do not stick to primary after log Jira DVCS usage

See merge request gitlab-org/gitlab!57328
parents b67817ce d9b627dc
......@@ -20,12 +20,29 @@ class ProjectFeatureUsage < ApplicationRecord
end
def log_jira_dvcs_integration_usage(cloud: true)
transaction(requires_new: true) do
save unless persisted?
touch(self.class.jira_dvcs_integration_field(cloud: cloud))
integration_field = self.class.jira_dvcs_integration_field(cloud: cloud)
# The feature usage is used only once later to query the feature usage in a
# long date range. Therefore, we just need to update the timestamp once per
# day
return if persisted? && updated_today?(integration_field)
persist_jira_dvcs_usage(integration_field)
end
private
def updated_today?(integration_field)
self[integration_field].present? && self[integration_field].today?
end
def persist_jira_dvcs_usage(integration_field)
assign_attributes(integration_field => Time.current)
save
rescue ActiveRecord::RecordNotUnique
reset
retry
end
end
ProjectFeatureUsage.prepend_if_ee('EE::ProjectFeatureUsage')
# frozen_string_literal: true
module EE
module ProjectFeatureUsage
extend ActiveSupport::Concern
extend ::Gitlab::Utils::Override
override :log_jira_dvcs_integration_usage
def log_jira_dvcs_integration_usage(**options)
::Gitlab::Database::LoadBalancing::Session.without_sticky_writes do
super(**options)
end
end
end
end
---
title: Do not stick to primary after log Jira DVCS usage
merge_request: 57328
author:
type: performance
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe ProjectFeatureUsage, :request_store do
describe '#log_jira_dvcs_integration_usage' do
let!(:project) { create(:project) }
subject { project.feature_usage }
context 'database load balancing is configured' do
before do
# Do not pollute AR for other tests, but rather simulate effect of configure_proxy.
allow(ActiveRecord::Base.singleton_class).to receive(:prepend)
::Gitlab::Database::LoadBalancing.configure_proxy
allow(ActiveRecord::Base).to receive(:connection).and_return(::Gitlab::Database::LoadBalancing.proxy)
::Gitlab::Database::LoadBalancing::Session.clear_session
end
after do
::Gitlab::Database::LoadBalancing.clear_configuration
end
it 'logs Jira DVCS Cloud last sync' do
freeze_time do
subject.log_jira_dvcs_integration_usage
expect(subject.jira_dvcs_server_last_sync_at).to be_nil
expect(subject.jira_dvcs_cloud_last_sync_at).to be_like_time(Time.current)
end
end
it 'does not stick to primary' do
expect(::Gitlab::Database::LoadBalancing::Session.current).not_to be_performed_write
expect(::Gitlab::Database::LoadBalancing::Session.current).not_to be_using_primary
subject.log_jira_dvcs_integration_usage
expect(::Gitlab::Database::LoadBalancing::Session.current).to be_performed_write
expect(::Gitlab::Database::LoadBalancing::Session.current).not_to be_using_primary
end
end
context 'database load balancing is not cofigured' do
it 'logs Jira DVCS Cloud last sync' do
freeze_time do
subject.log_jira_dvcs_integration_usage
expect(subject.jira_dvcs_server_last_sync_at).to be_nil
expect(subject.jira_dvcs_cloud_last_sync_at).to be_like_time(Time.current)
end
end
end
end
end
......@@ -24,6 +24,7 @@ RSpec.describe ProjectFeatureUsage, type: :model do
subject { project.feature_usage }
context 'when the feature usage has not been created yet' do
it 'logs Jira DVCS Cloud last sync' do
freeze_time do
subject.log_jira_dvcs_integration_usage
......@@ -41,6 +42,75 @@ RSpec.describe ProjectFeatureUsage, type: :model do
expect(subject.jira_dvcs_cloud_last_sync_at).to be_nil
end
end
end
context 'when the feature usage already exists' do
let(:today) { Time.current.beginning_of_day }
let(:project) { create(:project) }
subject { project.feature_usage }
where(:cloud, :timestamp_field) do
[
[true, :jira_dvcs_cloud_last_sync_at],
[false, :jira_dvcs_server_last_sync_at]
]
end
with_them do
context 'when Jira DVCS Cloud last sync has not been logged' do
before do
travel_to today - 3.days do
subject.log_jira_dvcs_integration_usage(cloud: !cloud)
end
end
it 'logs Jira DVCS Cloud last sync' do
freeze_time do
subject.log_jira_dvcs_integration_usage(cloud: cloud)
expect(subject.reload.send(timestamp_field)).to be_like_time(Time.current)
end
end
end
context 'when Jira DVCS Cloud last sync was logged today' do
let(:last_updated) { today + 1.hour }
before do
travel_to last_updated do
subject.log_jira_dvcs_integration_usage(cloud: cloud)
end
end
it 'does not log Jira DVCS Cloud last sync' do
travel_to today + 2.hours do
subject.log_jira_dvcs_integration_usage(cloud: cloud)
expect(subject.reload.send(timestamp_field)).to be_like_time(last_updated)
end
end
end
context 'when Jira DVCS Cloud last sync was logged yesterday' do
let(:last_updated) { today - 2.days }
before do
travel_to last_updated do
subject.log_jira_dvcs_integration_usage(cloud: cloud)
end
end
it 'logs Jira DVCS Cloud last sync' do
travel_to today + 1.hour do
subject.log_jira_dvcs_integration_usage(cloud: cloud)
expect(subject.reload.send(timestamp_field)).to be_like_time(today + 1.hour)
end
end
end
end
end
context 'when log_jira_dvcs_integration_usage is called simultaneously for the same project' do
it 'logs the latest call' do
......
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