{"record":{"id":"ae5400810b56e6f4","repo":"apache/beam","slug":"sourceconfig-initialsplits-must-be-1-got-v","errorCode":null,"errorMessage":"SourceConfig.InitialSplits must be >= 1. Got: %v","messagePattern":"SourceConfig\\.InitialSplits must be >= 1\\. Got: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/io/synthetic/source.go","lineNumber":257,"sourceCode":"func (b *SourceConfigBuilder) NumHotKeys(val int) *SourceConfigBuilder {\n\tb.cfg.NumHotKeys = int64(val)\n\treturn b\n}\n\n// HotKeyFraction determines the value of hot key fraction.\n//\n// Valid values are floating point numbers from 0 to 1.\nfunc (b *SourceConfigBuilder) HotKeyFraction(val float64) *SourceConfigBuilder {\n\tb.cfg.HotKeyFraction = val\n\treturn b\n}\n\n// Build constructs the SourceConfig initialized by this builder. It also\n// performs error checking on the fields, and panics if any have been set to\n// invalid values.\nfunc (b *SourceConfigBuilder) Build() SourceConfig {\n\tif b.cfg.InitialSplits <= 0 {\n\t\tpanic(fmt.Sprintf(\"SourceConfig.InitialSplits must be >= 1. Got: %v\", b.cfg.InitialSplits))\n\t}\n\tif b.cfg.NumElements <= 0 {\n\t\tpanic(fmt.Sprintf(\"SourceConfig.NumElements must be >= 1. Got: %v\", b.cfg.NumElements))\n\t}\n\tif b.cfg.KeySize <= 0 {\n\t\tpanic(fmt.Sprintf(\"SourceConfig.KeySize must be >= 1. Got: %v\", b.cfg.KeySize))\n\t}\n\tif b.cfg.ValueSize <= 0 {\n\t\tpanic(fmt.Sprintf(\"SourceConfig.ValueSize must be >= 1. Got: %v\", b.cfg.ValueSize))\n\t}\n\tif b.cfg.NumHotKeys < 0 {\n\t\tpanic(fmt.Sprintf(\"SourceConfig.NumHotKeys must be >= 0. Got: %v\", b.cfg.HotKeyFraction))\n\t}\n\tif b.cfg.HotKeyFraction < 0 || b.cfg.HotKeyFraction > 1 {\n\t\tpanic(fmt.Sprintf(\"SourceConfig.HotKeyFraction must be a floating point number from 0 and 1. Got: %v\", b.cfg.NumHotKeys))\n\t}\n\treturn b.cfg\n}","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/io/synthetic/source.go#L239-L275","documentation":"SourceConfigBuilder.Build validates the synthetic source configuration and panics if InitialSplits is zero or negative. The synthetic source pre-partitions generated data, which requires at least one split.","triggerScenarios":"Building a synthetic source via NewSourceConfig builder without calling InitialSplits(n) (zero value), or explicitly setting InitialSplits(0) / a negative number.","commonSituations":"Benchmark/test harnesses deriving split count from config or flags that default to 0, or copy-pasted configs missing the builder call.","solutions":["Call builder.InitialSplits(n) with n >= 1 before Build().","Clamp or default the splits value from your config to at least 1.","Add a validation step on the config object before constructing the builder."],"exampleFix":"// before\ncfg := synthetic.NewSourceConfig().NumElements(1000).Build()\n// after\ncfg := synthetic.NewSourceConfig().NumElements(1000).InitialSplits(4).Build()","handlingStrategy":"validation","validationCode":"if initialSplits < 1 {\n    return fmt.Errorf(\"synthetic InitialSplits must be >= 1, got %d\", initialSplits)\n}","typeGuard":null,"tryCatchPattern":"defer func() {\n    if r := recover(); r != nil {\n        err = fmt.Errorf(\"invalid synthetic source config: %v\", r)\n    }\n}()","preventionTips":["Always set InitialSplits in the builder chain; never rely on the zero value.","Clamp flag/config-derived split counts to a minimum of 1.","Build a validateSourceConfig helper covering all Build() invariants."],"tags":["go","apache-beam","synthetic-source","validation"],"backgroundTag":"value-out-of-range","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}