Skip to content

ModuleInterface: lock .swiftinterface while generating module cache #29101

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 10, 2020

Conversation

nkcsgexi
Copy link
Contributor

@nkcsgexi nkcsgexi commented Jan 9, 2020

This ensures only one process is generating module cache from an interface
file so that we don't blow up memory usage when multiple processes are
doing the same. The locking mechanism is similar to that of Clang's.

A better approach is that the build system takes care of the module building
step as a formal dependency.

rdar://52839445

@nkcsgexi nkcsgexi requested a review from DougGregor January 9, 2020 22:25
@nkcsgexi
Copy link
Contributor Author

nkcsgexi commented Jan 9, 2020

@swift-ci please smoke test

This ensures only one process is generating module cache from an interface
file so that we don't blow up memory usage when multiple processes are
doing the same. The locking mechanism is similar to that of Clang's.

A better approach is that the build system takes care of the module building
step as a formal dependency.

rdar://52839445
@nkcsgexi nkcsgexi force-pushed the lock-interface-gen-module branch from 53df79e to 8dda019 Compare January 9, 2020 23:46
@nkcsgexi
Copy link
Contributor Author

nkcsgexi commented Jan 9, 2020

@swift-ci please smoke test

Copy link
Member

@DougGregor DougGregor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@nkcsgexi nkcsgexi merged commit a8baeb3 into swiftlang:master Jan 10, 2020
@harlanhaskins
Copy link
Contributor

The issue I saw when I was testing this same thing was that llvm::LockFileManager has a hard 40 second limit on the time to wait for a lock file which is actually not long enough to build the standard library in many circumstances

@harlanhaskins
Copy link
Contributor

@nkcsgexi
Copy link
Contributor Author

hmm, if one iteration isn't sufficient then the process should enter another cycle of waiting the lock. Does 40 sec limit really matter in this case?

@harlanhaskins
Copy link
Contributor

Wouldn’t that start a new build?

@nkcsgexi
Copy link
Contributor Author

That would start acquiring another lock (notice there is a while(1) loop outside of the lock). But your point makes me think probably we should keep waiting if timed-out rather than removing the lock file unconditionally, which means opening the flood gate and suddenly all processes start to rebuilding.

@shahmishal
Copy link
Member

Seeing test failure which might be related to this PR:

FAIL: Swift(macosx-x86_64) :: ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh (10450 of 12516)
******************** TEST 'Swift(macosx-x86_64) :: ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh' FAILED ********************
Script:
--
: 'RUN: at line 1';   not env SWIFT_EXEC='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/bin/swiftc' '/usr/bin/python' /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/swift_build_sdk_interfaces.py -module-cache-path '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/swift-test-results/x86_64-apple-macosx10.9/clang-module-cache' -sdk /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/ -v -o /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output | '/usr/bin/python' '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/PathSanitizingFileCheck' --sanitize BUILD_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64' --sanitize SOURCE_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift' --use-filecheck '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/llvm-macosx-x86_64/bin/FileCheck'  /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh
: 'RUN: at line 6';   env SWIFT_EXEC='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/bin/swiftc' '/usr/bin/python' /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/swift_build_sdk_interfaces.py -module-cache-path '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/swift-test-results/x86_64-apple-macosx10.9/clang-module-cache' -sdk /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/ -v -o /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output -ignore-non-stdlib-failures | '/usr/bin/python' '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/PathSanitizingFileCheck' --sanitize BUILD_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64' --sanitize SOURCE_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift' --use-filecheck '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/llvm-macosx-x86_64/bin/FileCheck'  -check-prefix=CHECK-IGNORING-FAILURES /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh
: 'RUN: at line 11';   not env SWIFT_EXEC='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/bin/swiftc' '/usr/bin/python' /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/swift_build_sdk_interfaces.py -module-cache-path '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/swift-test-results/x86_64-apple-macosx10.9/clang-module-cache' -sdk /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/broken-stdlib-sdk/ -v -o /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output | '/usr/bin/python' '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/PathSanitizingFileCheck' --sanitize BUILD_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64' --sanitize SOURCE_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift' --use-filecheck '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/llvm-macosx-x86_64/bin/FileCheck'  -check-prefix CHECK-BROKEN-STDLIB /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh
: 'RUN: at line 12';   not env SWIFT_EXEC='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/bin/swiftc' '/usr/bin/python' /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/swift_build_sdk_interfaces.py -module-cache-path '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/swift-test-results/x86_64-apple-macosx10.9/clang-module-cache' -sdk /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/broken-stdlib-sdk/ -v -o /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output -ignore-non-stdlib-failures | '/usr/bin/python' '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/PathSanitizingFileCheck' --sanitize BUILD_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64' --sanitize SOURCE_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift' --use-filecheck '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/llvm-macosx-x86_64/bin/FileCheck'  -check-prefix CHECK-BROKEN-STDLIB /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh
: 'RUN: at line 17';   not env SWIFT_EXEC='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/bin/swiftc' '/usr/bin/python' /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/swift_build_sdk_interfaces.py -module-cache-path '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/swift-test-results/x86_64-apple-macosx10.9/clang-module-cache' -sdk /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/broken-stdlib-sdk/ -v -o /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output -skip-stdlib | '/usr/bin/python' '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/PathSanitizingFileCheck' --sanitize BUILD_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64' --sanitize SOURCE_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift' --use-filecheck '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/llvm-macosx-x86_64/bin/FileCheck'  /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh
: 'RUN: at line 18';   env SWIFT_EXEC='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/bin/swiftc' '/usr/bin/python' /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/swift_build_sdk_interfaces.py -module-cache-path '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/swift-test-results/x86_64-apple-macosx10.9/clang-module-cache' -sdk /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/broken-stdlib-sdk/ -v -o /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output -skip-stdlib -ignore-non-stdlib-failures | '/usr/bin/python' '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/utils/PathSanitizingFileCheck' --sanitize BUILD_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64' --sanitize SOURCE_DIR='/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift' --use-filecheck '/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/llvm-macosx-x86_64/bin/FileCheck'  -check-prefix=CHECK-IGNORING-FAILURES /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh
--
Exit Code: 1

Command Output (stderr):
--
/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/usr/lib/swift/Bad.swiftinterface:4:1: error: expressions are not allowed at the top level
garbage
^
/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/usr/lib/swift/Bad.swiftinterface:4:1: error: use of unresolved identifier 'garbage'
garbage
^~~~~~~
<unknown>:0: error: failed to load module 'Bad'
Stack dump:
0.	Program arguments: /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/bin/swiftc -frontend -build-module-from-parseable-interface -sdk /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/ -prebuilt-module-cache-path /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output -track-system-dependencies -module-cache-path /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/swift-test-results/x86_64-apple-macosx10.9/clang-module-cache/78591 -serialize-parseable-module-interface-dependency-hashes -module-name Good /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/usr/lib/swift/Good.swiftinterface -o /Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/buildbot_incremental/swift-macosx-x86_64/test-macosx-x86_64/ModuleInterface/swift_build_sdk_interfaces/Output/ignore-non-stdlib-failures.test-sh.tmp/output/Good.swiftmodule 
1.	Apple Swift version 5.2-dev
0  swiftc                   0x00000001130e6395 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
1  swiftc                   0x00000001130e5308 llvm::sys::RunSignalHandlers() + 248
2  swiftc                   0x00000001130e6996 SignalHandler(int) + 278
3  libsystem_platform.dylib 0x00007fff60772b5d _sigtramp + 29
4  libsystem_platform.dylib 0x6977732e646f6f47 _sigtramp + 66601991
5  swiftc                   0x000000010f344d05 swift::ModuleInterfaceLoader::buildSwiftModuleFromSwiftInterface(swift::SourceManager&, swift::DiagnosticEngine&, swift::SearchPathOptions const&, swift::LangOptions const&, llvm::StringRef, llvm::StringRef, llvm::StringRef, llvm::StringRef, llvm::StringRef, bool, bool, bool) + 373
6  swiftc                   0x000000010f115a7a performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 1466
7  swiftc                   0x000000010f114533 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 5139
8  swiftc                   0x000000010f0af29e main + 734
9  libdyld.dylib            0x00007fff605873d5 start + 1
10 libdyld.dylib            0x0000000000000010 start + 2678557756
/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/usr/lib/swift/Bad.swiftinterface:4:1: error: expressions are not allowed at the top level
garbage
^
/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/usr/lib/swift/Bad.swiftinterface:4:1: error: use of unresolved identifier 'garbage'
garbage
^~~~~~~
<unknown>:0: error: failed to load module 'Bad'
/Users/buildnode/jenkins/workspace/oss-swift-incremental-RA-osx/swift/test/ModuleInterface/swift_build_sdk_interfaces/ignore-non-stdlib-failures.test-sh:9:30: error: CHECK-IGNORING-FAILURES-DAG: expected string not found in input
CHECK-IGNORING-FAILURES-DAG: # (UPASS) {{.+}}{{\\|/}}Good.swiftinterface
                             ^
<stdin>:1:1: note: scanning from here
# Starting SOURCE_DIR/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/usr/lib/swift/Swift.swiftinterface
^
<stdin>:4:82: note: possible intended match here
# Starting SOURCE_DIR/test/ModuleInterface/swift_build_sdk_interfaces/Inputs/xfails-sdk/usr/lib/swift/Good.swiftinterface
                                                                                 ^

--

********************

@shahmishal
Copy link
Member

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants