{"record":{"id":"83e5fe7cd98703b7","repo":"flippercloud/flipper","slug":"actor-limit-of-limit-exceeded-for-feature-fe","errorCode":null,"errorMessage":"Actor limit of #{@limit} exceeded for feature #{feature.key}. See https://www.flippercloud.io/docs/features/actors#limitations","messagePattern":"Actor limit of #(.+?) exceeded for feature #(.+?)\\. See https://www\\.flippercloud\\.io/docs/features/actors#limitations","errorType":"exception","errorClass":"Flipper::Adapters::ActorLimit::LimitExceeded","httpStatus":null,"severity":"error","filePath":"lib/flipper/adapters/actor_limit.rb","lineNumber":41,"sourceCode":"        # Executes a block with sync mode enabled. Actor limits will\n        # not be enforced within the block.\n        def with_sync_mode\n          old_value = sync_mode\n          self.sync_mode = true\n          yield\n        ensure\n          self.sync_mode = old_value\n        end\n      end\n\n      def initialize(adapter, limit = 100)\n        super(adapter)\n        @limit = limit\n      end\n\n      def enable(feature, gate, resource)\n        if gate.is_a?(Flipper::Gates::Actor) && !self.class.sync_mode && over_limit?(feature)\n          raise LimitExceeded, \"Actor limit of #{@limit} exceeded for feature #{feature.key}. See https://www.flippercloud.io/docs/features/actors#limitations\"\n        else\n          super\n        end\n      end\n\n      private\n\n      def over_limit?(feature)\n        feature.actors_value.size >= @limit\n      end\n    end\n  end\nend\n","sourceCodeStart":23,"sourceCodeEnd":55,"githubUrl":"https://github.com/flippercloud/flipper/blob/1f86de3ec91521585b156445e156642938b19cb0/lib/flipper/adapters/actor_limit.rb#L23-L55","documentation":"The ActorLimit adapter wrapper (used by Flipper Cloud) caps how many individual actors may be enabled per feature (default limit 100). Its enable() raises ActorLimit::LimitExceeded when you enable an actor on a feature whose actors_value set already has at least `limit` entries, because per-actor gate rows do not scale and gate reads get slow. The check is skipped for non-actor gates and inside ActorLimit.with_sync_mode, which the sync machinery uses to mirror remote state.","triggerScenarios":"feature.enable_actor(user) / Flipper.enable(:beta, user) on a feature that already has >= limit (default 100) enabled actors, outside of sync mode. Typically reached in a loop that enables users one by one.","commonSituations":"Progressive individual rollouts where a script keeps calling enable_actor past 100 users; backfills/imports that enable lists of actors; teams hitting the Flipper Cloud per-feature actor cap; code migrated from boolean flags to individual actor enables instead of percentage rollouts.","solutions":["Switch to a rollout mechanism that scales: feature.enable_percentage_of_actors(25), enable_group, or enable_expression.","Prune the list first: disable actors you no longer need (feature.disable_actor(actor)) so the count drops below the limit before enabling more.","If you are deliberately syncing state (e.g. replicating a remote set), wrap the writes in Flipper::Adapters::ActorLimit.with_sync_mode { ... } to bypass the check.","If you constructed Flipper::Adapters::ActorLimit yourself with a custom limit, review whether that limit fits the feature's usage before raising it."],"exampleFix":"# before\nusers.find_each { |user| Flipper[:beta].enable_actor user } # raises at actor #101\n\n# after\nFlipper[:beta].enable_percentage_of_actors 25\n# or target a stable cohort\nFlipper.register(:beta_optins) { |actor| actor.respond_to?(:beta_optin?) && actor.beta_optin? }\nFlipper[:beta].enable_group :beta_optins","handlingStrategy":"validation","validationCode":"def enable_actor_safely(feature, actor, limit = 100)\n  if feature.actors_value.size >= limit\n    feature.enable_percentage_of_actors(100) # or another rollout strategy\n  else\n    feature.enable_actor(actor)\n  end\nend","typeGuard":null,"tryCatchPattern":"begin\n  Flipper[:beta].enable_actor(user)\nrescue Flipper::Adapters::ActorLimit::LimitExceeded\n  Flipper[:beta].enable_percentage_of_actors(25) # fall back to a scalable rollout\nend","preventionTips":["Prefer percentage_of_actors, groups, or expressions over long actor lists.","Monitor feature.actors_value.size as you enable individual actors.","Keep bulk actor imports idempotent and resumable so a limit hit mid-run is recoverable."],"tags":["ruby","flipper","cloud","actor-limit","rollout"],"backgroundTag":"usage-limit-exceeded","analyzedSha":"1f86de3ec91521585b156445e156642938b19cb0","analyzedAt":"2026-08-23T04:36:09.896Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}