Skip to content

Adds a unique index for storage limit exclusions

Vijay Hawoldar requested to merge vij-add-unique-index-exclusions into master

What does this MR do and why?

A Namespaces::Storage::LimitExclusion belongs to a Namespace, we should only ever have one LimitExclusion per Namespace.

This MR replaces the index on namespaces_storage_limit_exclusions table with a unique one on namespace_id and adds a matching validation on the model to support that.

The table is currently empty/unused.

Refs https://gitlab.com/gitlab-org/gitlab/-/issues/404751

Migration info

migrate up
main: == 20230405102815 AddUniqueNamespaceIndexToStorageLimitExclusions: migrating ==
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0899s
main: -- index_exists?("namespaces_storage_limit_exclusions", :namespace_id, {:unique=>true, :name=>"unique_idx_namespaces_storage_limit_exclusions_on_namespace_id", :algorithm=>:concurrently})
main:    -> 0.0017s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0002s
main: -- add_index("namespaces_storage_limit_exclusions", :namespace_id, {:unique=>true, :name=>"unique_idx_namespaces_storage_limit_exclusions_on_namespace_id", :algorithm=>:concurrently})
main:    -> 0.0025s
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0003s
main: -- indexes("namespaces_storage_limit_exclusions")
main:    -> 0.0014s
main: -- remove_index("namespaces_storage_limit_exclusions", {:algorithm=>:concurrently, :name=>"index_namespaces_storage_limit_exclusions_on_namespace_id"})
main:    -> 0.0017s
main: == 20230405102815 AddUniqueNamespaceIndexToStorageLimitExclusions: migrated (0.1181s)
migrate down
main: == 20230405102815 AddUniqueNamespaceIndexToStorageLimitExclusions: reverting ==
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.1991s
main: -- index_exists?("namespaces_storage_limit_exclusions", :namespace_id, {:unique=>false, :name=>"index_namespaces_storage_limit_exclusions_on_namespace_id", :algorithm=>:concurrently})
main:    -> 0.0053s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0009s
main: -- add_index("namespaces_storage_limit_exclusions", :namespace_id, {:unique=>false, :name=>"index_namespaces_storage_limit_exclusions_on_namespace_id", :algorithm=>:concurrently})
main:    -> 0.0062s
main: -- execute("RESET statement_timeout")
main:    -> 0.0024s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0045s
main: -- indexes("namespaces_storage_limit_exclusions")
main:    -> 0.0049s
main: -- remove_index("namespaces_storage_limit_exclusions", {:algorithm=>:concurrently, :name=>"unique_idx_namespaces_storage_limit_exclusions_on_namespace_id"})
main:    -> 0.0060s
main: == 20230405102815 AddUniqueNamespaceIndexToStorageLimitExclusions: reverted (0.2861s)

How to set up and validate locally

  1. Create an initial exclusion
    Namespaces::Storage::LimitExclusion.create(namespace: your_namespace_here, reason: "testing")
    this should be successful
  2. Then try and create a second for the same namespace:
    Namespaces::Storage::LimitExclusion.create(namespace: your_namespace_here, reason: "testing")
    this should raise the error

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Vijay Hawoldar

Merge request reports

Loading