{"record":{"id":"ec0edd0a3cbb5ba6","repo":"googleapis/mcp-toolbox","slug":"failed-to-delete-materialized-view-w","errorCode":null,"errorMessage":"failed to delete materialized view: %w","messagePattern":"failed to delete materialized view: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sources/bigtable/admin_wrappers.go","lineNumber":272,"sourceCode":"\treturn map[string]string{\"status\": \"materialized view created successfully\"}, nil\n}\n\nfunc (s *Source) UpdateMaterializedView(ctx context.Context, instanceId, materializedViewId, query string) (any, error) {\n\tconf := bigtable.MaterializedViewInfo{ // MUST be value per bigtable SDK\n\t\tMaterializedViewID: materializedViewId,\n\t\tQuery:              query,\n\t}\n\terr := s.InstanceAdmin.UpdateMaterializedView(ctx, instanceId, conf)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to update materialized view: %w\", err)\n\t}\n\treturn map[string]string{\"status\": \"materialized view updated successfully\"}, nil\n}\n\nfunc (s *Source) DeleteMaterializedView(ctx context.Context, instanceId, materializedViewId string) (any, error) {\n\terr := s.InstanceAdmin.DeleteMaterializedView(ctx, instanceId, materializedViewId)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to delete materialized view: %w\", err)\n\t}\n\treturn map[string]string{\"status\": \"materialized view deleted successfully\"}, nil\n}\n","sourceCodeStart":254,"sourceCodeEnd":276,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/bigtable/admin_wrappers.go#L254-L276","documentation":"DeleteMaterializedView wraps errors from InstanceAdmin.DeleteMaterializedView. Deletion fails when the view does not exist (NotFound), permissions are missing, or a transient gRPC error occurs. The original error is preserved via %w for programmatic inspection.","triggerScenarios":"Calling DeleteMaterializedView (bigtable_delete_materialized_view tool) when: materializedViewId was already deleted or never existed, the instanceId is wrong, caller lacks delete permission, or the admin RPC fails transiently.","commonSituations":"Non-idempotent cleanup scripts double-deleting; deleting a logical view ID with the materialized-view tool (separate namespaces); IAM role removals; transient API outages.","solutions":["Handle codes.NotFound as success for idempotent deletes via status.FromError on the wrapped error","Confirm the ID belongs to a materialized view, not a logical view","Grant roles/bigtable.admin or the delete permission to the caller","Retry on Unavailable/DeadlineExceeded"],"exampleFix":"// before: rerun of cleanup fails\nerr := s.InstanceAdmin.DeleteMaterializedView(ctx, instanceId, id)\n// after: idempotent handling\nerr := s.InstanceAdmin.DeleteMaterializedView(ctx, instanceId, id)\nif err != nil && status.Code(err) != codes.NotFound {\n    return nil, fmt.Errorf(\"failed to delete materialized view: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":"views, err := src.ListMaterializedViews(ctx, instanceId)\nif err != nil { return err }\nif !containsMaterializedViewID(views, viewId) {\n    return nil // already absent; treat delete as no-op\n}","typeGuard":"func isNotFound(err error) bool {\n    st, ok := status.FromError(errors.Unwrap(err))\n    return ok && st.Code() == codes.NotFound\n}","tryCatchPattern":"res, err := src.DeleteMaterializedView(ctx, instanceId, viewId)\nswitch {\ncase err == nil:\n    // deleted\ncase isNotFound(err):\n    // already deleted: success\ndefault:\n    return err\n}","preventionTips":["Make cleanup idempotent by treating NotFound as success","Use the correct tool per namespace: logical views vs materialized views","Verify delete permission (roles/bigtable.admin) before running teardown scripts","Add retry with backoff for transient gRPC failures"],"tags":["gcp","bigtable","admin-api","permissions"],"backgroundTag":"gcp-api-error","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}