Adds a unique index for storage limit exclusions
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
- Create an initial exclusion
Namespaces::Storage::LimitExclusion.create(namespace: your_namespace_here, reason: "testing")
- Then try and create a second for the same namespace:
Namespaces::Storage::LimitExclusion.create(namespace: your_namespace_here, reason: "testing")
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Edited by Vijay Hawoldar