Skip to content

Follow-up from "Add a boolean field hidden in the Issue ES mapping"

The following discussion from !111678 (merged) should be addressed:

  • @dgruzd started a discussion: (+8 comments)

    issue: I'm not sure that we should use class-level method here when we update every user state. First of all, we'd blow up ::User.elastic_index_dependants with a risk of OOM. For example this is how it would look like after having multiple state changes for different users:

    [1] pry(main)> ::User.elastic_index_dependants
    => []
    [2] pry(main)> ::User.elastic_index_dependant_association :issues, on_change: :state
    => [{:association_name=>:issues, :on_change=>:state}]
    [3] pry(main)> ::User.elastic_index_dependant_association :issues, on_change: :state
    => [{:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}]
    [4] pry(main)> ::User.elastic_index_dependant_association :issues, on_change: :state
    => [{:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}]
    [5] pry(main)> ::User.elastic_index_dependant_association :issues, on_change: :state
    => [{:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}]
    [6] pry(main)> ::User.elastic_index_dependant_association :issues, on_change: :state
    => [{:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}]
    [7] pry(main)> ::User.elastic_index_dependant_association :issues, on_change: :state
    => [{:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}, {:association_name=>:issues, :on_change=>:state}]

    I've tested this on master, but I think it will be similar in this MR branch

    Possible solution

    1. And the last idea/suggestion is to extend elastic_index_dependants to support migration guards, which can be quite useful in the future. Something like:
    # in `Elastic::ApplicationVersionedSearch`
    elastic_index_dependants << { association_name: association_name, on_change: on_change, migration_should_finish: migration_should_finish }
    
    # in `ee/app/models/ee/user.rb`
    elastic_index_dependant_association :issues, on_change: :state, migration_should_finish: :add_hidden_to_issues