{"record":{"id":"977a8abdccbf87b4","repo":"bytebase/bytebase","slug":"failed-to-convert-assume-rbr-q-to-bool","errorCode":null,"errorMessage":"failed to convert assume-rbr %q to bool","messagePattern":"failed to convert assume-rbr %q to bool","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/component/ghost/config.go","lineNumber":184,"sourceCode":"\t}\n\tif v, ok := flags[\"allow-on-master\"]; ok {\n\t\tallowOnMaster, err := strconv.ParseBool(v)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"failed to convert allow-on-master %q to bool\", v)\n\t\t}\n\t\tf.allowOnMaster = &allowOnMaster\n\t}\n\tif v, ok := flags[\"switch-to-rbr\"]; ok {\n\t\tswitchToRBR, err := strconv.ParseBool(v)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"failed to convert switch-to-rbr %q to bool\", v)\n\t\t}\n\t\tf.switchToRBR = &switchToRBR\n\t}\n\tif v, ok := flags[\"assume-rbr\"]; ok {\n\t\tassumeRBR, err := strconv.ParseBool(v)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"failed to convert assume-rbr %q to bool\", v)\n\t\t}\n\t\tf.assumeRBR = &assumeRBR\n\t}\n\tif v, ok := flags[\"heartbeat-interval-millis\"]; ok {\n\t\theartbeatIntervalMillis, err := strconv.ParseInt(v, 10, 64)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"failed to convert heartbeat-interval-millis %q to int\", v)\n\t\t}\n\t\tf.heartbeatIntervalMillis = &heartbeatIntervalMillis\n\t}\n\tif v, ok := flags[\"nice-ratio\"]; ok {\n\t\tniceRatio, err := strconv.ParseFloat(v, 64)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"failed to convert nice-ratio %q to float\", v)\n\t\t}\n\t\tf.niceRatio = &niceRatio\n\t}\n\tif v, ok := flags[\"throttle-control-replicas\"]; ok {","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/bytebase/bytebase/blob/1870550677fe08f0d2a78c07acd27541464eb945/backend/component/ghost/config.go#L166-L202","documentation":"GetUserFlags parses gh-ost boolean flags from user config. When 'assume-rbr' is present but strconv.ParseBool cannot interpret it, this wrapped error is returned. This flag asserts row-based replication is already enabled and must be a strict boolean literal.","triggerScenarios":"Calling GetUserFlags (via getTaskCreatesFromChangeDatabaseConfig or NewMigrationContext) with a flags map containing \"assume-rbr\" set to values like \"yes\", \"true1\" or the empty string.","commonSituations":"Users mirror gh-ost CLI usage where the flag is passed bare (meaning true) but the config map requires an explicit string value.","solutions":["Set 'assume-rbr' to \"true\" or \"false\" explicitly","Remove the flag when row-based replication status is unknown","Verify the stored value for empty string or typos","Re-save settings and retry the migration"],"exampleFix":"// before\nflags[\"assume-rbr\"] = \"\" // flag passed bare on CLI\n// after\nflags[\"assume-rbr\"] = \"true\"","handlingStrategy":"validation","validationCode":"if v, ok := flags[\"assume-rbr\"]; ok {\n    if _, err := strconv.ParseBool(strings.TrimSpace(v)); err != nil {\n        return fmt.Errorf(\"assume-rbr must be true/false, got %q\", v)\n    }\n}","typeGuard":"func isValidBoolFlag(v string) bool {\n    _, err := strconv.ParseBool(v)\n    return err == nil\n}","tryCatchPattern":"assumeRBR, err := strconv.ParseBool(v)\nif err != nil {\n    return nil, errors.Wrapf(err, \"failed to convert assume-rbr %q to bool\", v)\n}","preventionTips":["Never store an empty string for a boolean flag; omit the key instead","Explicitly set true/false rather than relying on CLI bare-flag semantics","Validate booleans before persisting","Lint stored flag maps for accepted values"],"tags":["config","strconv","boolean","ghost-migration"],"backgroundTag":"invalid-config-value","analyzedSha":"1870550677fe08f0d2a78c07acd27541464eb945","analyzedAt":"2026-09-06T21:16:13.665Z","contentChangedAt":"2026-09-06T21:16:13.665Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}