You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2014/07/26 00:27:23 UTC

[7/9] git commit: merge from 2.1.0

merge from 2.1.0


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/ef9473a0
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/ef9473a0
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/ef9473a0

Branch: refs/heads/trunk
Commit: ef9473a039e1a410f03dbeef76a6b20fe446d02d
Parents: 3fc8bb1 6f15fe2
Author: Jonathan Ellis <jb...@apache.org>
Authored: Fri Jul 25 17:25:59 2014 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Fri Jul 25 17:25:59 2014 -0500

----------------------------------------------------------------------
 CHANGES.txt                    |   1 +
 bin/cassandra-cli.bat          |  21 +-
 bin/cassandra-shuffle.bat      |  20 +-
 bin/cassandra.bat              |   3 +-
 bin/cassandra.ps1              | 839 ++++++++++++++++++++++++------------
 bin/cqlsh.bat                  |  68 +--
 bin/debug-cql.bat              | 100 ++---
 bin/nodetool.bat               |  20 +-
 bin/source-conf.ps1            | 114 ++---
 bin/sstablekeys.bat            |  26 +-
 bin/sstableloader.bat          | 102 ++---
 bin/sstablescrub.bat           | 102 ++---
 bin/sstableupgrade.bat         | 102 ++---
 bin/stop-server.bat            | 110 ++---
 bin/stop-server.ps1            | 356 +++++++--------
 conf/cassandra-env.ps1         | 648 ++++++++++++++--------------
 tools/bin/cassandra-stress.bat |  21 +-
 tools/bin/json2sstable.bat     |  25 +-
 tools/bin/sstable2json.bat     |  25 +-
 tools/bin/sstablemetadata.bat  |  15 +-
 tools/bin/sstablesplit.bat     | 102 ++---
 21 files changed, 1435 insertions(+), 1385 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/ef9473a0/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index d029b1d,0a1ba51..4ab4a36
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,18 -1,5 +1,19 @@@
 +2.1.1
 + * Pig support for hadoop CqlInputFormat (CASSANDRA-6454)
 + * Add listen_interface and rpc_interface options (CASSANDRA-7417)
 + * Fail to start if commit log replay detects a problem (CASSANDRA-7125)
 + * Improve schema merge performance (CASSANDRA-7444)
 + * Adjust MT depth based on # of partition validating (CASSANDRA-5263)
 + * Optimise NativeCell comparisons (CASSANDRA-6755)
 + * Configurable client timeout for cqlsh (CASSANDRA-7516)
 + * Include snippet of CQL query near syntax error in messages (CASSANDRA-7111)
 +Merged from 2.0:
 + * (cqlsh) Add tab-completion for CREATE/DROP USER IF [NOT] EXISTS (CASSANDRA-7611)
 + * Catch errors when the JVM pulls the rug out from GCInspector (CASSANDRA-5345)
 +
 +
  2.1.0-final
+  * Clean up Windows batch scripts (CASSANDRA-7619)
   * Fix native protocol drop user type notification (CASSANDRA-7571)
   * Give read access to system.schema_usertypes to all authenticated users
     (CASSANDRA-7578)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ef9473a0/bin/cassandra.ps1
----------------------------------------------------------------------
diff --cc bin/cassandra.ps1
index 4417c0c,ae7182a..d6a9494
--- a/bin/cassandra.ps1
+++ b/bin/cassandra.ps1
@@@ -1,283 -1,272 +1,556 @@@
- #
- # Licensed to the Apache Software Foundation (ASF) under one or more
- # contributor license agreements.  See the NOTICE file distributed with
- # this work for additional information regarding copyright ownership.
- # The ASF licenses this file to You under the Apache License, Version 2.0
- # (the "License"); you may not use this file except in compliance with
- # the License.  You may obtain a copy of the License at
- #
- #     http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- param (
-     [switch]$install,
-     [switch]$uninstall,
-     [switch]$help,
-     [switch]$verbose,
-     [switch]$f,
-     [string]$p,
-     [string]$H,
-     [string]$E
- )
- 
- $pidfile = "pid.txt"
- 
- #-----------------------------------------------------------------------------
- Function ValidateArguments
- {
-     if ($install -and $uninstall)
-     {
-         exit
-     }
-     if ($help)
-     {
-         PrintUsage
-     }
- }
- 
- #-----------------------------------------------------------------------------
- Function PrintUsage
- {
-     echo @"
- usage: cassandra.ps1 [-f] [-h] [-p pidfile] [-H dumpfile] [-D arg] [-E errorfile] [-install | -uninstall] [-help]
-     -f              Run cassandra in foreground
-     -install        install cassandra as a service
-     -uninstall      remove cassandra service
-     -p              pidfile tracked by server and removed on close (defaults to pid.txt)
-     -H              change JVM HeapDumpPath
-     -D              items to append to JVM_OPTS
-     -E              change JVM ErrorFile
-     -help           print this message
-     -verbose        Show detailed command-line parameters for cassandra run
- 
-     NOTE: installing cassandra as a service requires Commons Daemon Service Runner
-         available at http://commons.apache.org/proper/commons-daemon/"
- "@
-     exit
- }
- 
- #-----------------------------------------------------------------------------
- # Note: throughout these scripts we're replacing \ with /.  This allows clean
- # operation on both command-prompt and cygwin-based environments.
- Function Main
- {
-     ValidateArguments
- 
-     # support direct run of .ps1 file w/out batch file
-     if ($env:CASSANDRA_HOME -eq $null)
-     {
-         $scriptDir = Split-Path $script:MyInvocation.MyCommand.Path
-         $env:CASSANDRA_HOME = (Get-Item $scriptDir).parent.FullName
-     }
-     . "$env:CASSANDRA_HOME\bin\source-conf.ps1"
- 
-     $conf = Find-Conf
-     if ($verbose)
-     {
-         echo "Sourcing cassandra config file: $conf"
-     }
-     . $conf
- 
-     SetCassandraEnvironment
-     $pidfile = "$env:CASSANDRA_HOME\$pidfile"
- 
-     $logdir = "$env:CASSANDRA_HOME/logs"
-     $storagedir = "$env:CASSANDRA_HOME/data"
-     $env:CASSANDRA_PARAMS = $env:CASSANDRA_PARAMS + " -Dcassandra.logdir=""$logdir"" -Dcassandra.storagedir=""$storagedir"""
- 
-     # Other command line params
-     if ($H)
-     {
-         $env:JVM_OPTS = $env:JVM_OPTS + " -XX:HeapDumpPath=$H"
-     }
-     if ($E)
-     {
-         $env:JVM_OPTS = $env:JVM_OPTS + " -XX:ErrorFile=$E"
-     }
-     if ($p)
-     {
-         $pidfile = "$p"
-         $env:CASSANDRA_PARAMS = $env:CASSANDRA_PARAMS + ' -Dcassandra-pidfile="' + "$pidfile" + '"'
-     }
- 
-     # Parse -D JVM_OPTS
-     for ($i = 0; $i -lt $script:args.Length; ++$i)
-     {
-         if ($script:args[$i].Substring(0,2) -eq "-D")
-         {
-             $param = $script:args[$i].Substring(2)
-             $env:JVM_OPTS = "$env:JVM_OPTS -D$param"
-         }
-     }
- 
-     if ($install -or $uninstall)
-     {
-         HandleInstallation
-     }
-     else
-     {
-         RunCassandra($f)
-     }
- }
- 
- #-----------------------------------------------------------------------------
- Function HandleInstallation
- {
-     $SERVICE_JVM = """cassandra"""
-     $PATH_PRUNSRV = "$env:CASSANDRA_HOME\bin\daemon"
-     $PR_LOGPATH = $serverPath
- 
-     if (-Not (Test-Path $PATH_PRUNSRV\prunsrv.exe))
-     {
-         Write-Warning "Cannot find $PATH_PRUNSRV\prunsrv.exe.  Please download package from http://www.apache.org/dist/commons/daemon/binaries/windows/ to install as a service."
-         Break
-     }
- 
-     If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
-     {
-         Write-Warning "Cannot perform installation without admin credentials.  Please re-run as administrator."
-         Break
-     }
-     if (!$env:PRUNSRV)
-     {
-         $env:PRUNSRV="$PATH_PRUNSRV\prunsrv"
-     }
- 
-     $regPath = "HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\"
- 
-     echo "Attempting to delete existing $SERVICE_JVM service..."
-     Start-Sleep -s 2
-     $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//DS//$SERVICE_JVM" -PassThru -WindowStyle Hidden
- 
-     echo "Reverting to default TCP keepalive settings (2 hour timeout)"
-     Remove-ItemProperty -Path $regPath -Name KeepAliveTime -EA SilentlyContinue
- 
-     # Quit out if this is uninstall only
-     if ($uninstall)
-     {
-         return
-     }
- 
-     echo "Installing [$SERVICE_JVM]."
-     Start-Sleep -s 2
-     $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//IS//$SERVICE_JVM" -PassThru -WindowStyle Hidden
- 
-     echo "Setting launch parameters for [$SERVICE_JVM]"
-     Start-Sleep -s 2
- 
-     # Change delim from " -" to ";-" in JVM_OPTS for prunsrv
-     $env:JVM_OPTS = $env:JVM_OPTS -replace " -", ";-"
-     $env:JVM_OPTS = $env:JVM_OPTS -replace " -", ";-"
- 
-     # Strip off leading ; if it's there
-     $env:JVM_OPTS = $env:JVM_OPTS.TrimStart(";")
- 
-     # Broken multi-line for convenience - glued back together in a bit
-     $args = @"
- //US//$SERVICE_JVM
-  --Jvm=auto --StdOutput auto --StdError auto
-  --Classpath=$env:CLASSPATH
-  --StartMode=jvm --StartClass=$env:CASSANDRA_MAIN --StartMethod=main
-  --StopMode=jvm --StopClass=$env:CASSANDRA_MAIN  --StopMethod=stop
-  ++JvmOptions=$env:JVM_OPTS ++JvmOptions=-DCassandra
-  --PidFile "$pidfile"
- "@
-     $args = $args -replace [Environment]::NewLine, ""
-     $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList $args -PassThru -WindowStyle Hidden
- 
-     echo "Setting KeepAliveTimer to 5 minutes for TCP keepalive"
-     Set-ItemProperty -Path $regPath -Name KeepAliveTime -Value 300000
- 
-     echo "Installation of [$SERVICE_JVM] is complete"
- }
- 
- #-----------------------------------------------------------------------------
- Function RunCassandra([string]$foreground)
- {
-     echo "Starting cassandra server"
-     $cmd = @"
- $env:JAVA_BIN
- "@
-     $arg1 = $env:CASSANDRA_PARAMS
-     $arg2 = $env:JVM_OPTS
-     $arg3 = "-cp $env:CLASSPATH"
-     $arg4 = @"
- "$env:CASSANDRA_MAIN"
- "@
- 
-     $proc = $null
- 
-     if ($verbose)
-     {
-         echo "Running cassandra with: [$cmd $arg1 $arg2 $arg3 $arg4]"
-     }
- 
-     if ($foreground -ne "False")
-     {
-         $cygwin = $false
-         try
-         {
-             $uname = uname -o
-             $cygwin = $true
-         }
-         catch
-         {
-             # Failed at uname call, not in cygwin
-         }
- 
-         if ($cygwin)
-         {
-             # if running on cygwin, we cannot capture ctrl+c signals as mintty traps them and then
-             # SIGKILLs processes, so we'll need to record our $pidfile file for future
-             # stop-server usage
-             if (!$p)
-             {
-                 $arg2 = $arg2 + " -Dcassandra-pidfile=$pidfile"
-             }
-         }
- 
-         $arg2 = $arg2 + " -Dcassandra-foreground=yes"
- 
-         $pinfo = New-Object System.Diagnostics.ProcessStartInfo
-         $pinfo.FileName = "$env:JAVA_BIN"
-         $pinfo.RedirectStandardInput = $true
-         $pinfo.UseShellExecute = $false
-         $pinfo.Arguments = $arg1,$arg2,$arg3,$arg4
-         $p = New-Object System.Diagnostics.Process
-         $p.StartInfo = $pinfo
-         $p.Start() | Out-Null
-         echo $p.Id > $pidfile
-         $p.WaitForExit()
-     }
-     else
-     {
-         $proc = Start-Process -FilePath "$cmd" -ArgumentList $arg1,$arg2,$arg3,$arg4 -PassThru -WindowStyle Hidden
- 
-         $exitCode = $?
- 
-         try
-         {
-             echo $proc.Id > $pidfile
-         }
-         catch
-         {
-             echo @"
- WARNING! Failed to write pidfile to $pidfile.  stop-server.bat and
-     startup protection will not be available.
- "@
-             exit 1
-         }
- 
-         if (-Not $exitCode)
-         {
-             exit 1
-         }
-     }
- }
- 
- #-----------------------------------------------------------------------------
- Main
+ #
+ # Licensed to the Apache Software Foundation (ASF) under one or more
+ # contributor license agreements.  See the NOTICE file distributed with
+ # this work for additional information regarding copyright ownership.
+ # The ASF licenses this file to You under the Apache License, Version 2.0
++# (the "License"); you may not use this file except in compliance with
++# the License.  You may obtain a copy of the License at
++#
++#     http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing, software
++# distributed under the License is distributed on an "AS IS" BASIS,
++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++# See the License for the specific language governing permissions and
++# limitations under the License.
++param (
++    [switch]$install,
++    [switch]$uninstall,
++    [switch]$help,
++    [switch]$verbose,
++    [switch]$f,
++    [string]$p,
++    [string]$H,
++    [string]$E
++)
++
++$pidfile = "pid.txt"
++
++#-----------------------------------------------------------------------------
++Function ValidateArguments
++{
++    if ($install -and $uninstall)
++    {
++        exit
++    }
++    if ($help)
++    {
++        PrintUsage
++    }
++}
++
++#-----------------------------------------------------------------------------
++Function PrintUsage
++{
++    echo @"
++usage: cassandra.ps1 [-f] [-h] [-p pidfile] [-H dumpfile] [-D arg] [-E errorfile] [-install | -uninstall] [-help]
++    -f              Run cassandra in foreground
++    -install        install cassandra as a service
++    -uninstall      remove cassandra service
++    -p              pidfile tracked by server and removed on close (defaults to pid.txt)
++    -H              change JVM HeapDumpPath
++    -D              items to append to JVM_OPTS
++    -E              change JVM ErrorFile
++    -help           print this message
++    -verbose        Show detailed command-line parameters for cassandra run
++
++    NOTE: installing cassandra as a service requires Commons Daemon Service Runner
++        available at http://commons.apache.org/proper/commons-daemon/"
++"@
++    exit
++}
++
++#-----------------------------------------------------------------------------
++# Note: throughout these scripts we're replacing \ with /.  This allows clean
++# operation on both command-prompt and cygwin-based environments.
++Function Main
++{
++    ValidateArguments
++
++    # support direct run of .ps1 file w/out batch file
++    if ($env:CASSANDRA_HOME -eq $null)
++    {
++        $scriptDir = Split-Path $script:MyInvocation.MyCommand.Path
++        $env:CASSANDRA_HOME = (Get-Item $scriptDir).parent.FullName
++    }
++    . "$env:CASSANDRA_HOME\bin\source-conf.ps1"
++
++    $conf = Find-Conf
++    if ($verbose)
++    {
++        echo "Sourcing cassandra config file: $conf"
++    }
++    . $conf
++
++    SetCassandraEnvironment
++    $pidfile = "$env:CASSANDRA_HOME\$pidfile"
++
++    $logdir = "$env:CASSANDRA_HOME/logs"
++    $storagedir = "$env:CASSANDRA_HOME/data"
++    $env:CASSANDRA_PARAMS = $env:CASSANDRA_PARAMS + " -Dcassandra.logdir=""$logdir"" -Dcassandra.storagedir=""$storagedir"""
++
++    # Other command line params
++    if ($H)
++    {
++        $env:JVM_OPTS = $env:JVM_OPTS + " -XX:HeapDumpPath=$H"
++    }
++    if ($E)
++    {
++        $env:JVM_OPTS = $env:JVM_OPTS + " -XX:ErrorFile=$E"
++    }
++    if ($p)
++    {
++        $pidfile = "$p"
++        $env:CASSANDRA_PARAMS = $env:CASSANDRA_PARAMS + ' -Dcassandra-pidfile="' + "$pidfile" + '"'
++    }
++
++    # Parse -D JVM_OPTS
++    for ($i = 0; $i -lt $script:args.Length; ++$i)
++    {
++        if ($script:args[$i].Substring(0,2) -eq "-D")
++        {
++            $param = $script:args[$i].Substring(2)
++            $env:JVM_OPTS = "$env:JVM_OPTS -D$param"
++        }
++    }
++
++    if ($install -or $uninstall)
++    {
++        HandleInstallation
++    }
++    else
++    {
++        RunCassandra($f)
++    }
++}
++
++#-----------------------------------------------------------------------------
++Function HandleInstallation
++{
++    $SERVICE_JVM = """cassandra"""
++    $PATH_PRUNSRV = "$env:CASSANDRA_HOME\bin\daemon"
++    $PR_LOGPATH = $serverPath
++
++    if (-Not (Test-Path $PATH_PRUNSRV\prunsrv.exe))
++    {
++        Write-Warning "Cannot find $PATH_PRUNSRV\prunsrv.exe.  Please download package from http://www.apache.org/dist/commons/daemon/binaries/windows/ to install as a service."
++        Break
++    }
++
++    If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
++    {
++        Write-Warning "Cannot perform installation without admin credentials.  Please re-run as administrator."
++        Break
++    }
++    if (!$env:PRUNSRV)
++    {
++        $env:PRUNSRV="$PATH_PRUNSRV\prunsrv"
++    }
++
++    $regPath = "HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\"
++
++    echo "Attempting to delete existing $SERVICE_JVM service..."
++    Start-Sleep -s 2
++    $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//DS//$SERVICE_JVM" -PassThru -WindowStyle Hidden
++
++    echo "Reverting to default TCP keepalive settings (2 hour timeout)"
++    Remove-ItemProperty -Path $regPath -Name KeepAliveTime -EA SilentlyContinue
++
++    # Quit out if this is uninstall only
++    if ($uninstall)
++    {
++        return
++    }
++
++    echo "Installing [$SERVICE_JVM]."
++    Start-Sleep -s 2
++    $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//IS//$SERVICE_JVM" -PassThru -WindowStyle Hidden
++
++    echo "Setting launch parameters for [$SERVICE_JVM]"
++    Start-Sleep -s 2
++
++    # Change delim from " -" to ";-" in JVM_OPTS for prunsrv
++    $env:JVM_OPTS = $env:JVM_OPTS -replace " -", ";-"
++    $env:JVM_OPTS = $env:JVM_OPTS -replace " -", ";-"
++
++    # Strip off leading ; if it's there
++    $env:JVM_OPTS = $env:JVM_OPTS.TrimStart(";")
++
++    # Broken multi-line for convenience - glued back together in a bit
++    $args = @"
++//US//$SERVICE_JVM
++ --Jvm=auto --StdOutput auto --StdError auto
++ --Classpath=$env:CLASSPATH
++ --StartMode=jvm --StartClass=$env:CASSANDRA_MAIN --StartMethod=main
++ --StopMode=jvm --StopClass=$env:CASSANDRA_MAIN  --StopMethod=stop
++ ++JvmOptions=$env:JVM_OPTS ++JvmOptions=-DCassandra
++ --PidFile "$pidfile"
++"@
++    $args = $args -replace [Environment]::NewLine, ""
++    $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList $args -PassThru -WindowStyle Hidden
++
++    echo "Setting KeepAliveTimer to 5 minutes for TCP keepalive"
++    Set-ItemProperty -Path $regPath -Name KeepAliveTime -Value 300000
++
++    echo "Installation of [$SERVICE_JVM] is complete"
++}
++
++#-----------------------------------------------------------------------------
++Function RunCassandra([string]$foreground)
++{
++    echo "Starting cassandra server"
++    $cmd = @"
++$env:JAVA_BIN
++"@
++    $arg1 = $env:CASSANDRA_PARAMS
++    $arg2 = $env:JVM_OPTS
++    $arg3 = "-cp $env:CLASSPATH"
++    $arg4 = @"
++"$env:CASSANDRA_MAIN"
++"@
++
++    $proc = $null
++
++    if ($verbose)
++    {
++        echo "Running cassandra with: [$cmd $arg1 $arg2 $arg3 $arg4]"
++    }
++
++    if ($foreground -ne "False")
++    {
++        $cygwin = $false
++        try
++        {
++            $uname = uname -o
++            $cygwin = $true
++        }
++        catch
++        {
++            # Failed at uname call, not in cygwin
++        }
++
++        if ($cygwin)
++        {
++            # if running on cygwin, we cannot capture ctrl+c signals as mintty traps them and then
++            # SIGKILLs processes, so we'll need to record our $pidfile file for future
++            # stop-server usage
++            if (!$p)
++            {
++                $arg2 = $arg2 + " -Dcassandra-pidfile=$pidfile"
++            }
++        }
++
++        $arg2 = $arg2 + " -Dcassandra-foreground=yes"
++
++        $pinfo = New-Object System.Diagnostics.ProcessStartInfo
++        $pinfo.FileName = "$env:JAVA_BIN"
++        $pinfo.RedirectStandardInput = $true
++        $pinfo.UseShellExecute = $false
++        $pinfo.Arguments = $arg1,$arg2,$arg3,$arg4
++        $p = New-Object System.Diagnostics.Process
++        $p.StartInfo = $pinfo
++        $p.Start() | Out-Null
++        echo $p.Id > $pidfile
++        $p.WaitForExit()
++    }
++    else
++    {
++        $proc = Start-Process -FilePath "$cmd" -ArgumentList $arg1,$arg2,$arg3,$arg4 -PassThru -WindowStyle Hidden
++
++        $exitCode = $?
++
++        try
++        {
++            echo $proc.Id > $pidfile
++        }
++        catch
++        {
++            echo @"
++WARNING! Failed to write pidfile to $pidfile.  stop-server.bat and
++    startup protection will not be available.
++"@
++            exit 1
++        }
++
++        if (-Not $exitCode)
++        {
++            exit 1
++        }
++    }
++}
++
++#-----------------------------------------------------------------------------
++Main
++||||||| merged common ancestors
++#
++# Licensed to the Apache Software Foundation (ASF) under one or more
++# contributor license agreements.  See the NOTICE file distributed with
++# this work for additional information regarding copyright ownership.
++# The ASF licenses this file to You under the Apache License, Version 2.0
+ # (the "License"); you may not use this file except in compliance with
+ # the License.  You may obtain a copy of the License at
+ #
+ #     http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ param (
+     [switch]$install,
+     [switch]$uninstall,
+     [switch]$help,
+     [switch]$verbose,
+     [switch]$f,
+     [string]$p,
+     [string]$H,
+     [string]$E
+ )
+ 
+ $pidfile = "pid.txt"
+ 
+ #-----------------------------------------------------------------------------
+ Function ValidateArguments
+ {
+     if ($install -and $uninstall)
+     {
+         exit
+     }
+     if ($help)
+     {
+         PrintUsage
+     }
+ }
+ 
+ #-----------------------------------------------------------------------------
+ Function PrintUsage
+ {
+     echo @"
+ usage: cassandra.ps1 [-f] [-h] [-p pidfile] [-H dumpfile] [-E errorfile] [-install | -uninstall] [-help]
+     -f              Run cassandra in foreground
+     -install        install cassandra as a service
+     -uninstall      remove cassandra service
+     -p              pidfile tracked by server and removed on close (defaults to pid.txt)
+     -H              change JVM HeapDumpPath
+     -E              change JVM ErrorFile
+     -help           print this message
+     -verbose        Show detailed command-line parameters for cassandra run
+ 
+     NOTE: installing cassandra as a service requires Commons Daemon Service Runner
+         available at http://commons.apache.org/proper/commons-daemon/"
+ "@
+     exit
+ }
+ 
+ #-----------------------------------------------------------------------------
+ # Note: throughout these scripts we're replacing \ with /.  This allows clean
+ # operation on both command-prompt and cygwin-based environments.
+ Function Main
+ {
+     ValidateArguments
+ 
+     # support direct run of .ps1 file w/out batch file
+     if ($env:CASSANDRA_HOME -eq $null)
+     {
+         $scriptDir = Split-Path $script:MyInvocation.MyCommand.Path
+         $env:CASSANDRA_HOME = (Get-Item $scriptDir).parent.FullName
+     }
+     . "$env:CASSANDRA_HOME\bin\source-conf.ps1"
+ 
+     $conf = Find-Conf
+     if ($verbose)
+     {
+         echo "Sourcing cassandra config file: $conf"
+     }
+     . $conf
+ 
+     SetCassandraEnvironment
+     $pidfile = "$env:CASSANDRA_HOME\$pidfile"
+ 
+     $logdir = "$env:CASSANDRA_HOME/logs"
+     $storagedir = "$env:CASSANDRA_HOME/data"
+     $env:CASSANDRA_PARAMS = $env:CASSANDRA_PARAMS + " -Dcassandra.logdir=""$logdir"" -Dcassandra.storagedir=""$storagedir"""
+ 
+     # Other command line params
+     if ($H)
+     {
+         $env:JVM_OPTS = $env:JVM_OPTS + " -XX:HeapDumpPath=$H"
+     }
+     if ($E)
+     {
+         $env:JVM_OPTS = $env:JVM_OPTS + " -XX:ErrorFile=$E"
+     }
+     if ($p)
+     {
+         $pidfile = "$p"
+         $env:CASSANDRA_PARAMS = $env:CASSANDRA_PARAMS + ' -Dcassandra-pidfile="' + "$pidfile" + '"'
+     }
+ 
+     if ($install -or $uninstall)
+     {
+         HandleInstallation
+     }
+     else
+     {
+         RunCassandra($f)
+     }
+ }
+ 
+ #-----------------------------------------------------------------------------
+ Function HandleInstallation
+ {
+     $SERVICE_JVM = """cassandra"""
+     $PATH_PRUNSRV = "$env:CASSANDRA_HOME\bin\daemon"
+     $PR_LOGPATH = $serverPath
+ 
+     if (-Not (Test-Path $PATH_PRUNSRV\prunsrv.exe))
+     {
+         Write-Warning "Cannot find $PATH_PRUNSRV\prunsrv.exe.  Please download package from http://www.apache.org/dist/commons/daemon/binaries/windows/ to install as a service."
+         Break
+     }
+ 
+     If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
+     {
+         Write-Warning "Cannot perform installation without admin credentials.  Please re-run as administrator."
+         Break
+     }
+     if (!$env:PRUNSRV)
+     {
+         $env:PRUNSRV="$PATH_PRUNSRV\prunsrv"
+     }
+ 
+     $regPath = "HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\"
+ 
+     echo "Attempting to delete existing $SERVICE_JVM service..."
+     Start-Sleep -s 2
+     $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//DS//$SERVICE_JVM" -PassThru -WindowStyle Hidden
+ 
+     echo "Reverting to default TCP keepalive settings (2 hour timeout)"
+     Remove-ItemProperty -Path $regPath -Name KeepAliveTime -EA SilentlyContinue
+ 
+     # Quit out if this is uninstall only
+     if ($uninstall)
+     {
+         return
+     }
+ 
+     echo "Installing [$SERVICE_JVM]."
+     Start-Sleep -s 2
+     $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//IS//$SERVICE_JVM" -PassThru -WindowStyle Hidden
+ 
+     echo "Setting launch parameters for [$SERVICE_JVM]"
+     Start-Sleep -s 2
+ 
+     # Change delim from " -" to ";-" in JVM_OPTS for prunsrv
+     $env:JVM_OPTS = $env:JVM_OPTS -replace " -", ";-"
+     $env:JVM_OPTS = $env:JVM_OPTS -replace " -", ";-"
+ 
+     # Strip off leading ; if it's there
+     $env:JVM_OPTS = $env:JVM_OPTS.TrimStart(";")
+ 
+     # Broken multi-line for convenience - glued back together in a bit
+     $args = @"
+ //US//$SERVICE_JVM
+  --Jvm=auto --StdOutput auto --StdError auto
+  --Classpath=$env:CLASSPATH
+  --StartMode=jvm --StartClass=$env:CASSANDRA_MAIN --StartMethod=main
+  --StopMode=jvm --StopClass=$env:CASSANDRA_MAIN  --StopMethod=stop
+  ++JvmOptions=$env:JVM_OPTS ++JvmOptions=-DCassandra
+  --PidFile "$pidfile"
+ "@
+     $args = $args -replace [Environment]::NewLine, ""
+     $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList $args -PassThru -WindowStyle Hidden
+ 
+     echo "Setting KeepAliveTimer to 5 minutes for TCP keepalive"
+     Set-ItemProperty -Path $regPath -Name KeepAliveTime -Value 300000
+ 
+     echo "Installation of [$SERVICE_JVM] is complete"
+ }
+ 
+ #-----------------------------------------------------------------------------
+ Function RunCassandra([string]$foreground)
+ {
+     echo "Starting cassandra server"
+     $cmd = @"
+ $env:JAVA_BIN
+ "@
+     $arg1 = $env:JVM_OPTS
+     $arg2 = $env:CASSANDRA_PARAMS
+     $arg3 = "-cp $env:CLASSPATH"
+     $arg4 = @"
+ "$env:CASSANDRA_MAIN"
+ "@
+ 
+     $proc = $null
+ 
+     if ($verbose)
+     {
+         echo "Running cassandra with: [$cmd $arg1 $arg2 $arg3 $arg4]"
+     }
+ 
+     if ($foreground -ne "False")
+     {
+         $cygwin = $false
+         try
+         {
+             $uname = uname -o
+             $cygwin = $true
+         }
+         catch
+         {
+             # Failed at uname call, not in cygwin
+         }
+ 
+         if ($cygwin)
+         {
+             # if running on cygwin, we cannot capture ctrl+c signals as mintty traps them and then
+             # SIGKILLs processes, so we'll need to record our $pidfile file for future
+             # stop-server usage
+             if (!$p)
+             {
+                 $arg2 = $arg2 + " -Dcassandra-pidfile=$pidfile"
+             }
+         }
+ 
+         $arg2 = $arg2 + " -Dcassandra-foreground=yes"
+ 
+         $pinfo = New-Object System.Diagnostics.ProcessStartInfo
+         $pinfo.FileName = "$env:JAVA_BIN"
+         $pinfo.RedirectStandardInput = $true
+         $pinfo.UseShellExecute = $false
+         $pinfo.Arguments = $arg1,$arg2,$arg3,$arg4
+         $p = New-Object System.Diagnostics.Process
+         $p.StartInfo = $pinfo
+         $p.Start() | Out-Null
+         echo $p.Id > $pidfile
+         $p.WaitForExit()
+     }
+     else
+     {
+         $proc = Start-Process -FilePath "$cmd" -ArgumentList $arg1,$arg2,$arg3,$arg4 -PassThru -WindowStyle Hidden
+ 
+         $exitCode = $?
+ 
+         try
+         {
+             echo $proc.Id > $pidfile
+         }
+         catch
+         {
+             echo @"
+ WARNING! Failed to write pidfile to $pidfile.  stop-server.bat and
+     startup protection will not be available.
+ "@
+             exit 1
+         }
+ 
+         if (-Not $exitCode)
+         {
+             exit 1
+         }
+     }
+ }
+ 
+ #-----------------------------------------------------------------------------
+ Main