mirror of https://github.com/pulumi/pulumi.git
![]() When installing a plugin, previous versions of Pulumi extracted the plugin tarball to a temp directory and then renamed the temp directory to the final plugin directory. This was done to prevent concurrent installs: if a process fails to rename the temp dir because the final dir already exists, it means another process already installed the plugin. Unfortunately, on Windows the rename operation often fails due to aggressive virus scanners opening files in the temp dir. In order to provide reliable plugin installs on Windows, we now extract the tarball directly into the final directory, and use file locks to prevent concurrent installs from toppling over one another. During install, a lock file is created in the plugin cache directory with the same name as the plugin's final directory but suffixed with `.lock`. The process that obtains the lock is responsible for extracting the tarball. Before it does that, it cleans up any previous temp directories of failed installs of previous versions of Pulumi. Then it creates an empty `.partial` file next to the `.lock` file. The `.partial` file indicates an installation is in-progress. The `.partial` file is deleted when installation is complete, indicating the plugin was successfully installed. If a failure occurs during installation, the `.partial` file will remain indicating the plugin wasn't fully installed. The next time the plugin is installed, the old installation directory will be removed and replaced with a fresh install. This is the same approach Go uses for installing modules in its module cache. |
||
---|---|---|
.. | ||
creds.go | ||
paths.go | ||
plugins.go | ||
plugins_install_nodejs_test.go | ||
plugins_install_python_test.go | ||
plugins_install_test.go | ||
plugins_test.go | ||
project.go | ||
project_test.go | ||
settings.go | ||
templates.go | ||
templates_test.go | ||
workspace.go |