Merge "Fix parallel initial version negotiation"

This commit is contained in:
Zuul
2025-09-26 19:21:56 +00:00
committed by Gerrit Code Review

View File

@@ -19,6 +19,7 @@ import json
import logging import logging
import re import re
import textwrap import textwrap
import threading
import time import time
from urllib import parse as urlparse from urllib import parse as urlparse
@@ -345,6 +346,7 @@ class SessionClient(VersionNegotiationMixin, adapter.LegacyJsonAdapter):
_('The Bare Metal API endpoint cannot be detected and was ' _('The Bare Metal API endpoint cannot be detected and was '
'not provided explicitly')) 'not provided explicitly'))
self.endpoint_trimmed = _trim_endpoint_api_version(endpoint) self.endpoint_trimmed = _trim_endpoint_api_version(endpoint)
self._first_negotiation_lock = threading.Lock()
def _parse_version_headers(self, resp): def _parse_version_headers(self, resp):
return self._generic_parse_version_headers(resp.headers.get) return self._generic_parse_version_headers(resp.headers.get)
@@ -369,7 +371,9 @@ class SessionClient(VersionNegotiationMixin, adapter.LegacyJsonAdapter):
# NOTE(TheJulia): self.os_ironic_api_version is reset in # NOTE(TheJulia): self.os_ironic_api_version is reset in
# the self.negotiate_version() call if negotiation occurs. # the self.negotiate_version() call if negotiation occurs.
if self.os_ironic_api_version and self._must_negotiate_version(): if self.os_ironic_api_version and self._must_negotiate_version():
self.negotiate_version(self.session, None) with self._first_negotiation_lock:
if self._must_negotiate_version():
self.negotiate_version(self.session, None)
kwargs.setdefault('user_agent', USER_AGENT) kwargs.setdefault('user_agent', USER_AGENT)
kwargs.setdefault('auth', self.auth) kwargs.setdefault('auth', self.auth)