Skip to content

KAFKA-20337: Make all GroupConfig fields Optional and clean up validation#22003

Open
dajac wants to merge 1 commit intoapache:trunkfrom
dajac:KAFKA-20337-optional-group-config
Open

KAFKA-20337: Make all GroupConfig fields Optional and clean up validation#22003
dajac wants to merge 1 commit intoapache:trunkfrom
dajac:KAFKA-20337-optional-group-config

Conversation

@dajac
Copy link
Copy Markdown
Member

@dajac dajac commented Apr 8, 2026

All GroupConfig fields are now Optional, storing only explicitly
provided values. Broker-level defaults are resolved at access time via
flatMap().orElse(brokerDefault), eliminating stale-capture issues when
broker configs change dynamically.

Key changes:

  • All 21 GroupConfig fields are private Optional, using
    optionalInt/Boolean/String helpers based on originals().
  • GroupConfigManager no longer needs a defaultConfig; constructor
    simplified.
  • GroupCoordinatorConfig.extractGroupConfigMap(ShareGroupConfig)
    removed.
  • All consumers (GroupMetadataManager, ShareGroupConfigProvider,
    KafkaApis) use flatMap.
  • validateValues refactored with validateIntRange/Max/Min helpers
    operating on a single filtered parsed map.
  • Cross-field checks use broker defaults for missing values.

…tion

All GroupConfig fields are now Optional<T>, storing only explicitly
provided values. Broker-level defaults are resolved at access time via
flatMap().orElse(brokerDefault), eliminating stale-capture issues when
broker configs change dynamically.

Key changes:
- All 21 GroupConfig fields are private Optional, using
  optionalInt/Boolean/String helpers based on originals().
- GroupConfigManager no longer needs a defaultConfig; constructor
  simplified.
- GroupCoordinatorConfig.extractGroupConfigMap(ShareGroupConfig)
  removed.
- All consumers (GroupMetadataManager, ShareGroupConfigProvider,
  KafkaApis) use flatMap.
- validate() uses CONFIG_DEF.parse() directly instead of constructing
  a GroupConfig, keeping validation independent from GroupConfig
  construction.
- validateValues refactored with validateIntRange/Max/Min helpers
  operating on a single filtered parsed map.
- Cross-field checks use broker defaults for missing values.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@dajac
Copy link
Copy Markdown
Member Author

dajac commented Apr 8, 2026

@squah-confluent I have been playing with those dynamic configs and I came up with this patch. Please take a look.

Copy link
Copy Markdown
Contributor

@squah-confluent squah-confluent left a comment

Choose a reason for hiding this comment

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

Thanks for the refactor, looks good!

The approach to validate() where we only pass in the present parsed values is nice.

public ShareGroupAutoOffsetResetStrategy shareAutoOffsetReset() {
return ShareGroupAutoOffsetResetStrategy.fromString(shareAutoOffsetReset);
public Optional<ShareGroupAutoOffsetResetStrategy> shareAutoOffsetReset() {
return shareAutoOffsetReset.map(ShareGroupAutoOffsetResetStrategy::fromString);
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.

Minor suggestion: I would propose also moving the shareAutoOffsetReset and shareIsolationLevel parsing to the constructor.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants