{"record":{"id":"afbebc6f7308468e","repo":"flippercloud/flipper","slug":"data-type-is-not-supported-by-this-adapter-afbebc","errorCode":null,"errorMessage":"#{data_type} is not supported by this adapter","messagePattern":"#(.+?) is not supported by this adapter","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"lib/flipper/adapters/redis.rb","lineNumber":214,"sourceCode":"\n      # Private: Converts gate and thing to hash key.\n      def to_field(gate, thing)\n        \"#{gate.key}/#{thing.value}\"\n      end\n\n      # Private: Returns a set of values given an array of fields and a gate.\n      #\n      # Returns a Set of the values enabled for the gate.\n      def fields_to_gate_value(fields, gate)\n        regex = %r{^#{Regexp.escape(gate.key.to_s)}/}\n        keys = fields.grep(regex)\n        values = keys.map { |key| key.split('/', 2).last }\n        values.to_set\n      end\n\n      # Private\n      def unsupported_data_type(data_type)\n        raise \"#{data_type} is not supported by this adapter\"\n      end\n    end\n  end\nend\n\nFlipper.configure do |config|\n  config.adapter do\n    client = Redis.new(url: ENV[\"FLIPPER_REDIS_URL\"] || ENV[\"REDIS_URL\"] || \"redis://localhost:6379\")\n    Flipper::Adapters::Redis.new(client)\n  end\nend\n","sourceCodeStart":196,"sourceCodeEnd":226,"githubUrl":"https://github.com/flippercloud/flipper/blob/1f86de3ec91521585b156445e156642938b19cb0/lib/flipper/adapters/redis.rb#L196-L226","documentation":"flipper-redis stores boolean/integer values as strings under 'feature_key/gate_key' keys, sets as Redis sets, and json via Typecast; enable, disable, and result_for_feature call unsupported_data_type for any other data type (lib/flipper/adapters/redis.rb:212-215). flipper-redis is versioned separately from flipper core, so the common producer is Bundler resolving an older flipper-redis than the flipper core that runs expression gates — the expression gate reports data_type :json, which old adapter releases refuse.","triggerScenarios":"feature.enable_expression(expr) / feature.add_expression (or Cloud sync and the UI conditions editor) with a flipper-redis lockfile entry older than flipper core: enable/disable raise ':json is not supported by this adapter'. Reads raise too — feature.enabled? / flipper.enabled? hit result_for_feature, and one flipper/expression key already present in Redis is enough. Custom gates with novel data types trigger it on any version.","commonSituations":"Bumping flipper without bumping flipper-redis in the Gemfile; multiple apps (or a web app plus Sidekiq workers) sharing one Redis for flags where the newer process already wrote expression keys; pinning the adapter gem while floating core.","solutions":["Align versions in lockstep: bundle update flipper flipper-redis (or pin both to the same release) so the adapter's enable/disable/result_for_feature include the :json branch.","Add a boot assertion: Gem.loaded_specs['flipper-redis'].version == Gem.loaded_specs['flipper'].version.","Until upgraded, avoid expression writes/reads on this app; if a newer writer already created flipper/* expression keys, DEL those keys or clear the features so old readers stop raising on get.","For custom gates, use one of the four supported data types."],"exampleFix":"# before — mismatched lockstep versions\ngem 'flipper',       '~> 0.28.0'\ngem 'flipper-redis', '~> 0.25.0'\n\n# after — identical releases\ngem 'flipper',       '~> 0.28.0'\ngem 'flipper-redis', '~> 0.28.0'","handlingStrategy":"validation","validationCode":"def assert_flipper_gems_aligned!\n  core = Gem.loaded_specs.fetch('flipper').version\n  adapter = Gem.loaded_specs.fetch('flipper-redis').version\n  raise \"flipper-redis #{adapter} != flipper #{core}; align both gems\" unless core == adapter\nend\n\nassert_flipper_gems_aligned! # at boot, before enabling expressions","typeGuard":"def expression_writable?(feature)\n  Gem.loaded_specs.fetch('flipper-redis').version >= Gem.loaded_specs.fetch('flipper').version &&\n    feature.gates.all? { |g| %i[boolean integer set json].include?(g.data_type) }\nend","tryCatchPattern":"begin\n  feature.enable_expression(expr)\nrescue RuntimeError => e\n  raise unless e.message.end_with?('is not supported by this adapter')\n  Flipper.logger.warn('flipper-redis lacks :json support; using percentage rollout instead')\n  feature.enable_percentage_of_time(10)\nend","preventionTips":["Bump flipper and flipper-redis together, pinned to the same version, in one PR.","Assert Gem.loaded_specs version equality at boot in every process that touches the shared Redis.","Upgrade web and background workers before the first expression write — reads raise too.","If older processes must keep running, keep expression keys out of the shared Redis until they are upgraded."],"tags":["ruby","flipper","redis","adapter","gates","version-mismatch","expression-gate"],"backgroundTag":"unsupported-adapter-data-type","analyzedSha":"1f86de3ec91521585b156445e156642938b19cb0","analyzedAt":"2026-08-23T04:36:09.896Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}