{"record":{"id":"383a83b0b22a1ab7","repo":"Billionmail/BillionMail","slug":"set-database-configuration-failed-v","errorCode":null,"errorMessage":"Set database configuration failed: %v","messagePattern":"Set database configuration failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"core/internal/service/database_initialization/database_initialization.go","lineNumber":40,"sourceCode":"\n\t// Setting database configuration\n\terr = gdb.SetConfig(gdb.Config{\n\t\t\"default\": gdb.ConfigGroup{\n\t\t\tgdb.ConfigNode{\n\t\t\t\t// Debug: true,\n\t\t\t\tHost:             public.AbsPath(consts.POSTGRESQL_SOCK),\n\t\t\t\tUser:             \"billionmail\",\n\t\t\t\tPass:             dbPass,\n\t\t\t\tName:             \"billionmail\",\n\t\t\t\tType:             \"pgsql\",\n\t\t\t\tRole:             \"master\",\n\t\t\t\tMaxOpenConnCount: 100,\n\t\t\t},\n\t\t},\n\t})\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Set database configuration failed: %v\", err)\n\t}\n\n\t// Testing database connection until successful\n\tconnectionOK := false\n\tfor i := 0; i < 10; i++ {\n\t\t_, err = g.DB().Exec(context.Background(), \"SELECT 1\")\n\n\t\tif err != nil {\n\t\t\t// Wait for 5 seconds before retrying\n\t\t\tg.Log().Debug(context.Background(), \"Database connection failed, retrying in 5 seconds...\")\n\t\t\ttime.Sleep(time.Second * 5)\n\t\t\tcontinue\n\t\t}\n\n\t\tconnectionOK = true\n\t\tg.Log().Debug(context.Background(), \"Database connection successful\")\n\t\tbreak\n\t}","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/Billionmail/BillionMail/blob/fc36c76c050c3775c5e899faf7403cf0262d2744/core/internal/service/database_initialization/database_initialization.go#L22-L58","documentation":"After building the gdb.Config with host/port/user/password, gdb.SetConfig is called; a non-nil error there means GoFrame rejected the configuration group and database initialization stops with this wrapped message.","triggerScenarios":"Passing a malformed config to gdb.SetConfig — e.g. empty default group, invalid node fields, or a concurrent reconfiguration conflict in the GoFrame driver.","commonSituations":"Corrupted env-derived values (DBHOST/DBPORT/DBUSER empty) producing an invalid config node; upgrading GoFrame where Config semantics changed; calling InitDatabase twice with conflicting setups.","solutions":["Log the wrapped cause (%v) and validate DBHOST/DBPORT/DBUSER/DBPASS env values before SetConfig","Confirm the gdb version's Config/ConfigGroup API usage matches the vendored GoFrame version","Ensure InitDatabase runs only once (use sync.Once) to avoid config re-registration issues","Fall back to explicit default values when env vars are empty"],"exampleFix":"// before\nhost := public.DockerEnv(\"DBHOST\") // may be empty\n// after\nif host == \"\" { host = \"postgres\" } // default node","handlingStrategy":"validation","validationCode":"if dbHost == \"\" || dbPort == \"\" || dbUser == \"\" || dbPass == \"\" {\n    return errors.New(\"database env vars incomplete before SetConfig\")\n}","typeGuard":null,"tryCatchPattern":"if err := database_initialization.InitDatabase(); err != nil {\n    if strings.Contains(err.Error(), \"Set database configuration\") {\n        log.Fatalf(\"invalid gdb config: %v\", err)\n    }\n}","preventionTips":["Validate all DB env values before building gdb.Config","Call InitDatabase once via sync.Once","Keep GoFrame version pinned and reviewed on upgrade","Provide defaults for optional config fields"],"tags":["database","configuration","goframe"],"backgroundTag":"invalid-database-config","analyzedSha":"fc36c76c050c3775c5e899faf7403cf0262d2744","analyzedAt":"2026-09-05T21:28:54.019Z","contentChangedAt":"2026-09-05T21:28:54.019Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}