Commit 07a3f810 authored by Douglas Barbosa Alexandre's avatar Douglas Barbosa Alexandre

Merge branch 'ag-improve-geo-verification-dev-docs' into 'master'

Add multiple improvements to Geo development docs

See merge request gitlab-org/gitlab!74865
parents 900de4d9 f744779e
...@@ -56,9 +56,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org ...@@ -56,9 +56,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
```ruby ```ruby
# frozen_string_literal: true # frozen_string_literal: true
class CreateCoolWidgetRegistry < ActiveRecord::Migration[6.0] class CreateCoolWidgetRegistry < Gitlab::Database::Migration[1.0]
include Gitlab::Database::MigrationHelpers
disable_ddl_transaction! disable_ddl_transaction!
def up def up
...@@ -126,9 +124,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif ...@@ -126,9 +124,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
```ruby ```ruby
# frozen_string_literal: true # frozen_string_literal: true
class CreateCoolWidgetStates < ActiveRecord::Migration[6.0] class CreateCoolWidgetStates < Gitlab::Database::Migration[1.0]
include Gitlab::Database::MigrationHelpers
VERIFICATION_STATE_INDEX_NAME = "index_cool_widget_states_on_verification_state" VERIFICATION_STATE_INDEX_NAME = "index_cool_widget_states_on_verification_state"
PENDING_VERIFICATION_INDEX_NAME = "index_cool_widget_states_pending_verification" PENDING_VERIFICATION_INDEX_NAME = "index_cool_widget_states_pending_verification"
FAILED_VERIFICATION_INDEX_NAME = "index_cool_widget_states_failed_verification" FAILED_VERIFICATION_INDEX_NAME = "index_cool_widget_states_failed_verification"
...@@ -137,23 +133,21 @@ The Geo primary site needs to checksum every replicable so secondaries can verif ...@@ -137,23 +133,21 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
disable_ddl_transaction! disable_ddl_transaction!
def up def up
unless table_exists?(:cool_widget_states) with_lock_retries do
with_lock_retries do create_table :cool_widget_states, id: false do |t|
create_table :cool_widget_states, id: false do |t| t.references :cool_widget, primary_key: true, null: false, foreign_key: { on_delete: :cascade }
t.references :cool_widget, primary_key: true, null: false, foreign_key: { on_delete: :cascade } t.integer :verification_state, default: 0, limit: 2, null: false
t.integer :verification_state, default: 0, limit: 2, null: false t.column :verification_started_at, :datetime_with_timezone
t.column :verification_started_at, :datetime_with_timezone t.datetime_with_timezone :verification_retry_at
t.datetime_with_timezone :verification_retry_at t.datetime_with_timezone :verified_at
t.datetime_with_timezone :verified_at t.integer :verification_retry_count, limit: 2
t.integer :verification_retry_count, limit: 2 t.binary :verification_checksum, using: 'verification_checksum::bytea'
t.binary :verification_checksum, using: 'verification_checksum::bytea' t.text :verification_failure
t.text :verification_failure
t.index :verification_state, name: VERIFICATION_STATE_INDEX_NAME
t.index :verification_state, name: VERIFICATION_STATE_INDEX_NAME t.index :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME
t.index :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME t.index :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME
t.index :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME t.index :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
t.index :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
end
end end
end end
...@@ -209,6 +203,8 @@ That's all of the required database changes. ...@@ -209,6 +203,8 @@ That's all of the required database changes.
has_one :cool_widget_state, autosave: false, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState' has_one :cool_widget_state, autosave: false, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState'
after_save :save_verification_details
delegate :verification_retry_at, :verification_retry_at=, delegate :verification_retry_at, :verification_retry_at=,
:verified_at, :verified_at=, :verified_at, :verified_at=,
:verification_checksum, :verification_checksum=, :verification_checksum, :verification_checksum=,
...@@ -223,6 +219,8 @@ That's all of the required database changes. ...@@ -223,6 +219,8 @@ That's all of the required database changes.
scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) } scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) } scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
scope :available_verifiables, -> { joins(:cool_widget_state) }
# Override the `all` default if not all records can be replicated. For an # Override the `all` default if not all records can be replicated. For an
# example of an existing Model that needs to do this, see # example of an existing Model that needs to do this, see
# `EE::MergeRequestDiff`. # `EE::MergeRequestDiff`.
......
...@@ -58,42 +58,38 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org ...@@ -58,42 +58,38 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
```ruby ```ruby
# frozen_string_literal: true # frozen_string_literal: true
class CreateCoolWidgetRegistry < ActiveRecord::Migration[6.0] class CreateCoolWidgetRegistry < Gitlab::Database::Migration[1.0]
include Gitlab::Database::MigrationHelpers
disable_ddl_transaction! disable_ddl_transaction!
def up def up
unless table_exists?(:cool_widget_registry) ActiveRecord::Base.transaction do
ActiveRecord::Base.transaction do create_table :cool_widget_registry, id: :bigserial, force: :cascade do |t|
create_table :cool_widget_registry, id: :bigserial, force: :cascade do |t| t.bigint :cool_widget_id, null: false
t.bigint :cool_widget_id, null: false t.datetime_with_timezone :created_at, null: false
t.datetime_with_timezone :created_at, null: false t.datetime_with_timezone :last_synced_at
t.datetime_with_timezone :last_synced_at t.datetime_with_timezone :retry_at
t.datetime_with_timezone :retry_at t.datetime_with_timezone :verified_at
t.datetime_with_timezone :verified_at t.datetime_with_timezone :verification_started_at
t.datetime_with_timezone :verification_started_at t.datetime_with_timezone :verification_retry_at
t.datetime_with_timezone :verification_retry_at t.integer :state, default: 0, null: false, limit: 2
t.integer :state, default: 0, null: false, limit: 2 t.integer :verification_state, default: 0, null: false, limit: 2
t.integer :verification_state, default: 0, null: false, limit: 2 t.integer :retry_count, default: 0, limit: 2, null: false
t.integer :retry_count, default: 0, limit: 2, null: false t.integer :verification_retry_count, default: 0, limit: 2, null: false
t.integer :verification_retry_count, default: 0, limit: 2, null: false t.boolean :checksum_mismatch, default: false, null: false
t.boolean :checksum_mismatch, default: false, null: false t.binary :verification_checksum
t.binary :verification_checksum t.binary :verification_checksum_mismatched
t.binary :verification_checksum_mismatched t.string :verification_failure, limit: 255 # rubocop:disable Migration/PreventStrings see https://gitlab.com/gitlab-org/gitlab/-/issues/323806
t.string :verification_failure, limit: 255 # rubocop:disable Migration/PreventStrings see https://gitlab.com/gitlab-org/gitlab/-/issues/323806 t.string :last_sync_failure, limit: 255 # rubocop:disable Migration/PreventStrings see https://gitlab.com/gitlab-org/gitlab/-/issues/323806
t.string :last_sync_failure, limit: 255 # rubocop:disable Migration/PreventStrings see https://gitlab.com/gitlab-org/gitlab/-/issues/323806
t.index :cool_widget_id, name: :index_cool_widget_registry_on_cool_widget_id, unique: true
t.index :cool_widget_id, name: :index_cool_widget_registry_on_cool_widget_id, unique: true t.index :retry_at
t.index :retry_at t.index :state
t.index :state # To optimize performance of CoolWidgetRegistry.verification_failed_batch
# To optimize performance of CoolWidgetRegistry.verification_failed_batch t.index :verification_retry_at, name: :cool_widget_registry_failed_verification, order: "NULLS FIRST", where: "((state = 2) AND (verification_state = 3))"
t.index :verification_retry_at, name: :cool_widget_registry_failed_verification, order: "NULLS FIRST", where: "((state = 2) AND (verification_state = 3))" # To optimize performance of CoolWidgetRegistry.needs_verification_count
# To optimize performance of CoolWidgetRegistry.needs_verification_count t.index :verification_state, name: :cool_widget_registry_needs_verification, where: "((state = 2) AND (verification_state = ANY (ARRAY[0, 3])))"
t.index :verification_state, name: :cool_widget_registry_needs_verification, where: "((state = 2) AND (verification_state = ANY (ARRAY[0, 3])))" # To optimize performance of CoolWidgetRegistry.verification_pending_batch
# To optimize performance of CoolWidgetRegistry.verification_pending_batch t.index :verified_at, name: :cool_widget_registry_pending_verification, order: "NULLS FIRST", where: "((state = 2) AND (verification_state = 0))"
t.index :verified_at, name: :cool_widget_registry_pending_verification, order: "NULLS FIRST", where: "((state = 2) AND (verification_state = 0))"
end
end end
end end
end end
...@@ -130,9 +126,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif ...@@ -130,9 +126,7 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
```ruby ```ruby
# frozen_string_literal: true # frozen_string_literal: true
class CreateCoolWidgetStates < ActiveRecord::Migration[6.0] class CreateCoolWidgetStates < Gitlab::Database::Migration[1.0]
include Gitlab::Database::MigrationHelpers
VERIFICATION_STATE_INDEX_NAME = "index_cool_widget_states_on_verification_state" VERIFICATION_STATE_INDEX_NAME = "index_cool_widget_states_on_verification_state"
PENDING_VERIFICATION_INDEX_NAME = "index_cool_widget_states_pending_verification" PENDING_VERIFICATION_INDEX_NAME = "index_cool_widget_states_pending_verification"
FAILED_VERIFICATION_INDEX_NAME = "index_cool_widget_states_failed_verification" FAILED_VERIFICATION_INDEX_NAME = "index_cool_widget_states_failed_verification"
...@@ -141,23 +135,21 @@ The Geo primary site needs to checksum every replicable so secondaries can verif ...@@ -141,23 +135,21 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
disable_ddl_transaction! disable_ddl_transaction!
def up def up
unless table_exists?(:cool_widget_states) with_lock_retries do
with_lock_retries do create_table :cool_widget_states, id: false do |t|
create_table :cool_widget_states, id: false do |t| t.references :cool_widget, primary_key: true, null: false, foreign_key: { on_delete: :cascade }
t.references :cool_widget, primary_key: true, null: false, foreign_key: { on_delete: :cascade } t.integer :verification_state, default: 0, limit: 2, null: false
t.integer :verification_state, default: 0, limit: 2, null: false t.column :verification_started_at, :datetime_with_timezone
t.column :verification_started_at, :datetime_with_timezone t.datetime_with_timezone :verification_retry_at
t.datetime_with_timezone :verification_retry_at t.datetime_with_timezone :verified_at
t.datetime_with_timezone :verified_at t.integer :verification_retry_count, limit: 2
t.integer :verification_retry_count, limit: 2 t.binary :verification_checksum, using: 'verification_checksum::bytea'
t.binary :verification_checksum, using: 'verification_checksum::bytea' t.text :verification_failure
t.text :verification_failure
t.index :verification_state, name: VERIFICATION_STATE_INDEX_NAME
t.index :verification_state, name: VERIFICATION_STATE_INDEX_NAME t.index :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME
t.index :verified_at, where: "(verification_state = 0)", order: { verified_at: 'ASC NULLS FIRST' }, name: PENDING_VERIFICATION_INDEX_NAME t.index :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME
t.index :verification_retry_at, where: "(verification_state = 3)", order: { verification_retry_at: 'ASC NULLS FIRST' }, name: FAILED_VERIFICATION_INDEX_NAME t.index :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
t.index :verification_state, where: "(verification_state = 0 OR verification_state = 3)", name: NEEDS_VERIFICATION_INDEX_NAME
end
end end
end end
...@@ -213,6 +205,8 @@ That's all of the required database changes. ...@@ -213,6 +205,8 @@ That's all of the required database changes.
has_one :cool_widget_state, autosave: false, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState' has_one :cool_widget_state, autosave: false, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState'
after_save :save_verification_details
delegate :verification_retry_at, :verification_retry_at=, delegate :verification_retry_at, :verification_retry_at=,
:verified_at, :verified_at=, :verified_at, :verified_at=,
:verification_checksum, :verification_checksum=, :verification_checksum, :verification_checksum=,
...@@ -227,6 +221,8 @@ That's all of the required database changes. ...@@ -227,6 +221,8 @@ That's all of the required database changes.
scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) } scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) } scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
scope :available_verifiables, -> { joins(:cool_widget_state) }
# Override the `all` default if not all records can be replicated. For an # Override the `all` default if not all records can be replicated. For an
# example of an existing Model that needs to do this, see # example of an existing Model that needs to do this, see
# `EE::MergeRequestDiff`. # `EE::MergeRequestDiff`.
......
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