mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-23 00:47:51 +00:00
44 lines
1.7 KiB
Ruby
44 lines
1.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class AddActiveContextMigrations < Gitlab::Database::Migration[2.2]
|
|
milestone '17.10'
|
|
|
|
FAILED_STATE_ENUM = 255
|
|
INDEX_NAME = 'index_ai_active_context_migrations_on_connection_and_status'
|
|
UNIQUE_INDEX_NAME = 'index_ai_active_context_migrations_on_connection_and_version'
|
|
CONSTRAINT_NAME = 'c_ai_active_context_migrations_on_retries_left'
|
|
VERSION_CONSTRAINT_NAME = 'c_ai_active_context_migrations_version_format'
|
|
CONSTRAINT_QUERY = <<~SQL
|
|
(retries_left > 0) OR (retries_left = 0 AND status = #{FAILED_STATE_ENUM})
|
|
SQL
|
|
|
|
def change
|
|
create_table :ai_active_context_migrations do |t|
|
|
# Fixed size columns (8 bytes)
|
|
t.references :connection, index: false,
|
|
foreign_key: { to_table: :ai_active_context_connections, on_delete: :cascade }, null: false
|
|
t.datetime_with_timezone :started_at
|
|
t.datetime_with_timezone :completed_at
|
|
t.timestamps_with_timezone
|
|
|
|
# Fixed size columns (4 bytes)
|
|
t.integer :status, limit: 2, null: false, default: 0
|
|
t.integer :retries_left, limit: 2, null: false
|
|
|
|
# Variable size columns
|
|
t.text :version, null: false, limit: 255
|
|
t.jsonb :metadata, null: false, default: {}
|
|
t.text :error_message, limit: 1024
|
|
|
|
t.index [:connection_id, :status], name: INDEX_NAME
|
|
t.index [:connection_id, :version], unique: true, name: UNIQUE_INDEX_NAME
|
|
|
|
# Check constraint ensures retries_left is only non-zero for non-failed migrations
|
|
t.check_constraint CONSTRAINT_QUERY, name: CONSTRAINT_NAME
|
|
|
|
# Check constraint ensures version is a 14-digit timestamp format (YYYYMMDDHHMMSS)
|
|
t.check_constraint "version ~ '^[0-9]{14}$'", name: VERSION_CONSTRAINT_NAME
|
|
end
|
|
end
|
|
end
|