-
Notifications
You must be signed in to change notification settings - Fork 292
Support a flag configured to passthrough to env var #2432
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
djeebus
wants to merge
1
commit into
main
Choose a base branch
from
support-flag-fallback-to-env
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+47
−20
Draft
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🟡 Both
JSONFlagandIntFlaggain afallbackOnZerofield andFallbackOnZero()method in this PR, but neither type has a constructor (e.g.newJSONFlagFallbackOnZero/newIntFlagFallbackOnZero) that ever sets the field totrue. Since the field is unexported, it is permanentlyfalse, making it dead code. Either add the missing constructors to make the feature usable, or remove the fields and hard-codereturn falseasBoolFlagalready does.Extended reasoning...
What the bug is and how it manifests
Both
JSONFlag(lines 35–43) andIntFlag(lines 132–140) inflags.gowere given afallbackOnZero boolfield and a correspondingFallbackOnZero() boolmethod that returns it. The intent is clear: thegetFlaggeneric inclient.gochecksflag.FallbackOnZero()and, whentrue, substitutes the fallback if LaunchDarkly returns a zero value. However, neither flag type has a constructor that ever setsfallbackOnZero = true.The specific code path that triggers it
Every
JSONFlagis created exclusively throughnewJSONFlag(), which leavesfallbackOnZeroat its Go zero value (false). EveryIntFlagis created exclusively throughnewIntFlag(), which does the same. Because both fields are unexported (fallbackOnZero, notFallbackOnZero), callers outside thefeatureflagspackage cannot set them either. The methodFallbackOnZero()therefore always returnsfalsefor everyJSONFlagandIntFlagin the codebase.Why existing code doesn't prevent it
The compiler happily accepts the struct fields and method — there is no static check that an unexported field must be reachable. The interface
typedFlag[T]requiresFallbackOnZero() bool, and both types satisfy it, so no build or vet error is raised. The dead code is silently valid.What the impact would be
No runtime behavior is broken today because no current flag uses the feature. The danger is forward-looking: a developer looking at
JSONFlagorIntFlagwill see thefallbackOnZerofield andFallbackOnZero()method, assume they can enable the passthrough behaviour by providing a suitable constructor, and then wonder why the feature never fires — or add a constructor without noticing the existingFallbackOnZeromethod already exists. It also creates an inconsistency:StringFlagcorrectly ships both the field andnewStringFlagFallbackOnEmptyString(), whileBoolFlagcorrectly hard-codesreturn false(no field at all).JSONFlagandIntFlagfall into a confusing middle ground.How to fix it
Option A (add the missing constructors, matching the
StringFlagpattern):Option B (remove the dead fields, matching the
BoolFlagpattern):Step-by-step proof
newJSONFlag("my-flag", ldvalue.Null()).JSONFlag.fallbackOnZeroisfalse.newJSONFlagFallbackOnZeroto call instead.flag.fallbackOnZerois unexported — the caller cannot writef.fallbackOnZero = true.getFlagcallsflag.FallbackOnZero()→false.if flag.FallbackOnZero() && isZeroValue(value)branch is never entered for anyJSONFlagorIntFlag.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can add it after compression, it would compose the fallback bag from ENV, just like the strings but with code, and use it for compression config.