From 05cae938cbe1ac8807f4913044d9bee46dc3a0e1 Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Tue, 14 Oct 2025 17:07:03 -0700 Subject: Retry file reads in slang-test to handle intermittent I/O errors (#8713) Related #8705 --- tools/slang-test/slang-test-main.cpp | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'tools') diff --git a/tools/slang-test/slang-test-main.cpp b/tools/slang-test/slang-test-main.cpp index 36e79659f..0095a5867 100644 --- a/tools/slang-test/slang-test-main.cpp +++ b/tools/slang-test/slang-test-main.cpp @@ -557,13 +557,43 @@ static SlangResult _gatherTestsForFile( String fileContents; - SlangResult readResult = Slang::File::readAllText(filePath, fileContents); + TestReporter* testReporter = nullptr; + if (context) + testReporter = context->getTestReporter(); + + // Try reading the file with retries on failure to handle intermittent I/O errors + // (commonly seen on macOS in CI environments) + SlangResult readResult = SLANG_FAIL; + for (int retryCount = 0; retryCount < 3 && SLANG_FAILED(readResult); ++retryCount) + { + if (retryCount) + { + if (testReporter) + { + testReporter->messageFormat( + TestMessageType::Info, + "Retrying to read test file '%s' (attempt %d)", + filePath.getBuffer(), + retryCount + 1); + } + else + { + fprintf( + stderr, + "Retrying to read test file '%s' (attempt %d)\n", + filePath.getBuffer(), + retryCount + 1); + } + std::this_thread::sleep_for(std::chrono::milliseconds(retryCount * 100)); + } + readResult = Slang::File::readAllText(filePath, fileContents); + } if (SLANG_FAILED(readResult)) { // Log file reading failure with details (thread-safe) - if (context && context->getTestReporter()) + if (testReporter) { - context->getTestReporter()->messageFormat( + testReporter->messageFormat( TestMessageType::RunError, "Failed to read test file '%s' (error: 0x%08X)", filePath.getBuffer(), -- cgit v1.2.3