Skip to content

Commit 9eab0d0

Browse files
fix: re-initialize provider when re-registered on the same domain
Signed-off-by: Jonathan Norris <jonathan.norris@dynatrace.com>
1 parent ea8d686 commit 9eab0d0

2 files changed

Lines changed: 42 additions & 5 deletions

File tree

openfeature/provider/_registry.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,10 @@ def set_provider(
7777
with self._lock:
7878
self._reject_domain_scoped_rebind(provider, domain)
7979
old_provider = self._providers.get(domain)
80-
was_bound_elsewhere = provider is self._default_provider or any(
80+
already_bound = provider is self._default_provider or any(
8181
p is provider for d, p in self._providers.items() if d != domain
8282
)
83-
was_bound_here = (
84-
domain in self._providers and self._providers[domain] is provider
85-
)
8683
self._providers[domain] = provider
87-
already_bound = was_bound_elsewhere or was_bound_here
8884
if not already_bound:
8985
needs_init = True
9086
self._provider_status[provider] = ProviderStatus.NOT_READY

tests/provider/test_registry.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,47 @@ def domain_scoped(self) -> bool:
594594
)
595595

596596

597+
def test_reregistering_same_provider_on_same_domain_reinitializes():
598+
registry = ProviderRegistry()
599+
provider = Mock()
600+
init_count = 0
601+
602+
def counting_initialize(evaluation_context, domain=None):
603+
nonlocal init_count
604+
init_count += 1
605+
606+
provider.initialize.side_effect = counting_initialize
607+
608+
registry.set_provider("domain", provider, wait_for_init=True)
609+
registry.set_provider("domain", provider, wait_for_init=True)
610+
611+
assert init_count == 2
612+
613+
614+
def test_reregistering_same_provider_after_failed_init_retries():
615+
registry = ProviderRegistry()
616+
provider = Mock()
617+
attempts = 0
618+
619+
def flaky_initialize(evaluation_context, domain=None):
620+
nonlocal attempts
621+
attempts += 1
622+
if attempts == 1:
623+
raise ProviderFatalError()
624+
625+
provider.initialize.side_effect = flaky_initialize
626+
627+
with pytest.raises(ProviderFatalError):
628+
registry.set_provider("domain", provider, wait_for_init=True)
629+
630+
assert registry.get_provider_status(provider) == ProviderStatus.FATAL
631+
632+
registry.set_provider("domain", provider, wait_for_init=True)
633+
634+
assert attempts == 2
635+
assert registry.get_provider_status(provider) == ProviderStatus.READY
636+
637+
597638
def test_callable_accepts_domain_returns_false_for_uninspectable_callable():
598639
assert _callable_accepts_domain(object()) is False # type: ignore[arg-type]
599640

0 commit comments

Comments
 (0)