feat(csharp): implement FeatureFlagCache (WI-3.1)#165
Merged
jadewang-db merged 21 commits intomainfrom Feb 10, 2026
Merged
Conversation
This was referenced Jan 22, 2026
jadewang-db
commented
Jan 23, 2026
9681fe2 to
1d6e3d5
Compare
jadewang-db
added a commit
that referenced
this pull request
Jan 23, 2026
## 🥞 Stacked PR Use this [link](https://github.com/adbc-drivers/databricks/pull/161/files) to review incremental changes. - [**stack/wi-1.2-tag-definition-system**](#161) [[Files changed](https://github.com/adbc-drivers/databricks/pull/161/files)] - [stack/wi-2.1-telemetry-data-models](#162) [[Files changed](https://github.com/adbc-drivers/databricks/pull/162/files/ab7fa964ff62f3fc9884034e17a7e57630fa8037..a566292aec78d19717c92e28f135535b09f25c80)] - [stack/wi-2.1-exception-classifier](#163) [[Files changed](https://github.com/adbc-drivers/databricks/pull/163/files/a566292aec78d19717c92e28f135535b09f25c80..baa7a2ae32662fddc65272e0264e8bb7d1644716)] - [stack/wi-3.1-circuit-breaker](#164) [[Files changed](https://github.com/adbc-drivers/databricks/pull/164/files/baa7a2ae32662fddc65272e0264e8bb7d1644716..03f7027e6731efe032c15555afe517ba49de3651)] - [stack/wi-3.1-feature-flag-cache](#165) [[Files changed](https://github.com/adbc-drivers/databricks/pull/165/files/03f7027e6731efe032c15555afe517ba49de3651..1d6e3d5b1c4c31ec91361337e574e6e5411fbbb6)] - [stack/wi-3.4-databricks-telemetry-exporter](#166) [[Files changed](https://github.com/adbc-drivers/databricks/pull/166/files/1d6e3d5b1c4c31ec91361337e574e6e5411fbbb6..eb382cb291c120a5f3cc3a1c38e0975b99c1369f)] - [stack/wi-3.5-metrics-aggregator](#167) [[Files changed](https://github.com/adbc-drivers/databricks/pull/167/files/eb382cb291c120a5f3cc3a1c38e0975b99c1369f..67723fabe6f62d7ed16591c3e88e96aa269daddd)] - [stack/wi-3.5-circuit-breaker-manager](#168) [[Files changed](https://github.com/adbc-drivers/databricks/pull/168/files/67723fabe6f62d7ed16591c3e88e96aa269daddd..6b66d37e9d97ca621d88c48a58ac60b2487425ea)] - [stack/e2e-feature-flag-cache-tests](#169) [[Files changed](https://github.com/adbc-drivers/databricks/pull/169/files/6b66d37e9d97ca621d88c48a58ac60b2487425ea..2a6fff2b9b91c7fd6cff7558d1d3b3596c0fa3c2)] - [stack/databricks-activity-listener](#170) [[Files changed](https://github.com/adbc-drivers/databricks/pull/170/files/2a6fff2b9b91c7fd6cff7558d1d3b3596c0fa3c2..39f6aed55278a533390e9aadf655f80dc11159c2)] - [stack/circuit-breaker-telemetry-exporter](#171) [[Files changed](https://github.com/adbc-drivers/databricks/pull/171/files/39f6aed55278a533390e9aadf655f80dc11159c2..4473de5ca3cfca8579818e6d58f8a2b12e869a47)] - [stack/telemetry-client-manager-wi-3.2](#172) [[Files changed](https://github.com/adbc-drivers/databricks/pull/172/files/4473de5ca3cfca8579818e6d58f8a2b12e869a47..94b678636d76a6d41a6612f76d00b4caccdab48a)] - [stack/telemetry-client-wi-5.5](#173) [[Files changed](https://github.com/adbc-drivers/databricks/pull/173/files/94b678636d76a6d41a6612f76d00b4caccdab48a..ce00998cbd0372d94303ad1d69e9711e4489fe96)] - [stack/telemetry-client-manager-e2e-wi-7](#174) [[Files changed](https://github.com/adbc-drivers/databricks/pull/174/files/ce00998cbd0372d94303ad1d69e9711e4489fe96..2646e86223ff1e7706b20d5970e556ec2f17867b)] - [stack/telemetry-client-e2e-tests-wi-7-standalone](#175) [[Files changed](https://github.com/adbc-drivers/databricks/pull/175/files/2646e86223ff1e7706b20d5970e556ec2f17867b..0b9ebd3867250d92d0d8007cb17d6ce471d5560a)] - [stack/wi-6.1-databricks-connection-telemetry-integration](#176) [[Files changed](https://github.com/adbc-drivers/databricks/pull/176/files/0b9ebd3867250d92d0d8007cb17d6ce471d5560a..4f553284c30eb7efcf67369c58dddd56675cd0be)] - [stack/wi-6.2-telemetry-tags-driver-activities](#177) [[Files changed](https://github.com/adbc-drivers/databricks/pull/177/files/4f553284c30eb7efcf67369c58dddd56675cd0be..1f7cde0c5642072b06588665b16ee3a30a90d256)] - [stack/wi-9-full-integration-e2e-tests](#178) [[Files changed](https://github.com/adbc-drivers/databricks/pull/178/files/1f7cde0c5642072b06588665b16ee3a30a90d256..c65e9fea7c65fa456f0114e95c867ee15f21bd87)] --------- --------- Co-authored-by: Jade Wang <jade.wang+data@databricks.com> Co-authored-by: Claude <noreply@anthropic.com>
1d6e3d5 to
8c30fc0
Compare
jadewang-db
added a commit
that referenced
this pull request
Jan 23, 2026
## 🥞 Stacked PR Use this [link](https://github.com/adbc-drivers/databricks/pull/162/files) to review incremental changes. - [**stack/wi-2.1-telemetry-data-models**](#162) [[Files changed](https://github.com/adbc-drivers/databricks/pull/162/files)] - [stack/wi-2.1-exception-classifier](#163) [[Files changed](https://github.com/adbc-drivers/databricks/pull/163/files/1e58d3c3785fa7ec1b83da01f80ddea1f6167851..0dac01831e7d9d313c67dc31e4aacceb17e74298)] - [stack/wi-3.1-circuit-breaker](#164) [[Files changed](https://github.com/adbc-drivers/databricks/pull/164/files/0dac01831e7d9d313c67dc31e4aacceb17e74298..59b0221cb4c9262d80a35041a2f1098376f6e19e)] - [stack/wi-3.1-feature-flag-cache](#165) [[Files changed](https://github.com/adbc-drivers/databricks/pull/165/files/59b0221cb4c9262d80a35041a2f1098376f6e19e..8c30fc0649b09bc38e09cfd4d6875d66963ff6c0)] - [stack/wi-3.4-databricks-telemetry-exporter](#166) [[Files changed](https://github.com/adbc-drivers/databricks/pull/166/files/8c30fc0649b09bc38e09cfd4d6875d66963ff6c0..a6e926c8017e9a3b3b6de31bbbafb367adaba884)] - [stack/wi-3.5-metrics-aggregator](#167) [[Files changed](https://github.com/adbc-drivers/databricks/pull/167/files/a6e926c8017e9a3b3b6de31bbbafb367adaba884..c53df5d3c0124c490b920e1e1a611dd9c24e02a4)] - [stack/wi-3.5-circuit-breaker-manager](#168) [[Files changed](https://github.com/adbc-drivers/databricks/pull/168/files/c53df5d3c0124c490b920e1e1a611dd9c24e02a4..de8757a697dd023628011d1aff9961896560bc95)] - [stack/e2e-feature-flag-cache-tests](#169) [[Files changed](https://github.com/adbc-drivers/databricks/pull/169/files/de8757a697dd023628011d1aff9961896560bc95..0b77f8373958342da429c20f7e30c02105402331)] - [stack/databricks-activity-listener](#170) [[Files changed](https://github.com/adbc-drivers/databricks/pull/170/files/0b77f8373958342da429c20f7e30c02105402331..9090bdefba63d6c7fbff45bf60c2c63668f3884e)] - [stack/circuit-breaker-telemetry-exporter](#171) [[Files changed](https://github.com/adbc-drivers/databricks/pull/171/files/9090bdefba63d6c7fbff45bf60c2c63668f3884e..0a0159524a429726078bd7340057672d6927d1cd)] - [stack/telemetry-client-manager-wi-3.2](#172) [[Files changed](https://github.com/adbc-drivers/databricks/pull/172/files/0a0159524a429726078bd7340057672d6927d1cd..75039c6574c2dc437f5d670e71b938b98719c06f)] - [stack/telemetry-client-wi-5.5](#173) [[Files changed](https://github.com/adbc-drivers/databricks/pull/173/files/75039c6574c2dc437f5d670e71b938b98719c06f..254cdc75487f3e9344d3df6fb9b9cbf49fd03228)] - [stack/telemetry-client-manager-e2e-wi-7](#174) [[Files changed](https://github.com/adbc-drivers/databricks/pull/174/files/254cdc75487f3e9344d3df6fb9b9cbf49fd03228..7371da59309d109e8d457f4c27edd13adfa38a2c)] - [stack/telemetry-client-e2e-tests-wi-7-standalone](#175) [[Files changed](https://github.com/adbc-drivers/databricks/pull/175/files/7371da59309d109e8d457f4c27edd13adfa38a2c..5ff7e96827faa69e8bae1d5b5da06a9f95b91a8c)] - [stack/wi-6.1-databricks-connection-telemetry-integration](#176) [[Files changed](https://github.com/adbc-drivers/databricks/pull/176/files/5ff7e96827faa69e8bae1d5b5da06a9f95b91a8c..7757345889dbfd0b1dcb22556e2e6c746d7fa0f0)] - [stack/wi-6.2-telemetry-tags-driver-activities](#177) [[Files changed](https://github.com/adbc-drivers/databricks/pull/177/files/7757345889dbfd0b1dcb22556e2e6c746d7fa0f0..2364122ad5402c9205008f39acaec6a400a4db98)] - [stack/wi-9-full-integration-e2e-tests](#178) [[Files changed](https://github.com/adbc-drivers/databricks/pull/178/files/2364122ad5402c9205008f39acaec6a400a4db98..698f3ea13f65a17b62385be8e8e4032497f88993)] --------- --------- Co-authored-by: Jade Wang <jade.wang+data@databricks.com> Co-authored-by: Claude <noreply@anthropic.com>
8c30fc0 to
b1a8b39
Compare
b1a8b39 to
9204712
Compare
…(WI-3.1)
Refactored FeatureFlagCache based on updated design doc requirements:
- Moved from Telemetry namespace to root namespace (AdbcDrivers.Databricks)
to make it a generic, reusable component
- Added HTTP API integration to fetch flags from
/api/2.0/connector-service/feature-flags/OSS_JDBC/{version}
- Implemented background refresh scheduler with server-provided TTL
- Added FeatureFlagsResponse model for API response parsing
- Updated FeatureFlagContext interface:
- GetFlagValue(string) - get individual flag value
- GetAllFlags() - get all cached flags as dictionary
- IsFeatureEnabled(string) - check if flag is "true"
- Shutdown() - stop background refresh scheduler
- IDisposable for proper cleanup
- Updated FeatureFlagCache.GetOrCreateContext() to accept HttpClient
and driver version parameters
- Updated all unit tests for new interface
Co-Authored-By: Claude <noreply@anthropic.com>
…I-3.1)
Integrated feature flag cache into the connection lifecycle:
- Fetch feature flags from server during connection initialization
- Merge flags into Properties dictionary with proper priority:
User Properties > Feature Flags > Driver Defaults
- Track host for proper context cleanup on Dispose
- Release feature flag context when connection is disposed
- All feature flag operations are fail-safe (errors logged, not thrown)
The feature flag endpoint used is:
GET /api/2.0/connector-service/feature-flags/OSS_JDBC/{driver_version}
Co-Authored-By: Claude <noreply@anthropic.com>
…-3.1) - Add EnsureSuccessStatusCode pattern for HTTP response handling - Extract common HTTP fetch code into single FetchFeatureFlags method - Make feature flag endpoint configurable via optional parameter - Replace Debug.WriteLine with Activity trace pattern - Add E2E tests for FeatureFlagCache using real Databricks instance Co-Authored-By: Claude (databricks-claude-opus-4-5) <noreply@anthropic.com>
…WI-3.1) - Move MergePropertiesWithFeatureFlags, TryGetHost, CreateFeatureFlagHttpClient, and MergeProperties helper methods from DatabricksConnection to FeatureFlagCache - Replace Debug.WriteLine with ActivitySource tracing for structured events - DatabricksConnection now delegates to FeatureFlagCache.GetInstance().MergePropertiesWithFeatureFlags() Co-Authored-By: Claude (databricks-claude-opus-4-5) <noreply@anthropic.com>
…ructor (WI-3.1) Replace hardcoded "1.0.0" with ApacheUtility.GetAssemblyVersion() to use the actual driver version in the test constructor. Co-Authored-By: Claude (databricks-claude-opus-4-5) <noreply@anthropic.com>
…-3.1) - Add proxy support using HiveServer2ProxyConfigurator - Handle protocol prefix in host (e.g., "https://myhost.databricks.com") - Add configurable timeout via FeatureFlagTimeoutSeconds parameter - Use consistent User-Agent format: DatabricksJDBCDriverOSS/{version} (ADBC) - Rename variables to localProperties/remoteProperties for clarity - Remove IsFeatureEnabled method from FeatureFlagContext - Use EnsureSuccessOrThrow extension method for HTTP error handling - Enhance E2E tests to verify flags fetched and cache cleanup Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add support for OAuth client_credentials (M2M) authentication in addition to token-based (PAT) auth for feature flag API calls. This ensures feature flags work with all supported authentication methods. - Add AuthHelper class with shared token extraction methods - Update FeatureFlagCache to use AuthHelper.GetAccessToken - Update HttpHandlerFactory to use AuthHelper.GetTokenFromProperties Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move the test factory method from production to test code: - Make FeatureFlagContext constructor internal instead of private - Make Ttl setter internal to allow tests to configure TTL - Remove CreateForTesting from FeatureFlagContext.cs - Add CreateTestContext helper method in FeatureFlagCacheTests.cs This addresses the PR review feedback that test-only code should not be in production source files. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…(WI-3.1) - Remove unused GetAccessToken and GetOAuthClientCredentialsToken from AuthHelper - Extract User-Agent logic to shared UserAgentHelper class (used by HttpClientFactory) - Remove enableTokenRefresh parameter from AddAuthHandlers (always enabled) - Remove unused CreateOAuthHttpClient from HttpClientFactory Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Re-add the DriverConfigTakePrecedence parameter and precedence control logic that was removed in commit 9d2c670. This allows users to control whether environment config (DATABRICKS_CONFIG_FILE) takes precedence over passed-in properties during configuration merging. - Add DriverConfigTakePrecedence constant to DatabricksParameters - Add DetermineDriverConfigPrecedence method to DatabricksDatabase - Update MergeWithDefaultEnvironmentConfig to respect precedence flag Default behavior (false): passed-in properties override environment config When true: environment config properties override passed-in properties Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The auth HTTP client is now managed internally by HttpHandlerFactory rather than stored as an instance field in StatementExecutionConnection. Updated tests to verify behavior rather than internal implementation details. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
adfe2b9 to
2262e9d
Compare
|
🚀 Integration tests triggered! View workflow run |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🥞 Stacked PR
Use this link to review incremental changes.