From 2f5c4d77d616148ecfab59cc5e3a9d1839a50bce Mon Sep 17 00:00:00 2001 From: Adam Willden Date: Fri, 18 Sep 2026 16:15:09 +0100 Subject: [PATCH] Improve error handling for existing directories Handle the case where a directory is created concurrently by another deployment without treating it as an error. With the move to CodeDeploy Agent v2 and its support for concurrent deployments, we are experiencing failures during the Install step when multiple deployments attempt to create the same directory at the same time. In our case, three deployments run simultaneously and copy files into separate destinations beneath a shared nested directory structure that does not initially exist. Each deployment determines that the shared parent directory needs to be created and queues a directory creation command. If another deployment creates that directory before the command is executed, fs::create_dir returns AlreadyExists, causing the deployment to fail. This change treats AlreadyExists as successful when the existing path is a directory. The directory is only written to the cleanup file when it was created by the current deployment, ensuring that a deployment does not subsequently attempt to clean up a directory created by another deployment. --- src/installer/commands/make_directory_command.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/installer/commands/make_directory_command.rs b/src/installer/commands/make_directory_command.rs index 2cf751a..ae6a097 100644 --- a/src/installer/commands/make_directory_command.rs +++ b/src/installer/commands/make_directory_command.rs @@ -17,10 +17,18 @@ impl MakeDirectoryCommand { } /// # Errors - /// Returns an error if the command execution fails. + /// Returns an error if the command execution fails, unless the path already exists pub fn execute(&self, cleanup_file: &mut dyn Write) -> Result<()> { - fs::create_dir(&self.directory)?; - writeln!(cleanup_file, "{}", self.directory.display())?; + match fs::create_dir(&self.directory) { + Ok(()) => { + writeln!(cleanup_file, "{}", self.directory.display())?; + } + Err(e) + if e.kind() == std::io::ErrorKind::AlreadyExists + && self.directory.is_dir() => {} + Err(e) => return Err(e.into()), + } + Ok(()) }