Handling exceptions in IDE main to avoid entering "zombie process" state. (#3648)

This is meant to address https://www.pivotaltracker.com/story/show/182691027.
This commit is contained in:
Michał Wawrzyniec Urbańczyk 2022-08-16 14:56:08 +02:00 committed by GitHub
parent 0dbbbaad00
commit 6c82588972
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 18 deletions

View File

@ -54,6 +54,9 @@
methods, atoms and functions are presented in nice, categorized view. The most methods, atoms and functions are presented in nice, categorized view. The most
popular tools are available at hand. The The panel is unstable, and thus is popular tools are available at hand. The The panel is unstable, and thus is
available under the `--enable-new-component-browser` flag. available under the `--enable-new-component-browser` flag.
- [Fixed error handling during startup.][3648] This prevents entering IDE into a
"zombie" state, where processes were started but not visible to user. They
could cause issues with starting further IDE instances.
#### EnsoGL (rendering engine) #### EnsoGL (rendering engine)
@ -273,6 +276,7 @@
[3601]: https://github.com/enso-org/enso/pull/3601 [3601]: https://github.com/enso-org/enso/pull/3601
[3617]: https://github.com/enso-org/enso/pull/3617 [3617]: https://github.com/enso-org/enso/pull/3617
[3629]: https://github.com/enso-org/enso/pull/3629 [3629]: https://github.com/enso-org/enso/pull/3629
[3648]: https://github.com/enso-org/enso/pull/3648
#### Enso Compiler #### Enso Compiler

View File

@ -476,7 +476,10 @@ let mainWindow = null
let origin = null let origin = null
async function main(args) { async function main(args) {
// Note [Main error handling]
try {
runBackend() runBackend()
console.log('Starting the IDE service.') console.log('Starting the IDE service.')
if (args.server !== false) { if (args.server !== false) {
let serverCfg = Object.assign({}, args) let serverCfg = Object.assign({}, args)
@ -495,8 +498,24 @@ async function main(args) {
} }
}) })
} }
} catch (err) {
// Note [Main error handling]
console.error('Failed to setup IDE. Error:', err)
Electron.app.quit()
}
} }
// Note [Main error handling]
// ==========================
// It is critical that the main function runs in its entirety. Otherwise, IDE enters a "zombie
// process" state, where Electron processes have been spawned, but there is no window and user can't
// observe anything. Usually they will try to spawn another instance of the IDE, but this can fail
// because of these zombie process presence.
//
// The solution is to catch all errors and exit the process if any part of the initial setup fails.
// If it succeeds, at least the Window will be shown, allowing the user to observe the error and
// close it.
function urlParamsFromObject(obj) { function urlParamsFromObject(obj) {
let params = [] let params = []
for (let key in obj) { for (let key in obj) {