Fix a bug that forced the init Action to run for at least two minutes on JavaScript by henrymercer · Pull Request #1494 · github/codeql-action (original) (raw)
The bug is that we wait for timeouts to elapse at the end of the init Action, even if the operation we were applying the timeout to already finished.
Context
Some of the Actions caching APIs we call don't have reliable timeouts, so we implement our own timeout on top of this. Once this timeout elapses, the Action continues executing without downloading / uploading the cache. However, once the top level of the Action has finished executing, the Node runtime will continue waiting on the background tasks to finish executing. We get around this by adding a call to util.checkForTimeout() to the end of the top level of the Action. This kills the Node process after 30 seconds if there was a timeout at some point during the Action's execution (see #1354 for more).
However it turns out we're liable to the same waiting problem with the timeouts themselves. If the cache operation finishes before the timeout, we'll still wait for the timeout itself to finish executing before the Action exits. This impacts JavaScript runs, which use TRAP caching. The TRAP caching timeout is currently two minutes, so the init Action will now wait for up to 2 minutes to finish on any workflows that run a language that supports TRAP caching.
Fix
To fix this, we immediately unref the timer so that Node won't wait for it to finish.