{"record":{"id":"dad2fce2aa6e011e","repo":"bytebase/bytebase","slug":"failed-to-get-database-for-drift-validation","errorCode":null,"errorMessage":"failed to get database for drift validation","messagePattern":"failed to get database for drift validation","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/runner/taskrun/running_scheduler.go","lineNumber":292,"sourceCode":"\t}\n\tif instance == nil {\n\t\treturn errors.Errorf(\"target instance %q has been deleted\", task.InstanceID)\n\t}\n\tif instance.Deleted {\n\t\treturn errors.Errorf(\"target instance %q has been archived\", task.InstanceID)\n\t}\n\n\t// DATABASE_CREATE tasks have DatabaseName = nil — the database doesn't exist yet.\n\tif task.Type == storepb.Task_DATABASE_CREATE {\n\t\treturn nil\n\t}\n\n\tdatabase, err := s.store.GetDatabase(ctx, &store.FindDatabaseMessage{\n\t\tInstanceID:   &task.InstanceID,\n\t\tDatabaseName: task.DatabaseName,\n\t})\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"failed to get database for drift validation\")\n\t}\n\tif database == nil {\n\t\treturn errors.Errorf(\"target database %q on instance %q has been deleted\", task.GetDatabaseName(), task.InstanceID)\n\t}\n\n\tplan, err := s.store.GetPlan(ctx, &store.FindPlanMessage{ProjectID: task.ProjectID, UID: &task.PlanID})\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"failed to get plan for drift validation\")\n\t}\n\tif plan == nil {\n\t\treturn errors.Errorf(\"plan %d not found\", task.PlanID)\n\t}\n\n\treturn checkTaskDrift(task, database, plan)\n}\n\n// checkTaskDrift performs the actual drift comparison logic.\n// Returns nil if no drift, or an error describing the drift.","sourceCodeStart":274,"sourceCodeEnd":310,"githubUrl":"https://github.com/bytebase/bytebase/blob/1870550677fe08f0d2a78c07acd27541464eb945/backend/runner/taskrun/running_scheduler.go#L274-L310","documentation":"Thrown by validateTaskFreshness when store.GetDatabase (filtered by task.InstanceID and task.DatabaseName) returns a non-nil error. Drift validation cannot proceed without the database record, so the store error is wrapped and the task run start fails.","triggerScenarios":"executeTaskRun calls validateTaskFreshness; the metadata query for the database fails due to store/database errors, context cancellation, or connection problems.","commonSituations":"Metadata Postgres connectivity issues; overly broad filter returning a query error; context timeout during heavy scheduler load.","solutions":["Check the wrapped store error's root cause","Verify metadata DB health and retry the task run","Confirm task.InstanceID/DatabaseName form a valid lookup key","Increase context timeout if the query times out under load"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"db, err := store.GetDatabase(ctx, &store.FindDatabaseMessage{InstanceID: &task.InstanceID, DatabaseName: task.DatabaseName})\nif err != nil { return fmt.Errorf(\"database lookup failed: %w\", err) }","typeGuard":"func databaseExists(db *store.DatabaseMessage) bool { return db != nil }","tryCatchPattern":"if _, err := s.store.GetDatabase(ctx, find); err != nil {\n\tif errors.Is(err, context.DeadlineExceeded) { return retry(err) }\n\treturn errors.Wrapf(err, \"failed to get database for drift validation\")\n}","preventionTips":["Ensure task.DatabaseName is set (except DATABASE_CREATE tasks)","Keep store query timeouts reasonable for scheduler context","Monitor metadata DB for connection saturation"],"tags":["store","database","drift","query"],"backgroundTag":"database-query-failed","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"}