fix: try multiple times to get win32 version to handle flakes (#2814)
The Google tensorflow/jax devinfra team reported that Windows 2022 with
Python 3.12.8
has a tendency to be flaky when calling the platform.win32 APIs. I'm
very certain I
saw similar behavior in the past myself.
To fix, just call the APIs a couple times; it seems to fix itself.
cc @vam-google
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b176766..8d11187 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -72,6 +72,8 @@
* The `sys._base_executable` value will reflect the underlying interpreter,
not venv interpreter.
* The {obj}`//python/runtime_env_toolchains:all` toolchain now works with it.
+* (rules) Better handle flakey platform.win32_ver() calls by calling them
+ multiple times.
{#v0-0-0-added}
### Added
diff --git a/python/private/python_bootstrap_template.txt b/python/private/python_bootstrap_template.txt
index eb5595f..210987a 100644
--- a/python/private/python_bootstrap_template.txt
+++ b/python/private/python_bootstrap_template.txt
@@ -46,7 +46,15 @@
# removed from common Win32 file and directory functions.
# Related doc: https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later
import platform
- if platform.win32_ver()[1] >= '10.0.14393':
+ win32_version = None
+ # Windows 2022 with Python 3.12.8 gives flakey errors, so try a couple times.
+ for _ in range(3):
+ try:
+ win32_version = platform.win32_ver()[1]
+ break
+ except (ValueError, KeyError):
+ pass
+ if win32_version and win32_version >= '10.0.14393':
return path
# import sysconfig only now to maintain python 2.6 compatibility
diff --git a/python/private/stage2_bootstrap_template.py b/python/private/stage2_bootstrap_template.py
index fcc323e..689602d 100644
--- a/python/private/stage2_bootstrap_template.py
+++ b/python/private/stage2_bootstrap_template.py
@@ -58,7 +58,15 @@
# Related doc: https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later
import platform
- if platform.win32_ver()[1] >= "10.0.14393":
+ win32_version = None
+ # Windows 2022 with Python 3.12.8 gives flakey errors, so try a couple times.
+ for _ in range(3):
+ try:
+ win32_version = platform.win32_ver()[1]
+ break
+ except (ValueError, KeyError):
+ pass
+ if win32_version and win32_version >= '10.0.14393':
return path
# import sysconfig only now to maintain python 2.6 compatibility