Jelajahi Sumber

AMBARI-11120: Add locking to choco packages (jluniya)

Jayush Luniya 10 tahun lalu
induk
melakukan
5463432a1b

+ 19 - 3
ambari-agent/src/main/package/choco/chocolateyinstall.ps1

@@ -28,6 +28,8 @@ $packageParameters = $env:chocolateyPackageParameters
 $arguments = @{}
 $ambariRoot = "C:\ambari"
 $retries = 5
+$lockTimeout = 60000
+
 # Parse the packageParameters
 #   /AmbariRoot:C:\ambari /Retries:5
 if ($packageParameters) {
@@ -53,6 +55,10 @@ if ($packageParameters) {
     Write-Debug "Retries Argument Found"
     $retries = $arguments["Retries"]
   }
+  if ($arguments.ContainsKey("LockTimeout")) {
+    Write-Debug "LockTimeout Argument Found"
+    $lockTimeout = $arguments["LockTimeout"]
+  }
 } else {
   Write-Debug "No Package Parameters Passed in"
 }
@@ -67,6 +73,16 @@ $target = "$ambariRoot\$packageName-$packageVersion"
 Import-Module "$modulesFolder\link.psm1"
 Import-Module "$modulesFolder\retry.psm1"
 
-Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
-Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
-Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
+$agentMutex = New-Object System.Threading.Mutex $false, "Global\$packageName"
+if($agentMutex.WaitOne($lockTimeout)) {
+  try {
+    Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
+    Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
+    Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
+  } finally {
+    $agentMutex.ReleaseMutex()
+  }
+} else {
+  Write-Host ("Failed to acquire lock [$packageName] within [$lockTimeout] ms. Installation failed!")
+  throw
+}

+ 21 - 5
ambari-metrics/ambari-metrics-assembly/src/main/package/choco/collector/chocolateyinstall.ps1

@@ -28,6 +28,8 @@ $packageParameters = $env:chocolateyPackageParameters
 $arguments = @{}
 $ambariRoot = "C:\ambari"
 $retries = 5
+$lockTimeout = 60000
+
 # Parse the packageParameters
 #   /AmbariRoot:C:\ambari /Retries:5
 if ($packageParameters) {
@@ -53,6 +55,10 @@ if ($packageParameters) {
     Write-Debug "Retries Argument Found"
     $retries = $arguments["Retries"]
   }
+  if ($arguments.ContainsKey("LockTimeout")) {
+    Write-Debug "LockTimeout Argument Found"
+    $lockTimeout = $arguments["LockTimeout"]
+  }
 } else {
   Write-Debug "No Package Parameters Passed in"
 }
@@ -69,10 +75,20 @@ $collectorConfDir = "$link\conf"
 Import-Module "$modulesFolder\link.psm1"
 Import-Module "$modulesFolder\retry.psm1"
 
-Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
-Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
-Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
+$collectorMutex = New-Object System.Threading.Mutex $false, "Global\$packageName"
+if($collectorMutex.WaitOne($lockTimeout)) {
+  try {
+    Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
+    Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
+    Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
 
-[Environment]::SetEnvironmentVariable("COLLECTOR_HOME", $collectorHome, "Machine")
-[Environment]::SetEnvironmentVariable("COLLECTOR_CONF_DIR", $collectorConfDir, "Machine")
+    [Environment]::SetEnvironmentVariable("COLLECTOR_HOME", $collectorHome, "Machine")
+    [Environment]::SetEnvironmentVariable("COLLECTOR_CONF_DIR", $collectorConfDir, "Machine")
+  } finally {
+    $collectorMutex.ReleaseMutex()
+  }
+} else {
+  Write-Host ("Failed to acquire lock [$packageName] within [$lockTimeout] ms. Installation failed!")
+  throw
+}
 

+ 21 - 5
ambari-metrics/ambari-metrics-assembly/src/main/package/choco/monitor/chocolateyinstall.ps1

@@ -28,6 +28,8 @@ $packageParameters = $env:chocolateyPackageParameters
 $arguments = @{}
 $ambariRoot = "C:\ambari"
 $retries = 5
+$lockTimeout = 60000
+
 # Parse the packageParameters
 #   /AmbariRoot:C:\ambari /Retries:5
 if ($packageParameters) {
@@ -53,6 +55,10 @@ if ($packageParameters) {
     Write-Debug "Retries Argument Found"
     $retries = $arguments["Retries"]
   }
+  if ($arguments.ContainsKey("LockTimeout")) {
+    Write-Debug "LockTimeout Argument Found"
+    $lockTimeout = $arguments["LockTimeout"]
+  }
 } else {
   Write-Debug "No Package Parameters Passed in"
 }
