Commit 63307438 authored by Michael Kozono's avatar Michael Kozono

Track missing on primary counts in GeoNodeStatus

And as a result, these are added as metrics.
parent 6b5787f4
...@@ -32,6 +32,14 @@ module Geo ...@@ -32,6 +32,14 @@ module Geo
end end
end end
def count_synced_missing_on_primary_attachments
if aggregate_pushdown_supported? && !use_legacy_queries?
fdw_find_synced_missing_on_primary_attachments.count
else
legacy_find_synced_missing_on_primary_attachments.count
end
end
def count_registry_attachments def count_registry_attachments
Geo::FileRegistry.attachments.count Geo::FileRegistry.attachments.count
end end
...@@ -154,6 +162,10 @@ module Geo ...@@ -154,6 +162,10 @@ module Geo
.where.not(id: except_file_ids) .where.not(id: except_file_ids)
end end
def fdw_find_synced_missing_on_primary_attachments
fdw_find_synced_attachments.merge(Geo::FileRegistry.missing_on_primary)
end
def fdw_attachments def fdw_attachments
if selective_sync? if selective_sync?
Geo::Fdw::Upload.where(group_uploads.or(project_uploads).or(other_uploads)) Geo::Fdw::Upload.where(group_uploads.or(project_uploads).or(other_uploads))
...@@ -212,5 +224,13 @@ module Geo ...@@ -212,5 +224,13 @@ module Geo
Upload Upload
) )
end end
def legacy_find_synced_missing_on_primary_attachments
legacy_inner_join_registry_ids(
local_attachments,
Geo::FileRegistry.attachments.synced.missing_on_primary.pluck(:file_id),
Upload
)
end
end end
end end
...@@ -20,6 +20,14 @@ module Geo ...@@ -20,6 +20,14 @@ module Geo
end end
end end
def count_synced_missing_on_primary_job_artifacts
if aggregate_pushdown_supported?
find_synced_missing_on_primary_job_artifacts.count
else
legacy_find_synced_missing_on_primary_job_artifacts.count
end
end
def count_registry_job_artifacts def count_registry_job_artifacts
Geo::JobArtifactRegistry.count Geo::JobArtifactRegistry.count
end end
......
...@@ -20,6 +20,14 @@ module Geo ...@@ -20,6 +20,14 @@ module Geo
end end
end end
def count_synced_missing_on_primary_lfs_objects
if aggregate_pushdown_supported? && !use_legacy_queries?
fdw_find_synced_missing_on_primary_lfs_objects.count
else
legacy_find_synced_missing_on_primary_lfs_objects.count
end
end
def count_registry_lfs_objects def count_registry_lfs_objects
Geo::FileRegistry.lfs_objects.count Geo::FileRegistry.lfs_objects.count
end end
...@@ -82,7 +90,7 @@ module Geo ...@@ -82,7 +90,7 @@ module Geo
if use_legacy_queries? if use_legacy_queries?
legacy_find_synced_lfs_objects legacy_find_synced_lfs_objects
else else
fdw_find_lfs_objects.merge(Geo::FileRegistry.synced) fdw_find_synced_lfs_objects
end end
end end
...@@ -90,7 +98,7 @@ module Geo ...@@ -90,7 +98,7 @@ module Geo
if use_legacy_queries? if use_legacy_queries?
legacy_find_failed_lfs_objects legacy_find_failed_lfs_objects
else else
fdw_find_lfs_objects.merge(Geo::FileRegistry.failed) fdw_find_failed_lfs_objects
end end
end end
...@@ -120,6 +128,18 @@ module Geo ...@@ -120,6 +128,18 @@ module Geo
.merge(Geo::FileRegistry.lfs_objects) .merge(Geo::FileRegistry.lfs_objects)
end end
def fdw_find_synced_lfs_objects
fdw_find_lfs_objects.merge(Geo::FileRegistry.synced)
end
def fdw_find_synced_missing_on_primary_lfs_objects
fdw_find_lfs_objects.merge(Geo::FileRegistry.synced.missing_on_primary)
end
def fdw_find_failed_lfs_objects
fdw_find_lfs_objects.merge(Geo::FileRegistry.failed)
end
def fdw_lfs_objects def fdw_lfs_objects
if selective_sync? if selective_sync?
Geo::Fdw::LfsObject.joins(:project).where(projects: { id: current_node.projects }) Geo::Fdw::LfsObject.joins(:project).where(projects: { id: current_node.projects })
...@@ -171,5 +191,13 @@ module Geo ...@@ -171,5 +191,13 @@ module Geo
LfsObject LfsObject
) )
end end
def legacy_find_synced_missing_on_primary_lfs_objects
legacy_inner_join_registry_ids(
local_lfs_objects,
Geo::FileRegistry.lfs_objects.synced.missing_on_primary.pluck(:file_id),
LfsObject
)
end
end end
end end
...@@ -37,14 +37,17 @@ class GeoNodeStatus < ActiveRecord::Base ...@@ -37,14 +37,17 @@ class GeoNodeStatus < ActiveRecord::Base
lfs_objects_synced_count: 'Number of local LFS objects synced on secondary', lfs_objects_synced_count: 'Number of local LFS objects synced on secondary',
lfs_objects_failed_count: 'Number of local LFS objects failed to sync on secondary', lfs_objects_failed_count: 'Number of local LFS objects failed to sync on secondary',
lfs_objects_registry_count: 'Number of LFS objects in the registry', lfs_objects_registry_count: 'Number of LFS objects in the registry',
lfs_objects_synced_missing_on_primary_count: 'Number of LFS objects marked as synced due to the file missing on the primary',
job_artifacts_count: 'Total number of local job artifacts available on primary', job_artifacts_count: 'Total number of local job artifacts available on primary',
job_artifacts_synced_count: 'Number of local job artifacts synced on secondary', job_artifacts_synced_count: 'Number of local job artifacts synced on secondary',
job_artifacts_failed_count: 'Number of local job artifacts failed to sync on secondary', job_artifacts_failed_count: 'Number of local job artifacts failed to sync on secondary',
job_artifacts_registry_count: 'Number of job artifacts in the registry', job_artifacts_registry_count: 'Number of job artifacts in the registry',
job_artifacts_synced_missing_on_primary_count: 'Number of job artifacts marked as synced due to the file missing on the primary',
attachments_count: 'Total number of local file attachments available on primary', attachments_count: 'Total number of local file attachments available on primary',
attachments_synced_count: 'Number of local file attachments synced on secondary', attachments_synced_count: 'Number of local file attachments synced on secondary',
attachments_failed_count: 'Number of local file attachments failed to sync on secondary', attachments_failed_count: 'Number of local file attachments failed to sync on secondary',
attachments_registry_count: 'Number of attachments in the registry', attachments_registry_count: 'Number of attachments in the registry',
attachments_synced_missing_on_primary_count: 'Number of attachments marked as synced due to the file missing on the primary',
replication_slots_count: 'Total number of replication slots on the primary', replication_slots_count: 'Total number of replication slots on the primary',
replication_slots_used_count: 'Number of replication slots in use on the primary', replication_slots_used_count: 'Number of replication slots in use on the primary',
replication_slots_max_retained_wal_bytes: 'Maximum number of bytes retained in the WAL on the primary', replication_slots_max_retained_wal_bytes: 'Maximum number of bytes retained in the WAL on the primary',
...@@ -168,12 +171,15 @@ class GeoNodeStatus < ActiveRecord::Base ...@@ -168,12 +171,15 @@ class GeoNodeStatus < ActiveRecord::Base
self.lfs_objects_synced_count = lfs_objects_finder.count_synced_lfs_objects self.lfs_objects_synced_count = lfs_objects_finder.count_synced_lfs_objects
self.lfs_objects_failed_count = lfs_objects_finder.count_failed_lfs_objects self.lfs_objects_failed_count = lfs_objects_finder.count_failed_lfs_objects
self.lfs_objects_registry_count = lfs_objects_finder.count_registry_lfs_objects self.lfs_objects_registry_count = lfs_objects_finder.count_registry_lfs_objects
self.lfs_objects_synced_missing_on_primary_count = lfs_objects_finder.count_synced_missing_on_primary_lfs_objects
self.job_artifacts_synced_count = job_artifacts_finder.count_synced_job_artifacts self.job_artifacts_synced_count = job_artifacts_finder.count_synced_job_artifacts
self.job_artifacts_failed_count = job_artifacts_finder.count_failed_job_artifacts self.job_artifacts_failed_count = job_artifacts_finder.count_failed_job_artifacts
self.job_artifacts_registry_count = job_artifacts_finder.count_registry_job_artifacts self.job_artifacts_registry_count = job_artifacts_finder.count_registry_job_artifacts
self.job_artifacts_synced_missing_on_primary_count = job_artifacts_finder.count_synced_missing_on_primary_job_artifacts
self.attachments_synced_count = attachments_finder.count_synced_attachments self.attachments_synced_count = attachments_finder.count_synced_attachments
self.attachments_failed_count = attachments_finder.count_failed_attachments self.attachments_failed_count = attachments_finder.count_failed_attachments
self.attachments_registry_count = attachments_finder.count_registry_attachments self.attachments_registry_count = attachments_finder.count_registry_attachments
self.attachments_synced_missing_on_primary_count = attachments_finder.count_synced_missing_on_primary_attachments
end end
end end
......
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class AddMissingOnPrimaryCountsToGeoNodeStatuses < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
def change
add_column :geo_node_statuses, :lfs_objects_synced_missing_on_primary_count, :integer
add_column :geo_node_statuses, :job_artifacts_synced_missing_on_primary_count, :integer
add_column :geo_node_statuses, :attachments_synced_missing_on_primary_count, :integer
end
end
...@@ -260,6 +260,7 @@ module EE ...@@ -260,6 +260,7 @@ module EE
expose :attachments_count expose :attachments_count
expose :attachments_synced_count expose :attachments_synced_count
expose :attachments_failed_count expose :attachments_failed_count
expose :attachments_synced_missing_on_primary_count
expose :attachments_synced_in_percentage do |node| expose :attachments_synced_in_percentage do |node|
number_to_percentage(node.attachments_synced_in_percentage, precision: 2) number_to_percentage(node.attachments_synced_in_percentage, precision: 2)
end end
...@@ -269,6 +270,7 @@ module EE ...@@ -269,6 +270,7 @@ module EE
expose :lfs_objects_count expose :lfs_objects_count
expose :lfs_objects_synced_count expose :lfs_objects_synced_count
expose :lfs_objects_failed_count expose :lfs_objects_failed_count
expose :lfs_objects_synced_missing_on_primary_count
expose :lfs_objects_synced_in_percentage do |node| expose :lfs_objects_synced_in_percentage do |node|
number_to_percentage(node.lfs_objects_synced_in_percentage, precision: 2) number_to_percentage(node.lfs_objects_synced_in_percentage, precision: 2)
end end
...@@ -276,6 +278,7 @@ module EE ...@@ -276,6 +278,7 @@ module EE
expose :job_artifacts_count expose :job_artifacts_count
expose :job_artifacts_synced_count expose :job_artifacts_synced_count
expose :job_artifacts_failed_count expose :job_artifacts_failed_count
expose :job_artifacts_synced_missing_on_primary_count
expose :job_artifacts_synced_in_percentage do |node| expose :job_artifacts_synced_in_percentage do |node|
number_to_percentage(node.job_artifacts_synced_in_percentage, precision: 2) number_to_percentage(node.job_artifacts_synced_in_percentage, precision: 2)
end end
......
...@@ -8,12 +8,15 @@ FactoryBot.define do ...@@ -8,12 +8,15 @@ FactoryBot.define do
attachments_count 329 attachments_count 329
attachments_failed_count 13 attachments_failed_count 13
attachments_synced_count 141 attachments_synced_count 141
attachments_synced_missing_on_primary_count 89
lfs_objects_count 256 lfs_objects_count 256
lfs_objects_failed_count 12 lfs_objects_failed_count 12
lfs_objects_synced_count 123 lfs_objects_synced_count 123
lfs_objects_synced_missing_on_primary_count 90
job_artifacts_count 580 job_artifacts_count 580
job_artifacts_failed_count 3 job_artifacts_failed_count 3
job_artifacts_synced_count 577 job_artifacts_synced_count 577
job_artifacts_synced_missing_on_primary_count 91
repositories_count 10 repositories_count 10
repositories_synced_count 5 repositories_synced_count 5
repositories_failed_count 0 repositories_failed_count 0
......
...@@ -21,6 +21,7 @@ describe Geo::AttachmentRegistryFinder, :geo do ...@@ -21,6 +21,7 @@ describe Geo::AttachmentRegistryFinder, :geo do
let(:upload_8) { create(:upload, :object_storage, model: unsynced_project) } let(:upload_8) { create(:upload, :object_storage, model: unsynced_project) }
let(:upload_9) { create(:upload, :object_storage, model: unsynced_group) } let(:upload_9) { create(:upload, :object_storage, model: unsynced_group) }
let(:lfs_object) { create(:lfs_object) } let(:lfs_object) { create(:lfs_object) }
let(:upload_remote_1) { create(:upload, :object_storage, model: synced_project) }
subject { described_class.new(current_node: secondary) } subject { described_class.new(current_node: secondary) }
...@@ -28,6 +29,242 @@ describe Geo::AttachmentRegistryFinder, :geo do ...@@ -28,6 +29,242 @@ describe Geo::AttachmentRegistryFinder, :geo do
stub_current_geo_node(secondary) stub_current_geo_node(secondary)
end end
shared_examples 'counts all the things' do
describe '#count_local_attachments' do
before do
upload_1
upload_2
upload_3
upload_4
end
it 'counts attachments' do
expect(subject.count_local_attachments).to eq 4
end
it 'ignores remote attachments' do
upload_1.update!(store: ObjectStorage::Store::REMOTE)
expect(subject.count_local_attachments).to eq 3
end
context 'with selective sync' do
before do
secondary.update!(selective_sync_type: 'namespaces', namespaces: [synced_group])
end
it 'counts attachments' do
expect(subject.count_local_attachments).to eq 2
end
it 'ignores remote attachments' do
upload_1.update!(store: ObjectStorage::Store::REMOTE)
expect(subject.count_local_attachments).to eq 1
end
end
end
describe '#count_synced_attachments' do
it 'delegates to #legacy_find_synced_attachments' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_synced_attachments).and_call_original
subject.count_synced_attachments
end
it 'delegates to #find_synced_attachments for PostgreSQL 10' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_synced_attachments).and_call_original
subject.count_synced_attachments
end
it 'counts attachments that have been synced' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_2.id)
create(:geo_file_registry, :attachment, file_id: upload_3.id)
expect(subject.count_synced_attachments).to eq 2
end
it 'ignores remote attachments' do
create(:geo_file_registry, :attachment, file_id: upload_remote_1.id)
create(:geo_file_registry, :attachment, file_id: upload_2.id)
create(:geo_file_registry, :attachment, file_id: upload_3.id)
expect(subject.count_synced_attachments).to eq 2
end
context 'with selective sync' do
before do
secondary.update!(selective_sync_type: 'namespaces', namespaces: [synced_group])
end
it 'delegates to #legacy_find_synced_attachments' do
expect(subject).to receive(:legacy_find_synced_attachments).and_call_original
subject.count_synced_attachments
end
it 'counts attachments that has been synced' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_2.id)
create(:geo_file_registry, :attachment, file_id: upload_3.id)
expect(subject.count_synced_attachments).to eq 1
end
it 'ignores remote attachments' do
create(:geo_file_registry, :attachment, file_id: upload_remote_1.id)
create(:geo_file_registry, :attachment, file_id: upload_2.id)
create(:geo_file_registry, :attachment, file_id: upload_3.id)
expect(subject.count_synced_attachments).to eq 1
end
end
end
describe '#count_failed_attachments' do
it 'delegates to #legacy_find_failed_attachments' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_failed_attachments).and_call_original
subject.count_failed_attachments
end
it 'delegates to #find_failed_attachments' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_failed_attachments).and_call_original
subject.count_failed_attachments
end
it 'counts attachments that sync has failed' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_2.id)
create(:geo_file_registry, :attachment, file_id: upload_3.id, success: false)
expect(subject.count_failed_attachments).to eq 2
end
it 'ignores remote attachments' do
create(:geo_file_registry, :attachment, file_id: upload_remote_1.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_2.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_3.id, success: false)
expect(subject.count_failed_attachments).to eq 2
end
context 'with selective sync' do
before do
secondary.update!(selective_sync_type: 'namespaces', namespaces: [synced_group])
end
it 'delegates to #legacy_find_failed_attachments' do
expect(subject).to receive(:legacy_find_failed_attachments).and_call_original
subject.count_failed_attachments
end
it 'counts attachments that sync has failed' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_3.id)
expect(subject.count_failed_attachments).to eq 1
end
it 'does not count attachments of unsynced projects' do
create(:geo_file_registry, :attachment, file_id: upload_2.id, success: false)
expect(subject.count_failed_attachments).to eq 0
end
it 'ignores remote attachments' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_2.id, success: false)
create(:geo_file_registry, :attachment, file_id: upload_3.id, success: false)
upload_1.update!(store: ObjectStorage::Store::REMOTE)
expect(subject.count_failed_attachments).to eq 1
end
end
end
describe '#count_synced_missing_on_primary_attachments' do
it 'delegates to #legacy_find_synced_missing_on_primary_attachments' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_synced_missing_on_primary_attachments).and_call_original
subject.count_synced_missing_on_primary_attachments
end
it 'delegates to #fdw_find_synced_missing_on_primary_attachments for PostgreSQL 10' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
allow(subject).to receive(:use_legacy_queries?).and_return(false)
expect(subject).to receive(:fdw_find_synced_missing_on_primary_attachments).and_return(double(count: 1))
subject.count_synced_missing_on_primary_attachments
end
it 'counts attachments that have been synced and are missing on the primary' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_attachments).to eq 1
end
it 'excludes attachments that are not missing on the primary' do
create(:geo_file_registry, :attachment, file_id: upload_1.id)
expect(subject.count_synced_missing_on_primary_attachments).to eq 0
end
it 'excludes attachments that are not synced' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, success: false, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_attachments).to eq 0
end
it 'ignores remote attachments' do
create(:geo_file_registry, :attachment, file_id: upload_remote_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_attachments).to eq 0
end
context 'with selective sync' do
before do
secondary.update!(selective_sync_type: 'namespaces', namespaces: [synced_group])
end
it 'delegates to #legacy_find_synced_missing_on_primary_attachments' do
expect(subject).to receive(:legacy_find_synced_missing_on_primary_attachments).and_call_original
subject.count_synced_missing_on_primary_attachments
end
it 'counts attachments that has been synced' do
create(:geo_file_registry, :attachment, file_id: upload_1.id, missing_on_primary: true)
create(:geo_file_registry, :attachment, file_id: upload_2.id, missing_on_primary: true)
create(:geo_file_registry, :attachment, file_id: upload_3.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_attachments).to eq 2
end
it 'ignores remote attachments' do
create(:geo_file_registry, :attachment, file_id: upload_remote_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_attachments).to eq 0
end
end
end
end
shared_examples 'finds all the things' do shared_examples 'finds all the things' do
describe '#find_synced_attachments' do describe '#find_synced_attachments' do
it 'delegates to the correct method' do it 'delegates to the correct method' do
...@@ -239,6 +476,8 @@ describe Geo::AttachmentRegistryFinder, :geo do ...@@ -239,6 +476,8 @@ describe Geo::AttachmentRegistryFinder, :geo do
skip('FDW is not configured') if Gitlab::Database.postgresql? && !Gitlab::Geo::Fdw.enabled? skip('FDW is not configured') if Gitlab::Database.postgresql? && !Gitlab::Geo::Fdw.enabled?
end end
include_examples 'counts all the things'
include_examples 'finds all the things' do include_examples 'finds all the things' do
let(:method_prefix) { 'fdw' } let(:method_prefix) { 'fdw' }
end end
...@@ -267,6 +506,8 @@ describe Geo::AttachmentRegistryFinder, :geo do ...@@ -267,6 +506,8 @@ describe Geo::AttachmentRegistryFinder, :geo do
allow(Gitlab::Geo::Fdw).to receive(:enabled?).and_return(false) allow(Gitlab::Geo::Fdw).to receive(:enabled?).and_return(false)
end end
include_examples 'counts all the things'
include_examples 'finds all the things' do include_examples 'finds all the things' do
let(:method_prefix) { 'legacy' } let(:method_prefix) { 'legacy' }
end end
......
...@@ -22,42 +22,6 @@ describe Geo::JobArtifactRegistryFinder, :geo do ...@@ -22,42 +22,6 @@ describe Geo::JobArtifactRegistryFinder, :geo do
stub_artifacts_object_storage stub_artifacts_object_storage
end end
describe '#count_synced_job_artifacts' do
it 'delegates to #legacy_find_synced_job_artifacts' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_synced_job_artifacts).and_call_original
subject.count_synced_job_artifacts
end
it 'delegates to #find_synced_job_artifacts for PostgreSQL 10' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_synced_job_artifacts).and_call_original
subject.count_synced_job_artifacts
end
end
describe '#count_failed_job_artifacts' do
it 'delegates to #legacy_find_failed_job_artifacts' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_failed_job_artifacts).and_call_original
subject.count_failed_job_artifacts
end
it 'delegates to #find_failed_job_artifacts' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_failed_job_artifacts).and_call_original
subject.count_failed_job_artifacts
end
end
shared_examples 'counts all the things' do shared_examples 'counts all the things' do
describe '#count_local_job_artifacts' do describe '#count_local_job_artifacts' do
before do before do
...@@ -95,6 +59,22 @@ describe Geo::JobArtifactRegistryFinder, :geo do ...@@ -95,6 +59,22 @@ describe Geo::JobArtifactRegistryFinder, :geo do
end end
describe '#count_synced_job_artifacts' do describe '#count_synced_job_artifacts' do
it 'delegates to #legacy_find_synced_job_artifacts' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_synced_job_artifacts).and_call_original
subject.count_synced_job_artifacts
end
it 'delegates to #find_synced_job_artifacts for PostgreSQL 10' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_synced_job_artifacts).and_call_original
subject.count_synced_job_artifacts
end
it 'counts job artifacts that have been synced' do it 'counts job artifacts that have been synced' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id, success: false) create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id, success: false)
create(:geo_job_artifact_registry, artifact_id: job_artifact_2.id) create(:geo_job_artifact_registry, artifact_id: job_artifact_2.id)
...@@ -141,6 +121,22 @@ describe Geo::JobArtifactRegistryFinder, :geo do ...@@ -141,6 +121,22 @@ describe Geo::JobArtifactRegistryFinder, :geo do
end end
describe '#count_failed_job_artifacts' do describe '#count_failed_job_artifacts' do
it 'delegates to #legacy_find_failed_job_artifacts' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_failed_job_artifacts).and_call_original
subject.count_failed_job_artifacts
end
it 'delegates to #find_failed_job_artifacts' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_failed_job_artifacts).and_call_original
subject.count_failed_job_artifacts
end
it 'counts job artifacts that sync has failed' do it 'counts job artifacts that sync has failed' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id, success: false) create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id, success: false)
create(:geo_job_artifact_registry, artifact_id: job_artifact_2.id) create(:geo_job_artifact_registry, artifact_id: job_artifact_2.id)
...@@ -191,6 +187,74 @@ describe Geo::JobArtifactRegistryFinder, :geo do ...@@ -191,6 +187,74 @@ describe Geo::JobArtifactRegistryFinder, :geo do
end end
end end
end end
describe '#count_synced_missing_on_primary_job_artifacts' do
it 'delegates to #legacy_find_synced_missing_on_primary_job_artifacts' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_synced_missing_on_primary_job_artifacts).and_call_original
subject.count_synced_missing_on_primary_job_artifacts
end
it 'delegates to #find_synced_missing_on_primary_job_artifacts for PostgreSQL 10' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_synced_missing_on_primary_job_artifacts).and_call_original
subject.count_synced_missing_on_primary_job_artifacts
end
it 'counts job artifacts that have been synced and are missing on the primary' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_job_artifacts).to eq 1
end
it 'excludes job artifacts that are not missing on the primary' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id)
expect(subject.count_synced_missing_on_primary_job_artifacts).to eq 0
end
it 'excludes job artifacts that are not synced' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id, success: false, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_job_artifacts).to eq 0
end
it 'ignores remote job artifacts' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_remote_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_job_artifacts).to eq 0
end
context 'with selective sync' do
before do
secondary.update!(selective_sync_type: 'namespaces', namespaces: [synced_group])
end
it 'delegates to #legacy_find_synced_missing_on_primary_job_artifacts' do
expect(subject).to receive(:legacy_find_synced_missing_on_primary_job_artifacts).and_call_original
subject.count_synced_missing_on_primary_job_artifacts
end
it 'counts job artifacts that has been synced' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_1.id, missing_on_primary: true)
create(:geo_job_artifact_registry, artifact_id: job_artifact_2.id, missing_on_primary: true)
create(:geo_job_artifact_registry, artifact_id: job_artifact_3.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_job_artifacts).to eq 2
end
it 'ignores remote job artifacts' do
create(:geo_job_artifact_registry, artifact_id: job_artifact_remote_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_job_artifacts).to eq 0
end
end
end
end end
shared_examples 'finds all the things' do shared_examples 'finds all the things' do
......
...@@ -22,30 +22,66 @@ describe Geo::LfsObjectRegistryFinder, :geo do ...@@ -22,30 +22,66 @@ describe Geo::LfsObjectRegistryFinder, :geo do
stub_lfs_object_storage stub_lfs_object_storage
end end
context 'aggregate pushdown not supported' do shared_examples 'counts all the things' do
before do describe '#count_local_lfs_objects' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false) before do
lfs_object_1
lfs_object_2
lfs_object_3
lfs_object_4
end
it 'counts LFS objects' do
expect(subject.count_local_lfs_objects).to eq 4
end
it 'ignores remote LFS objects' do
lfs_object_1.update_column(:file_store, ObjectStorage::Store::REMOTE)
expect(subject.count_local_lfs_objects).to eq 3
end
context 'with selective sync' do
before do
allow_any_instance_of(LfsObjectsProject).to receive(:update_project_statistics).and_return(nil)
create(:lfs_objects_project, project: synced_project, lfs_object: lfs_object_1)
create(:lfs_objects_project, project: synced_project, lfs_object: lfs_object_2)
create(:lfs_objects_project, project: unsynced_project, lfs_object: lfs_object_3)
secondary.update!(selective_sync_type: 'namespaces', namespaces: [synced_group])
end
it 'counts LFS objects' do
expect(subject.count_local_lfs_objects).to eq 2
end
it 'ignores remote LFS objects' do
lfs_object_1.update_column(:file_store, ObjectStorage::Store::REMOTE)
expect(subject.count_local_lfs_objects).to eq 1
end
end
end end
describe '#count_synced_lfs_objects' do describe '#count_synced_lfs_objects' do
it 'delegates to #legacy_find_synced_lfs_objects' do it 'delegates to #legacy_find_synced_lfs_objects' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_synced_lfs_objects).and_call_original expect(subject).to receive(:legacy_find_synced_lfs_objects).and_call_original
subject.count_synced_lfs_objects subject.count_synced_lfs_objects
end end
end
describe '#count_failed_lfs_objects' do it 'delegates to #fdw_find_synced_lfs_objects for PostgreSQL 10' do
it 'delegates to #legacy_find_failed_lfs_objects' do allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:legacy_find_failed_lfs_objects).and_call_original allow(subject).to receive(:use_legacy_queries?).and_return(false)
subject.count_failed_lfs_objects expect(subject).to receive(:fdw_find_synced_lfs_objects).and_return(double(count: 1))
subject.count_synced_lfs_objects
end end
end
end
shared_examples 'counts all the things' do
describe '#count_synced_lfs_objects' do
it 'counts LFS objects that has been synced' do it 'counts LFS objects that has been synced' do
create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, success: false) create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, success: false)
create(:geo_file_registry, :lfs, file_id: lfs_object_2.id) create(:geo_file_registry, :lfs, file_id: lfs_object_2.id)
...@@ -88,9 +124,10 @@ describe Geo::LfsObjectRegistryFinder, :geo do ...@@ -88,9 +124,10 @@ describe Geo::LfsObjectRegistryFinder, :geo do
end end
it 'ignores remote LFS objects' do it 'ignores remote LFS objects' do
create(:geo_file_registry, :lfs, file_id: lfs_object_remote_1.id) create(:geo_file_registry, :lfs, file_id: lfs_object_1.id)
create(:geo_file_registry, :lfs, file_id: lfs_object_2.id) create(:geo_file_registry, :lfs, file_id: lfs_object_2.id)
create(:geo_file_registry, :lfs, file_id: lfs_object_3.id) create(:geo_file_registry, :lfs, file_id: lfs_object_3.id)
lfs_object_1.update_column(:file_store, ObjectStorage::Store::REMOTE)
expect(subject.count_synced_lfs_objects).to eq 1 expect(subject.count_synced_lfs_objects).to eq 1
end end
...@@ -98,6 +135,22 @@ describe Geo::LfsObjectRegistryFinder, :geo do ...@@ -98,6 +135,22 @@ describe Geo::LfsObjectRegistryFinder, :geo do
end end
describe '#count_failed_lfs_objects' do describe '#count_failed_lfs_objects' do
it 'delegates to #legacy_find_failed_lfs_objects' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_failed_lfs_objects).and_call_original
subject.count_failed_lfs_objects
end
it 'delegates to #find_failed_lfs_objects' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
expect(subject).to receive(:find_failed_lfs_objects).and_call_original
subject.count_failed_lfs_objects
end
it 'counts LFS objects that sync has failed' do it 'counts LFS objects that sync has failed' do
create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, success: false) create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, success: false)
create(:geo_file_registry, :lfs, file_id: lfs_object_2.id) create(:geo_file_registry, :lfs, file_id: lfs_object_2.id)
...@@ -140,14 +193,90 @@ describe Geo::LfsObjectRegistryFinder, :geo do ...@@ -140,14 +193,90 @@ describe Geo::LfsObjectRegistryFinder, :geo do
end end
it 'ignores remote LFS objects' do it 'ignores remote LFS objects' do
create(:geo_file_registry, :lfs, file_id: lfs_object_remote_1.id, success: false) create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, success: false)
create(:geo_file_registry, :lfs, file_id: lfs_object_2.id, success: false) create(:geo_file_registry, :lfs, file_id: lfs_object_2.id, success: false)
create(:geo_file_registry, :lfs, file_id: lfs_object_3.id, success: false) create(:geo_file_registry, :lfs, file_id: lfs_object_3.id, success: false)
lfs_object_1.update_column(:file_store, ObjectStorage::Store::REMOTE)
expect(subject.count_failed_lfs_objects).to eq 1 expect(subject.count_failed_lfs_objects).to eq 1
end end
end end
end end
describe '#count_synced_missing_on_primary_lfs_objects' do
it 'delegates to #legacy_find_synced_missing_on_primary_lfs_objects' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(false)
expect(subject).to receive(:legacy_find_synced_missing_on_primary_lfs_objects).and_call_original
subject.count_synced_missing_on_primary_lfs_objects
end
it 'delegates to #fdw_find_synced_missing_on_primary_lfs_objects for PostgreSQL 10' do
allow(subject).to receive(:aggregate_pushdown_supported?).and_return(true)
allow(subject).to receive(:use_legacy_queries?).and_return(false)
expect(subject).to receive(:fdw_find_synced_missing_on_primary_lfs_objects).and_return(double(count: 1))
subject.count_synced_missing_on_primary_lfs_objects
end
it 'counts LFS objects that have been synced and are missing on the primary' do
create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_lfs_objects).to eq 1
end
it 'excludes LFS objects that are not missing on the primary' do
create(:geo_file_registry, :lfs, file_id: lfs_object_1.id)
expect(subject.count_synced_missing_on_primary_lfs_objects).to eq 0
end
it 'excludes LFS objects that are not synced' do
create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, success: false, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_lfs_objects).to eq 0
end
it 'ignores remote LFS objects' do
create(:geo_file_registry, :lfs, file_id: lfs_object_remote_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_lfs_objects).to eq 0
end
context 'with selective sync' do
before do
allow_any_instance_of(LfsObjectsProject).to receive(:update_project_statistics).and_return(nil)
create(:lfs_objects_project, project: synced_project, lfs_object: lfs_object_1)
create(:lfs_objects_project, project: synced_project, lfs_object: lfs_object_2)
create(:lfs_objects_project, project: unsynced_project, lfs_object: lfs_object_3)
secondary.update!(selective_sync_type: 'namespaces', namespaces: [synced_group])
end
it 'delegates to #legacy_find_synced_missing_on_primary_lfs_objects' do
expect(subject).to receive(:legacy_find_synced_missing_on_primary_lfs_objects).and_call_original
subject.count_synced_missing_on_primary_lfs_objects
end
it 'counts LFS objects that has been synced' do
create(:geo_file_registry, :lfs, file_id: lfs_object_1.id, missing_on_primary: true)
create(:geo_file_registry, :lfs, file_id: lfs_object_2.id, missing_on_primary: true)
create(:geo_file_registry, :lfs, file_id: lfs_object_3.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_lfs_objects).to eq 2
end
it 'ignores remote LFS objects' do
create(:geo_file_registry, :lfs, file_id: lfs_object_remote_1.id, missing_on_primary: true)
expect(subject.count_synced_missing_on_primary_lfs_objects).to eq 0
end
end
end
end end
shared_examples 'finds all the things' do shared_examples 'finds all the things' do
......
...@@ -9,12 +9,15 @@ ...@@ -9,12 +9,15 @@
"attachments_count", "attachments_count",
"attachments_failed_count", "attachments_failed_count",
"attachments_synced_count", "attachments_synced_count",
"attachments_synced_missing_on_primary_count",
"lfs_objects_count", "lfs_objects_count",
"lfs_objects_failed_count", "lfs_objects_failed_count",
"lfs_objects_synced_count", "lfs_objects_synced_count",
"lfs_objects_synced_missing_on_primary_count",
"job_artifacts_count", "job_artifacts_count",
"job_artifacts_failed_count", "job_artifacts_failed_count",
"job_artifacts_synced_count", "job_artifacts_synced_count",
"job_artifacts_synced_missing_on_primary_count",
"db_replication_lag_seconds", "db_replication_lag_seconds",
"repositories_count", "repositories_count",
"repositories_failed_count", "repositories_failed_count",
...@@ -53,15 +56,18 @@ ...@@ -53,15 +56,18 @@
"attachments_count": { "type": "integer" }, "attachments_count": { "type": "integer" },
"attachments_failed_count": { "type": ["integer", "null"] }, "attachments_failed_count": { "type": ["integer", "null"] },
"attachments_synced_count": { "type": ["integer", "null"] }, "attachments_synced_count": { "type": ["integer", "null"] },
"attachments_synced_missing_on_primary_count": { "type": ["integer", "null"] },
"attachments_synced_in_percentage": { "type": "string" }, "attachments_synced_in_percentage": { "type": "string" },
"db_replication_lag_seconds": { "type": ["integer", "null"] }, "db_replication_lag_seconds": { "type": ["integer", "null"] },
"lfs_objects_count": { "type": "integer" }, "lfs_objects_count": { "type": "integer" },
"lfs_objects_failed_count": { "type": ["integer", "null"] }, "lfs_objects_failed_count": { "type": ["integer", "null"] },
"lfs_objects_synced_count": { "type": ["integer", "null"] }, "lfs_objects_synced_count": { "type": ["integer", "null"] },
"lfs_objects_synced_missing_on_primary_count": { "type": ["integer", "null"] },
"lfs_objects_synced_in_percentage": { "type": "string" }, "lfs_objects_synced_in_percentage": { "type": "string" },
"job_artifacts_count": { "type": "integer" }, "job_artifacts_count": { "type": "integer" },
"job_artifacts_failed_count": { "type": ["integer", "null"] }, "job_artifacts_failed_count": { "type": ["integer", "null"] },
"job_artifacts_synced_count": { "type": ["integer", "null"] }, "job_artifacts_synced_count": { "type": ["integer", "null"] },
"job_artifacts_synced_missing_on_primary_count": { "type": ["integer", "null"] },
"job_artifacts_synced_in_percentage": { "type": "string" }, "job_artifacts_synced_in_percentage": { "type": "string" },
"repositories_count": { "type": "integer" }, "repositories_count": { "type": "integer" },
"repositories_failed_count": { "type": ["integer", "null"] }, "repositories_failed_count": { "type": ["integer", "null"] },
......
...@@ -95,6 +95,21 @@ describe GeoNodeStatus, :geo do ...@@ -95,6 +95,21 @@ describe GeoNodeStatus, :geo do
end end
end end
# Disable transactions via :delete method because a foreign table
# can't see changes inside a transaction of a different connection.
describe '#attachments_synced_missing_on_primary_count', :delete do
it 'only counts successful syncs' do
create_list(:user, 3, avatar: fixture_file_upload(Rails.root + 'spec/fixtures/dk.png', 'image/png'))
uploads = Upload.all.pluck(:id)
create(:geo_file_registry, :avatar, file_id: uploads[0], missing_on_primary: true)
create(:geo_file_registry, :avatar, file_id: uploads[1])
create(:geo_file_registry, :avatar, file_id: uploads[2], success: false)
expect(subject.attachments_synced_missing_on_primary_count).to eq(1)
end
end
describe '#attachments_failed_count', :delete do describe '#attachments_failed_count', :delete do
it 'counts failed avatars, attachment, personal snippets and files' do it 'counts failed avatars, attachment, personal snippets and files' do
# These two should be ignored # These two should be ignored
...@@ -158,7 +173,39 @@ describe GeoNodeStatus, :geo do ...@@ -158,7 +173,39 @@ describe GeoNodeStatus, :geo do
# Disable transactions via :delete method because a foreign table # Disable transactions via :delete method because a foreign table
# can't see changes inside a transaction of a different connection. # can't see changes inside a transaction of a different connection.
describe '#lfs_objects_failed', :delete do describe '#lfs_objects_synced_count', :delete do
it 'counts synced LFS objects' do
# These four should be ignored
create(:geo_file_registry, success: false)
create(:geo_file_registry, :avatar)
create(:geo_file_registry, file_type: :attachment)
create(:geo_file_registry, :lfs, :with_file, success: false)
create(:geo_file_registry, :lfs, :with_file, success: true)
expect(subject.lfs_objects_synced_count).to eq(1)
end
end
# Disable transactions via :delete method because a foreign table
# can't see changes inside a transaction of a different connection.
describe '#lfs_objects_synced_missing_on_primary_count', :delete do
it 'counts LFS objects marked as synced due to file missing on the primary' do
# These four should be ignored
create(:geo_file_registry, success: false)
create(:geo_file_registry, :avatar, missing_on_primary: true)
create(:geo_file_registry, file_type: :attachment, missing_on_primary: true)
create(:geo_file_registry, :lfs, :with_file, success: false)
create(:geo_file_registry, :lfs, :with_file, success: true, missing_on_primary: true)
expect(subject.lfs_objects_synced_missing_on_primary_count).to eq(1)
end
end
# Disable transactions via :delete method because a foreign table
# can't see changes inside a transaction of a different connection.
describe '#lfs_objects_failed_count', :delete do
it 'counts failed LFS objects' do it 'counts failed LFS objects' do
# These four should be ignored # These four should be ignored
create(:geo_file_registry, success: false) create(:geo_file_registry, success: false)
...@@ -207,17 +254,29 @@ describe GeoNodeStatus, :geo do ...@@ -207,17 +254,29 @@ describe GeoNodeStatus, :geo do
describe '#job_artifacts_synced_count', :delete do describe '#job_artifacts_synced_count', :delete do
it 'counts synced job artifacts' do it 'counts synced job artifacts' do
# These should be ignored # These should be ignored
create(:geo_file_registry, success: false) create(:geo_file_registry, success: true)
create(:geo_file_registry, :avatar, success: false)
create(:geo_file_registry, file_type: :attachment, success: true)
create(:geo_file_registry, :lfs, :with_file, success: true)
create(:geo_job_artifact_registry, :with_artifact, success: false) create(:geo_job_artifact_registry, :with_artifact, success: false)
create(:geo_job_artifact_registry, :with_artifact, success: true) create(:geo_job_artifact_registry, :with_artifact, success: true)
expect(subject.job_artifacts_synced_count).to eq(1) expect(subject.job_artifacts_synced_count).to eq(1)
end end
end end
# Disable transactions via :delete method because a foreign table
# can't see changes inside a transaction of a different connection.
describe '#job_artifacts_synced_missing_on_primary_count', :delete do
it 'counts job artifacts marked as synced due to file missing on the primary' do
# These should be ignored
create(:geo_file_registry, success: true, missing_on_primary: true)
create(:geo_job_artifact_registry, :with_artifact, success: true)
create(:geo_job_artifact_registry, :with_artifact, success: true, missing_on_primary: true)
expect(subject.job_artifacts_synced_missing_on_primary_count).to eq(1)
end
end
# Disable transactions via :delete method because a foreign table # Disable transactions via :delete method because a foreign table
# can't see changes inside a transaction of a different connection. # can't see changes inside a transaction of a different connection.
describe '#job_artifacts_failed_count', :delete do describe '#job_artifacts_failed_count', :delete do
...@@ -227,16 +286,17 @@ describe GeoNodeStatus, :geo do ...@@ -227,16 +286,17 @@ describe GeoNodeStatus, :geo do
create(:geo_file_registry, :avatar, success: false) create(:geo_file_registry, :avatar, success: false)
create(:geo_file_registry, file_type: :attachment, success: false) create(:geo_file_registry, file_type: :attachment, success: false)
create(:geo_job_artifact_registry, :with_artifact, success: true) create(:geo_job_artifact_registry, :with_artifact, success: true)
create(:geo_job_artifact_registry, :with_artifact, success: false) create(:geo_job_artifact_registry, :with_artifact, success: false)
expect(subject.job_artifacts_failed_count).to eq(1) expect(subject.job_artifacts_failed_count).to eq(1)
end end
end end
describe '#job_artifacts_synced_in_percentage' do # Disable transactions via :delete method because a foreign table
# Disable transactions via :delete method because a foreign table # can't see changes inside a transaction of a different connection.
# can't see changes inside a transaction of a different connection. describe '#job_artifacts_synced_in_percentage', :delete do
context 'when artifacts are available', :delete do context 'when artifacts are available' do
before do before do
[project_1, project_2, project_3, project_4].each_with_index do |project, index| [project_1, project_2, project_3, project_4].each_with_index do |project, index|
build = create(:ci_build, project: project) build = create(:ci_build, project: project)
......
...@@ -25,12 +25,15 @@ describe Geo::MetricsUpdateService, :geo do ...@@ -25,12 +25,15 @@ describe Geo::MetricsUpdateService, :geo do
lfs_objects_count: 100, lfs_objects_count: 100,
lfs_objects_synced_count: 50, lfs_objects_synced_count: 50,
lfs_objects_failed_count: 12, lfs_objects_failed_count: 12,
lfs_objects_synced_missing_on_primary_count: 4,
job_artifacts_count: 100, job_artifacts_count: 100,
job_artifacts_synced_count: 50, job_artifacts_synced_count: 50,
job_artifacts_failed_count: 12, job_artifacts_failed_count: 12,
job_artifacts_synced_missing_on_primary_count: 5,
attachments_count: 30, attachments_count: 30,
attachments_synced_count: 30, attachments_synced_count: 30,
attachments_failed_count: 25, attachments_failed_count: 25,
attachments_synced_missing_on_primary_count: 6,
last_event_id: 2, last_event_id: 2,
last_event_date: event_date, last_event_date: event_date,
cursor_last_event_id: 1, cursor_last_event_id: 1,
...@@ -143,12 +146,15 @@ describe Geo::MetricsUpdateService, :geo do ...@@ -143,12 +146,15 @@ describe Geo::MetricsUpdateService, :geo do
expect(metric_value(:geo_lfs_objects)).to eq(100) expect(metric_value(:geo_lfs_objects)).to eq(100)
expect(metric_value(:geo_lfs_objects_synced)).to eq(50) expect(metric_value(:geo_lfs_objects_synced)).to eq(50)
expect(metric_value(:geo_lfs_objects_failed)).to eq(12) expect(metric_value(:geo_lfs_objects_failed)).to eq(12)
expect(metric_value(:geo_lfs_objects_synced_missing_on_primary)).to eq(4)
expect(metric_value(:geo_job_artifacts)).to eq(100) expect(metric_value(:geo_job_artifacts)).to eq(100)
expect(metric_value(:geo_job_artifacts_synced)).to eq(50) expect(metric_value(:geo_job_artifacts_synced)).to eq(50)
expect(metric_value(:geo_job_artifacts_failed)).to eq(12) expect(metric_value(:geo_job_artifacts_failed)).to eq(12)
expect(metric_value(:geo_job_artifacts_synced_missing_on_primary)).to eq(5)
expect(metric_value(:geo_attachments)).to eq(30) expect(metric_value(:geo_attachments)).to eq(30)
expect(metric_value(:geo_attachments_synced)).to eq(30) expect(metric_value(:geo_attachments_synced)).to eq(30)
expect(metric_value(:geo_attachments_failed)).to eq(25) expect(metric_value(:geo_attachments_failed)).to eq(25)
expect(metric_value(:geo_attachments_synced_missing_on_primary)).to eq(6)
expect(metric_value(:geo_last_event_id)).to eq(2) expect(metric_value(:geo_last_event_id)).to eq(2)
expect(metric_value(:geo_last_event_timestamp)).to eq(event_date.to_i) expect(metric_value(:geo_last_event_timestamp)).to eq(event_date.to_i)
expect(metric_value(:geo_cursor_last_event_id)).to eq(1) expect(metric_value(:geo_cursor_last_event_id)).to eq(1)
......
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