{"record":{"id":"6737886fb32e8ce8","repo":"ruby-concurrency/concurrent-ruby","slug":"load-factor-must-be-a-number-between-0-and-1","errorCode":null,"errorMessage":":load_factor must be a number between 0 and 1","messagePattern":":load_factor must be a number between 0 and 1","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/concurrent-ruby/concurrent/map.rb","lineNumber":346,"sourceCode":"      raise KeyError, 'key not found'\n    end\n\n    def initialize_copy(other)\n      super\n      populate_from(other)\n    end\n\n    def populate_from(hash)\n      hash.each_pair { |k, v| self[k] = v }\n      self\n    end\n\n    def validate_options_hash!(options)\n      if (initial_capacity = options[:initial_capacity]) && (!initial_capacity.kind_of?(Integer) || initial_capacity < 0)\n        raise ArgumentError, \":initial_capacity must be a positive Integer\"\n      end\n      if (load_factor = options[:load_factor]) && (!load_factor.kind_of?(Numeric) || load_factor <= 0 || load_factor > 1)\n        raise ArgumentError, \":load_factor must be a number between 0 and 1\"\n      end\n    end\n  end\nend\n","sourceCodeStart":328,"sourceCodeEnd":351,"githubUrl":"https://github.com/ruby-concurrency/concurrent-ruby/blob/0b88d5ff75f69b3740c8f0868e76f833cb2fd45d/lib/concurrent-ruby/concurrent/map.rb#L328-L351","documentation":"As part of the same options validation, validate_options_hash! (map.rb:347-349) requires :load_factor to be a Numeric strictly greater than 0 and at most 1 (the hash-table growth threshold, mirroring Java's ConcurrentHashMap). Zero, negative values, values above 1, and non-Numeric values raise ArgumentError at construction.","triggerScenarios":"Concurrent::Map.new(load_factor: 0); load_factor: 1.5; load_factor: '0.75' from stringly-typed config; load_factor: nil-coerced arithmetic producing 0.","commonSituations":"Copying Java tuning values without checking the (0, 1] range; environment/YAML-sourced floats arriving as strings; computed load factors that underflow to 0.","solutions":["Pass a Float in (0, 1]: Concurrent::Map.new(load_factor: 0.75).","Cast and range-check config at the boundary: lf = Float(cfg['load_factor']); raise unless (0..1].cover?(lf).","Clamp computed values into range: [[lf, 0.01].max, 1.0].min."],"exampleFix":"# before\nmap = Concurrent::Map.new(load_factor: cfg['load_factor']) # '0.75' or 0 raises ArgumentError\n\n# after\nlf = Float(cfg.fetch('load_factor', 0.75))\nmap = Concurrent::Map.new(load_factor: [[lf, 0.01].max, 1.0].min)","handlingStrategy":"validation","validationCode":"def map_load_factor(raw)\n  lf = Float(raw)\n  raise ArgumentError, ':load_factor must be in (0, 1]' unless lf.positive? && lf <= 1\n  lf\nend\nConcurrent::Map.new(load_factor: map_load_factor(cfg['load_factor']))","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Cast to Float and range-check load factors before constructing the Map.","Clamp computed factors into (0, 1]: [[lf, 0.01].max, 1.0].min.","Keep Java-sourced tuning values out of config files unless validated."],"tags":["ruby","concurrent-map","argumenterror","constructor-validation","configuration"],"backgroundTag":"invalid-constructor-option","analyzedSha":"0b88d5ff75f69b3740c8f0868e76f833cb2fd45d","analyzedAt":"2026-08-21T20:12:56.291Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}