{"record":{"id":"94a5fc54daeaae3c","repo":"googleapis/mcp-toolbox","slug":"failed-to-list-data-assets-w","errorCode":null,"errorMessage":"failed to list data assets: %w","messagePattern":"failed to list data assets: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sources/dataplex/dataplex.go","lineNumber":580,"sourceCode":"\t\tParent:   parent,\n\t\tFilter:   filter,\n\t\tPageSize: int32(pageSize),\n\t\tOrderBy:  orderBy,\n\t}\n\n\tit := s.GetDataProductClient().ListDataAssets(ctx, req)\n\tvar results []*DataAsset\n\n\tfor len(results) < pageSize {\n\t\tasset, err := it.Next()\n\t\tif err == iterator.Done {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tif st, ok := grpcstatus.FromError(err); ok {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to list data assets: code=%s message=%s\", st.Code(), st.Message())\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"failed to list data assets: %w\", err)\n\t\t}\n\t\tparts := strings.Split(asset.GetName(), \"/\")\n\t\tvar locID, prodID, assetID string\n\t\tif len(parts) >= 8 && parts[0] == \"projects\" && parts[2] == \"locations\" && parts[4] == \"dataProducts\" && parts[6] == \"dataAssets\" {\n\t\t\tlocID = parts[3]\n\t\t\tprodID = parts[5]\n\t\t\tassetID = parts[7]\n\t\t}\n\t\tresults = append(results, &DataAsset{\n\t\t\tLocationID:    locID,\n\t\t\tDataProductID: prodID,\n\t\t\tDataAssetID:   assetID,\n\t\t\tResourceURI:   asset.GetResource(),\n\t\t\tLabels:        asset.GetLabels(),\n\t\t})\n\t}\n\treturn results, nil\n}","sourceCodeStart":562,"sourceCodeEnd":598,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/dataplex/dataplex.go#L562-L598","documentation":"Fallback branch of the ListDataAssets error path: the iterator returned an error with no gRPC status, so the library wraps the raw cause with %w. This points to a client-side or transport problem instead of an API-reported status.","triggerScenarios":"Non-gRPC errors from iterator.Next() while paging data assets: context cancellation or deadline exceeded, dropped connections, or client/serialization errors.","commonSituations":"Request handler context expiring during long pagination; unstable network or proxy; transient token refresh failures surfaced as plain errors.","solutions":["Unwrap the error to identify the root cause.","Increase the context timeout or pass a fresh context for pagination.","Retry with backoff for transient network issues.","Confirm credentials/token refresh works (gcloud auth application-default login)."],"exampleFix":"// before\nassets, err := src.ListDataAssets(ctx, ...) // ctx nearly expired\n// after\nctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)\ndefer cancel()\nassets, err := src.ListDataAssets(ctx, ...)","handlingStrategy":"retry","validationCode":"if err := ctx.Err(); err != nil { return nil, fmt.Errorf(\"context already done: %w\", err) }","typeGuard":null,"tryCatchPattern":"var assets []*DataAsset\nerr := retry.Do(func() error {\n\tvar e error\n\tassets, e = src.ListDataAssets(ctx, locID, prodID, filter, pageSize, orderBy)\n\treturn e\n}, retry.Attempts(3), retry.DelayType(retry.BackOffDelay))","preventionTips":["Allocate sufficient context timeout for full asset pagination.","Retry transient errors with exponential backoff.","Ensure stable connectivity; avoid flaky proxies for googleapis traffic.","Refresh credentials before long-running listing sessions."],"tags":["gcp","dataplex","grpc","network","pagination"],"backgroundTag":"grpc-transport-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"}