summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2017-01-06 18:26:06 +0100
committerYorick Peterse <yorickpeterse@gmail.com>2017-01-08 13:56:50 +0100
commitde321fbbb55dab5bee8dc344d458230b74570d5d (patch)
treebf3d477a0c19e16f0b0c44a109308827e2ff69ad /app
parent2dec1772f537ab607ff167cfb43b5ed5c99d5522 (diff)
downloadgitlab-ce-de321fbbb55dab5bee8dc344d458230b74570d5d.tar.gz
Remove the project_authorizations.id columnremove-project-authorizations-id-column
This column used to be a 32 bits integer, allowing for only a maximum of 2 147 483 647 rows. Given enough users one can hit this limit pretty quickly, as was the case for GitLab.com. Changing this type to bigint (= 64 bits) would give us more space, but we'd eventually hit the same limit given enough users and projects. A much more sustainable solution is to simply drop the "id" column. There were only 2 lines of code depending on this column being present, and neither truly required it to be present. Instead the code now uses the "project_id" column combined with the "user_id" column. This means that instead of something like this: DELETE FROM project_authorizations WHERE user_id = X AND id = Y; We now run the following when removing rows: DELETE FROM project_authorizations WHERE user_id = X AND project_id = Y; Since both user_id and project_id are indexed this should not slow down the DELETE query. This commit also removes the "dependent: destroy" clause from the "project_authorizations" relation in the User and Project models. Keeping this prevents Rails from being able to remove data as it relies on an "id" column being present. Since the "project_authorizations" table has proper foreign keys set up (with cascading removals) we don't need to depend on any Rails logic.
Diffstat (limited to 'app')
-rw-r--r--app/models/project.rb2
-rw-r--r--app/models/user.rb4
-rw-r--r--app/services/users/refresh_authorized_projects_service.rb4
3 files changed, 5 insertions, 5 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index ec40def6fb1..94a6f3ba799 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -130,7 +130,7 @@ class Project < ActiveRecord::Base
has_many :hooks, dependent: :destroy, class_name: 'ProjectHook'
has_many :protected_branches, dependent: :destroy
- has_many :project_authorizations, dependent: :destroy
+ has_many :project_authorizations
has_many :authorized_users, through: :project_authorizations, source: :user, class_name: 'User'
has_many :project_members, -> { where(requested_at: nil) }, dependent: :destroy, as: :source
alias_method :members, :project_members
diff --git a/app/models/user.rb b/app/models/user.rb
index 66a768d54bb..06dd98a3188 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -73,7 +73,7 @@ class User < ActiveRecord::Base
has_many :created_projects, foreign_key: :creator_id, class_name: 'Project'
has_many :users_star_projects, dependent: :destroy
has_many :starred_projects, through: :users_star_projects, source: :project
- has_many :project_authorizations, dependent: :destroy
+ has_many :project_authorizations
has_many :authorized_projects, through: :project_authorizations, source: :project
has_many :snippets, dependent: :destroy, foreign_key: :author_id
@@ -444,7 +444,7 @@ class User < ActiveRecord::Base
end
def remove_project_authorizations(project_ids)
- project_authorizations.where(id: project_ids).delete_all
+ project_authorizations.where(project_id: project_ids).delete_all
end
def set_authorized_projects_column
diff --git a/app/services/users/refresh_authorized_projects_service.rb b/app/services/users/refresh_authorized_projects_service.rb
index 8559908e0c3..21ec1bd9e65 100644
--- a/app/services/users/refresh_authorized_projects_service.rb
+++ b/app/services/users/refresh_authorized_projects_service.rb
@@ -35,7 +35,7 @@ module Users
# rows not in the new list or with a different access level should be
# removed.
if !fresh[project_id] || fresh[project_id] != row.access_level
- array << row.id
+ array << row.project_id
end
end
@@ -100,7 +100,7 @@ module Users
end
def current_authorizations
- user.project_authorizations.select(:id, :project_id, :access_level)
+ user.project_authorizations.select(:project_id, :access_level)
end
def fresh_authorizations