diff --git a/.github/workflows/link_checker_workflow.yaml b/.github/workflows/link_checker_workflow.yaml index 4558f0fa42..ca7d89dfb2 100644 --- a/.github/workflows/link_checker_workflow.yaml +++ b/.github/workflows/link_checker_workflow.yaml @@ -39,6 +39,7 @@ jobs: --no-progress --cache --max-cache-age 1d + --exclude '^neo4j\+.*' --exclude '^bolt://.*' README.md docs/ output: /tmp/foo.txt diff --git a/go.mod b/go.mod index 3782f4b446..2254089cee 100644 --- a/go.mod +++ b/go.mod @@ -63,6 +63,7 @@ require ( google.golang.org/api v0.256.0 google.golang.org/genai v1.37.0 google.golang.org/genproto v0.0.0-20251022142026-3a174f9686a8 + google.golang.org/grpc v1.76.0 google.golang.org/protobuf v1.36.10 modernc.org/sqlite v1.40.0 ) @@ -229,7 +230,6 @@ require ( golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect - google.golang.org/grpc v1.76.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect modernc.org/libc v1.66.10 // indirect diff --git a/internal/sources/dataplex/dataplex.go b/internal/sources/dataplex/dataplex.go index 9ddb05edd1..52d64b194d 100644 --- a/internal/sources/dataplex/dataplex.go +++ b/internal/sources/dataplex/dataplex.go @@ -26,7 +26,9 @@ import ( "github.com/googleapis/genai-toolbox/internal/util" "go.opentelemetry.io/otel/trace" "golang.org/x/oauth2/google" + "google.golang.org/api/iterator" "google.golang.org/api/option" + grpcstatus "google.golang.org/grpc/status" ) const SourceKind string = "dataplex" @@ -173,9 +175,18 @@ func (s *Source) SearchAspectTypes(ctx context.Context, query string, pageSize i var results []*dataplexpb.AspectType for { entry, err := it.Next() - if err != nil { + + if err == iterator.Done { break } + if err != nil { + if st, ok := grpcstatus.FromError(err); ok { + errorCode := st.Code() + errorMessage := st.Message() + return nil, fmt.Errorf("failed to search aspect types with error code: %q message: %s", errorCode.String(), errorMessage) + } + return nil, fmt.Errorf("failed to search aspect types: %w", err) + } // Create an instance of exponential backoff with default values for retrying GetAspectType calls // InitialInterval, RandomizationFactor, Multiplier, MaxInterval = 500 ms, 0.5, 1.5, 60 s @@ -214,9 +225,17 @@ func (s *Source) SearchEntries(ctx context.Context, query string, pageSize int, var results []*dataplexpb.SearchEntriesResult for { entry, err := it.Next() - if err != nil { + if err == iterator.Done { break } + if err != nil { + if st, ok := grpcstatus.FromError(err); ok { + errorCode := st.Code() + errorMessage := st.Message() + return nil, fmt.Errorf("failed to search entries with error code: %q message: %s", errorCode.String(), errorMessage) + } + return nil, fmt.Errorf("failed to search entries: %w", err) + } results = append(results, entry) } return results, nil