{"record":{"id":"03013b21ad7cd683","repo":"ankane/searchkick","slug":"safety-check-failed-only-run-one-model-reindex-p","errorCode":null,"errorMessage":"Safety check failed - only run one Model.reindex per model at a time","messagePattern":"Safety check failed - only run one Model\\.reindex per model at a time","errorType":"exception","errorClass":"Searchkick::Error","httpStatus":null,"severity":"error","filePath":"lib/searchkick/index.rb","lineNumber":447,"sourceCode":"      else\n        index.refresh\n        true\n      end\n    rescue => e\n      if Searchkick.transport_error?(e) && (e.message.include?(\"No handler for type [text]\") || e.message.include?(\"class java.util.ArrayList cannot be cast to class java.util.Map\"))\n        raise UnsupportedVersionError\n      end\n\n      raise e\n    end\n\n    # safety check\n    # still a chance for race condition since its called before promotion\n    # ideal is for user to disable automatic index creation\n    # https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-creation\n    def check_uuid(old_uuid, new_uuid)\n      if old_uuid != new_uuid\n        raise Error, \"Safety check failed - only run one Model.reindex per model at a time\"\n      end\n    end\n\n    def notify(record, name)\n      if Searchkick.callbacks_value == :bulk\n        yield\n      else\n        name = \"#{record.class.searchkick_klass.name} #{name}\" if record && record.class.searchkick_klass\n        event = {\n          name: name,\n          id: search_id(record)\n        }\n        ActiveSupport::Notifications.instrument(\"request.searchkick\", event) do\n          yield\n        end\n      end\n    end\n","sourceCodeStart":429,"sourceCodeEnd":465,"githubUrl":"https://github.com/ankane/searchkick/blob/93e901a75b11a25101668a616e006b158251b16e/lib/searchkick/index.rb#L429-L465","documentation":"Models declaring a reindex queue (searchkick queue_name: 'search') push ids through Searchkick::ReindexQueue, which talks to Redis. Its constructor raises Error 'Searchkick.redis not set' unless Searchkick.redis was assigned beforehand - normally done in config/initializers/searchkick.rb.","triggerScenarios":"A model with searchkick queue_name: 'search' plus any save/update/reindex, while Searchkick.redis = Redis.new was never set - initializer not created, an env-specific initializer skipped, or a boot path (rake task, engine, test) that does not load initializers.","commonSituations":"Adding queue-based reindexing per the README but forgetting the redis initializer; Redis config gated behind an env var that is absent in staging/test; multiple apps sharing a model where only one sets Searchkick.redis.","solutions":["Set the client in config/initializers/searchkick.rb: Searchkick.redis = Redis.new(url: ENV['REDIS_URL'])","Verify it loaded in every environment that touches the model: rails runner 'p Searchkick.redis'","Ensure the env var / credentials the initializer reads are actually present in that environment"],"exampleFix":"# before\n# config/initializers/searchkick.rb - missing or empty\nclass Product < ApplicationRecord\n  searchkick queue_name: 'search'\nend\nProduct.save # => Searchkick::Error: Searchkick.redis not set\n\n# after\n# config/initializers/searchkick.rb\nSearchkick.redis = Redis.new(url: ENV['REDIS_URL'])","handlingStrategy":"validation","validationCode":"# config/initializers/searchkick.rb\nSearchkick.redis = Redis.new(url: ENV.fetch('REDIS_URL'))\n\n# boot check where queue_name is used\nraise 'Searchkick.redis not configured' if Searchkick.redis.nil?","typeGuard":null,"tryCatchPattern":"begin\n  record.save!\nrescue Searchkick::Error => e\n  raise unless e.message == 'Searchkick.redis not set'\n  Rails.logger.error('search queue disabled: redis not configured')\nend","preventionTips":["Set Searchkick.redis in an initializer that runs in every environment, before models load","Add a boot-time health check when any model uses queue_name","Use ENV.fetch (not ENV[]) for the Redis URL so a missing var fails fast at deploy, not at first save"],"tags":["searchkick","redis","reindex-queue","configuration"],"backgroundTag":"missing-configuration","analyzedSha":"93e901a75b11a25101668a616e006b158251b16e","analyzedAt":"2026-08-21T19:06:23.767Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}