Skip to content

Commit 1663a58

Browse files
committed
fix: Prevent providers from being shutdown multiple times
If a provider is set for two different domains, and then one of them is replaced, it will only be shutdown once. However, if a customer were to use a provider as both default and domain specific, replacing one or the other would incorrectly shutdown both usages. Signed-off-by: Matthew Keeler <mkeeler@launchdarkly.com>
1 parent 69b749f commit 1663a58

2 files changed

Lines changed: 40 additions & 2 deletions

File tree

openfeature/provider/_registry.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ def set_provider(self, domain: str, provider: FeatureProvider) -> None:
3030
if domain in providers:
3131
old_provider = providers[domain]
3232
del providers[domain]
33-
if old_provider not in providers.values():
33+
if (
34+
old_provider not in providers.values()
35+
and old_provider != self._default_provider
36+
):
3437
self._shutdown_provider(old_provider)
3538
if provider not in providers.values() and provider != self._default_provider:
3639
self._initialize_provider(provider)
@@ -44,7 +47,10 @@ def get_provider(self, domain: str | None) -> FeatureProvider:
4447
def set_default_provider(self, provider: FeatureProvider) -> None:
4548
if provider is None:
4649
raise GeneralError(error_message="No provider")
47-
if self._default_provider:
50+
if (
51+
self._default_provider
52+
and self._default_provider not in self._providers.values()
53+
):
4854
self._shutdown_provider(self._default_provider)
4955
self._default_provider = provider
5056

tests/provider/test_registry.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,35 @@ def test_registering_provider_as_domain_then_default_only_initializes_once():
140140
registry.set_default_provider(provider)
141141

142142
provider.initialize.assert_called_once()
143+
144+
145+
def test_replacing_provider_used_as_default_does_not_shutdown():
146+
"""Test that replacing a provider that is also the default does not shut it down twice."""
147+
148+
registry = ProviderRegistry()
149+
provider1 = Mock()
150+
provider2 = Mock()
151+
152+
registry.set_default_provider(provider1)
153+
registry.set_provider("domain", provider1)
154+
155+
registry.set_provider("domain", provider2)
156+
157+
provider1.shutdown.assert_not_called()
158+
provider2.shutdown.assert_not_called()
159+
160+
161+
def test_replacing_default_provider_used_as_domain_does_not_shutdown():
162+
"""Test that replacing a default provider that is also used for a domain does not shut it down twice."""
163+
164+
registry = ProviderRegistry()
165+
provider1 = Mock()
166+
provider2 = Mock()
167+
168+
registry.set_provider("domain", provider1)
169+
registry.set_default_provider(provider1)
170+
171+
registry.set_default_provider(provider2)
172+
173+
provider1.shutdown.assert_not_called()
174+
provider2.shutdown.assert_not_called()

0 commit comments

Comments
 (0)