Changeset 0ad9404448f7…
Parent 0ca99d0c705a…
by Quentin Schroeder <quentin@fogcreek.com>
Changes to one file · Browse files at 0ad9404448f7 Showing diff from parent 0ca99d0c705a Diff from another changeset...
|
|
- # TODO:
-# - Add switch "reenqueueFailures" to do that (mutually exclusive with "destoryFailures")
-# - Add switch "reenqueueRunning" to do that
-# - Display usage informaiton when run with no parameters
+<#
+.SYNOPSIS
+ Reenqueues or destroys tasks in the Kiln Queue Service
+.DESCRIPTION
+ This script is similar to the old FogCreek "churn the queue" script that we had for versions of Kiln prior to
+ 2.9.x. It simply hits the URLs that are provided via the Queue Stats page to reenqueue or destrow all
+ failed tasks and/or all currently running tasks (since they can get stuck running sometimes). It should
+ be used when the page at http://localhost:56785/ indicates that the queue is choking.
-# This script will reenqueue all failed and all currently running tasks in a Kiln Queue
-#
-# Name: Reenqueue all Tasks
-# Author: Quentin Schroeder
-# Version: 1.0.0
-# Description: This script is similar to our old "churn the queue" script that we had for versions of Kiln prior to
-# 2.9.x. It simply hits the URLs that are provided via the Queue Stats page to reenqueue all failed tasks
-# as well as all currently running tasks (since they can get stuck running sometimes). It should be used
-# when the page at http://localhost:56785/ indicates that the queue is choking.
-# Requirements: PowerShell v2.0
-# Parameters: destroyFailures - A switch to destroy all failures instead of reenqueuing them.
+.EXAMPLE
+ reenqueue_2.9_tasks.ps1 -retryCurrent -destroyFailures
+ This will reset everything that is currently in the queue, and permenantly destroy all failed tasks.
+.PARAMETER qs_host
+ The machine name where the Queue Service is running. The default value is almost always correct.
-param( [string]$qs_host = "localhost", # This will almost always have to be run directly from the server
- [switch]$destroyFailures, # Add this switch parameter to destroy all failed tasks
- [switch]$retryFailures, # Add this switch parameter to reenqueue all failed tasks
- [switch]$destroyRunning, # Add this switch parameter to destroyed all currently running tasks
- [switch]$retryRunning # Add this switch parameter to reenqueue all currently running tasks
- )
+.PARAMETER destroyFailures
+ Destroys all failed tasks (mutually exclusive with '-retryFailures').
+
+.PARAMETER retryFailures
+ Retries all failed tasks (mutually exclusive with '-destroyFailures').
+
+.PARAMETER destroyRunning
+ Destroys all currently running tasks (mutually exclusive with '-retryRunning').
+
+.PARAMETER retryRunning
+ Retries all currently running tasks (mutually exclusive with '-destroyRunning').
+
+.NOTES
+ Author: Quentin Schroeder
+ Date: Dec 13, 2012
+#>
+
+
+
+param([string]$qs_host = "localhost",
+ [switch]$destroyFailures,
+ [switch]$retryFailures,
+ [switch]$destroyRunning,
+ [switch]$retryRunning
+ )
function main() {
if ($destroyFailures -and $retryFailures)
{
write-host "Cannot choose to both destroy AND retry failed tasks, please select only one option."
+ exit
}
if ($destroyRunning -and $retryRunning)
{
write-host "Cannot choose to both destroy AND retry running tasks, please select only one option."
+ exit
+ }
+ if (!($destroyRunning -or $retryRunning -or $destroyFailures -or $retryFailures))
+ {
+ write-host "`nNo command was selected, this script will only show the current counts of running and failed tasks in the Queue.`n"
}
write-host ("Reading queue stats from http://{0}:56785/stats.json" -f $qs_host)
$response = (New-Object System.Net.WebClient).DownloadString("http://{0}:56785/stats.json" -f $qs_host)
if ($?) {write-host " Stats retrieved successfully.`n"}
$stats = Convert-JsonToXml($response)
$failures = $stats.root.failures
$runningTasks = $stats.root.runningTasks
$runningCount = $runningTasks.childnodes.count
$failCount = $failures.childnodes.count
write-host "Found $failCount failures..."
$i = 0
if (($failCount -gt 0) -and ($destroyFailures -or $retryFailures)) {
foreach ($failure in $failures.item) {
# Try both formats of the JSON (changed for 2.9.58)
if ($failure."#text")
{
$failure = $failure."#text"
}
elseif ($failure.id."#text")
{
$failure = $failure.id."#text"
}
else
{
$i += 1
write-host "`n$i/$failCount (NOT FOUND)..."
continue
}
$i += 1
write-host "`n$i/$failCount ($failure)..."
Process-Task $qs_host $failure $destroyFailures
}
}
write-host "`n-------`n"
write-host "Found $runningCount running tasks..."
$i = 0
if (($runningCount -gt 0) -and ($destroyRunning -or $retryRunning)) {
foreach ($runningTask in $runningTasks.item) {
# Try both formats of the JSON (changed for 2.9.58)
if ($runningTask.id."#text")
{
$runningTask = $runningTask.id."#text"
}
elseif ($runningTask.hash."#text")
{
$runningTask = $runningTask.hash."#text"
}
else
{
$i += 1
write-host "`n$i/$runningCount (NOT FOUND)..."
continue
}
$i += 1
write-host "`n$i/$runningCount ($runningTask)..."
Process-Task $qs_host $runningTask $destroyRunning
}
}
}
function Process-Task ($qs_host, $task, $destroy = $false)
{
if (!($destroy)) { write-host "Retrying task!" }
$URI = "http://{0}:56785/reenqueue?id={1}" -f ($qs_host, $task)
if ($destroy) {
write-host "Destroying task!"
$URI = "http://{0}:56785/destroy?id={1}" -f ($qs_host, $task)
}
Execute-HTTPPostCommand $URI "a=1"
if (!($?)) {
write-host "Error!"
}
}
# This is provided as an alternative to ConvertFrom-JSON, which requires Powershell V3
# which is not on most servers by default and requires a reboot to install.
# Source: (https://www.cogmotive.com/blog/powershell/parsing-json-in-powershell-xml-the-member-item-is-already-present)
Add-Type -Assembly System.ServiceModel.Web,System.Runtime.Serialization
function Convert-JsonToXml([string]$json)
{
$bytes = [byte[]][char[]]$json
$quotas = [System.Xml.XmlDictionaryReaderQuotas]::Max
$jsonReader = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonReader($bytes,$quotas)
try
{
$xml = new-object System.Xml.XmlDocument
$xml.Load($jsonReader)
$xml
}
finally
{
$jsonReader.Close()
}
}
# Source: (http://stackoverflow.com/questions/5246836/user-powershell-script-to-post-to-url)
function Execute-HTTPPostCommand() {
param(
[string] $target = $null,
[string] $post = $null
)
$webRequest = [System.Net.WebRequest]::Create($target)
$webRequest.ContentType = "text/html"
$PostStr = [System.Text.Encoding]::UTF8.GetBytes($post)
$webrequest.ContentLength = $PostStr.Length
$webRequest.ServicePoint.Expect100Continue = $false
$webRequest.Method = "POST"
$requestStream = $webRequest.GetRequestStream()
$requestStream.Write($PostStr, 0,$PostStr.length)
$requestStream.Close()
try
{
[System.Net.WebResponse] $resp = $webRequest.GetResponse()
}
catch [Net.WebException]
{
write-host $_.Exception.ToString()
}
$rs = $resp.GetResponseStream()
[System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs
[string] $results = $sr.ReadToEnd()
return $results
}
# Do everything
main
|
Loading...