Skip to content
  • Dylan Griffith's avatar
    Find IndexStatus find_or_create race condition · afb37c9e
    Dylan Griffith authored
    **TL;DR** Fix a race condition where `IndexStatus` is not created and
    does not raise error. Need to use `!` and get rid of problematic unique
    model validation.
    
    Looking at the code I notice a logical problem with using
    `find_or_create_by` alongside a unique model validation. The problem is
    a race condition which comes from `find_or_create` first checking to see
    if the record exists. If it does not it tries creating which then
    invokes the validation which checks again to see if the record exists
    which finally returns a validation error. But see here we are not using
    `!` version of `find_or_create` and so this validation error is silently
    ignored.
    
    Since we already have a
    [`safe_find_or_create_by!`](
    https://gitlab.com/gitlab-org/gitlab/-/blob/2b01f1f3/app/models/application_record.rb#L37
    )
    which is designed for handling this race condition using unique indexes
    and rescue and seeing that this model already has the [unique
    index](
    https://gitlab.com/gitlab-org/gitlab/-/blob/2b01f1f3/db/structure.sql#L19266
    )
    we should just get rid of the model validation since it just complicates
    the error handling.
    
    Since this is a pretty weird race condition it seems tricky/contrived to
    try to create a proper unit test for this case.
    afb37c9e