• Yorick Peterse's avatar
    Remove the project_authorizations.id column · 969751d02ea0
    Yorick Peterse authored
    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.
    969751d02ea0
refresh_authorized_projects_service_spec.rb 6.08 KB