@@ -69,9 +75,19 @@ $monitorConfDir = "$link\conf"
 Import-Module "$modulesFolder\link.psm1"
 Import-Module "$modulesFolder\retry.psm1"
 
-Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
-Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
-Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
+$monitorMutex = New-Object System.Threading.Mutex $false, "Global\$packageName"
+if($monitorMutex.WaitOne($lockTimeout)) {
+  try {
+    Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
+    Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
+    Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
 
-[Environment]::SetEnvironmentVariable("MONITOR_HOME", $monitorHome, "Machine")
-[Environment]::SetEnvironmentVariable("MONITOR_CONF_DIR", $monitorConfDir, "Machine")
+    [Environment]::SetEnvironmentVariable("MONITOR_HOME", $monitorHome, "Machine")
+    [Environment]::SetEnvironmentVariable("MONITOR_CONF_DIR", $monitorConfDir, "Machine")
+  } finally {
+    $monitorMutex.ReleaseMutex()
+  }
+} else {
+  Write-Host ("Failed to acquire lock [$packageName] within [$lockTimeout] ms. Installation failed!")
+  throw
+}

+ 20 - 4
ambari-metrics/ambari-metrics-assembly/src/main/package/choco/sink/chocolateyinstall.ps1

@@ -28,6 +28,8 @@ $packageParameters = $env:chocolateyPackageParameters
 $arguments = @{}
 $ambariRoot = "C:\ambari"
 $retries = 5
+$lockTimeout = 60000
+
 # Parse the packageParameters
 #   /AmbariRoot:C:\ambari /Retries:5
 if ($packageParameters) {
@@ -53,6 +55,10 @@ if ($packageParameters) {
     Write-Debug "Retries Argument Found"
     $retries = $arguments["Retries"]
   }
+  if ($arguments.ContainsKey("LockTimeout")) {
+    Write-Debug "LockTimeout Argument Found"
+    $lockTimeout = $arguments["LockTimeout"]
+  }
 } else {
   Write-Debug "No Package Parameters Passed in"
 }
@@ -68,8 +74,18 @@ $sinkHome = $link
 Import-Module "$modulesFolder\link.psm1"
 Import-Module "$modulesFolder\retry.psm1"
 
-Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
-Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
-Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
+$sinkMutex = New-Object System.Threading.Mutex $false, "Global\$packageName"
+if($sinkMutex.WaitOne($lockTimeout)) {
+  try {
+    Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $target; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
+    Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
+    Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
 
-[Environment]::SetEnvironmentVariable("SINK_HOME", $sinkHome, "Machine")
+    [Environment]::SetEnvironmentVariable("SINK_HOME", $sinkHome, "Machine")
+  } finally {
+    $sinkMutex.ReleaseMutex()
+  }
+} else {
+  Write-Host ("Failed to acquire lock [$packageName] within [$lockTimeout] ms. Installation failed!")
+  throw
+}

+ 19 - 3
ambari-server/src/main/package/choco/chocolateyinstall.ps1

@@ -28,6 +28,8 @@ $packageParameters = $env:chocolateyPackageParameters
 $arguments = @{}
 $ambariRoot = "C:\ambari"
 $retries = 5
+$lockTimeout = 60000
+
 # Parse the packageParameters
 #   /AmbariRoot:C:\ambari /Retries:5
 if ($packageParameters) {
@@ -53,6 +55,10 @@ if ($packageParameters) {
     Write-Debug "Retries Argument Found"
     $retries = $arguments["Retries"]
   }
+  if ($arguments.ContainsKey("LockTimeout")) {
+    Write-Debug "LockTimeout Argument Found"
+    $lockTimeout = $arguments["LockTimeout"]
+  }
 } else {
   Write-Debug "No Package Parameters Passed in"
 }
@@ -67,6 +73,16 @@ $target = "$ambariRoot\$packageName-$packageVersion"
 Import-Module "$modulesFolder\link.psm1"
 Import-Module "$modulesFolder\retry.psm1"
 
-Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $ambariRoot; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
-Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
-Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
+$serverMutex = New-Object System.Threading.Mutex $false, "Global\$packageName"
+if($serverMutex.WaitOne($lockTimeout)) {
+  try {
+    Retry-Command -Command "Get-ChocolateyUnzip" -Arguments @{ FileFullPath = $zipFile; Destination = $ambariRoot; SpecificFolder = $specificFolder; PackageName = $packageName} -Retries $retries
+    Retry-Command -Command "Remove-Symlink-IfExists" -Arguments @{Link = $link} -Retries $retries
+    Retry-Command -Command "New-Symlink" -Arguments @{ Link = $link; Target = $target } -Retries $retries
+  } finally {
+    $serverMutex.ReleaseMutex()
+  }
+} else {
+  Write-Host ("Failed to acquire lock [$packageName] within [$lockTimeout] ms. Installation failed!")
+  throw
+}