Skip to content

refactor(bigquery-jdbc): optimize thread management and unify discovery logic in DatabaseMetaData methods#13560

Open
keshavdandeva wants to merge 10 commits into
mainfrom
jdbc/refactor-metadata-methods
Open

refactor(bigquery-jdbc): optimize thread management and unify discovery logic in DatabaseMetaData methods#13560
keshavdandeva wants to merge 10 commits into
mainfrom
jdbc/refactor-metadata-methods

Conversation

@keshavdandeva

@keshavdandeva keshavdandeva commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

b/520407325
b/520406763

This PR refactors and optimizes the database metadata retrieval methods in the BigQuery JDBC driver. It resolves thread management inefficiencies, eliminates duplicate API blocks, ensures consistent project discovery support, and introduces consistent error propagation across all asynchronous metadata methods.

Key Changes

1. Catalog-Based Routing in getSchemas

  • Synchronous Single-Catalog Path: If a specific catalog (project) is requested, getSchemas now executes completely synchronously on the calling thread, eliminating background executor and queue overhead.
  • Parallel Multi-Catalog Path: If no catalog is specified, the query executor runs parallel scans across all accessible projects (primary, additional, and discovered) in the background.

2. Unified Dataset Discovery & Deduplication

  • Introduced a single, shared helper method fetchMatchingDatasets to serve as the sole entry point for listing and filtering datasets.
  • Deduplicated dataset-listing logic across 7 metadata methods (getSchemas, getTables, getColumns, getProcedures, getProcedureColumns, getFunctions, and getFunctionColumns), ensuring consistent support for project discovery and SQL wildcard matching across all of them.

3. Robust Background Error Propagation & Deduplication

  • Refactored catch blocks across all 7 asynchronous metadata methods to consistently capture unexpected background thread exceptions and write them to the result set queue. This prevents silent empty-result failures, ensuring that any backend or network errors during metadata scans are properly propagated to the client as a SQLException.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors BigQueryDatabaseMetaData.java to clean up unused imports, correct catalog null-checks, consolidate dataset fetching logic into a helper method, and optimize getSchemas with a synchronous single-catalog path and a parallel multi-catalog path. The review feedback highlights several critical improvements: ensuring submitted futures are cancelled in the finally block of getSchemas to prevent resource leaks, wrapping project scans in a try-catch block to make sequential dataset fetching robust against single-project failures, restoring the thread's interrupted status when catching InterruptedException, and replacing an unnecessary Collections.synchronizedList with a plain ArrayList.

@keshavdandeva

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors metadata fetching in BigQueryDatabaseMetaData by consolidating dataset fetching into a helper method, introducing a synchronous path for single-catalog queries in getSchemas, and improving error handling. It also adds a null check in BigQueryJsonResultSet when cancelling tasks. The review comments point out three critical issues: a potential deadlock in the synchronous path of getSchemas when the schema count exceeds the bounded queue capacity, a compilation error due to a missing parameter in a BigQueryJsonResultSet.of call, and swallowed InterruptedException along with silent failures in the new fetchMatchingDatasets helper.

@keshavdandeva keshavdandeva marked this pull request as ready for review June 26, 2026 17:47
@keshavdandeva keshavdandeva requested review from a team as code owners June 26, 2026 17:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant