Browse Source

Merge remote-tracking branch 'upstream/master' into round7-python-update

Conflicts:
	installer.py
INADA Naoki 12 years ago
parent
commit
f56f15eeeb

+ 8 - 10
aspnet/README.md

@@ -18,12 +18,12 @@
 **Platforms**
 
 * .NET Framework 4.5 (Windows)
-* Mono 3.0.10 (Linux)
+* Mono 3.2.1 (Linux)
 
 **Web Servers**
 
 * IIS 8 (Windows)
-* XSP 2.11.0.0 (3.0?) (Linux)
+* XSP latest (Linux)
 * nginx 1.4.1 & XSP FastCGI (Linux)
 
 **Web Stack**
@@ -34,22 +34,21 @@
 **Databases**
 
 * MySQL Connector/Net 6.7.2-beta ([custom build](https://github.com/pdonald/mysql-connector-net))
-* Npgsql 2.0.12 ([custom build](https://github.com/pdonald/Npgsql2))
-* Entity Framework 6.0.0-alpha3
-* Mongo C# Driver 1.8.1
-* SqlClient Data Provider for SQL Server
+* Npgsql 2.0.13-beta1
+* Entity Framework 6.0.0-beta1
+* Mongo C# Driver 1.8.2
 
 **Developer Tools**
 
-* Visual Studio 2012 Update 2
+* Visual Studio 2012
 
 ## Mono Installation
 
-    sudo apt-get install build-essential autoconf automake libtool zlib1g-dev git
+    sudo apt-get install git-core build-essential autoconf automake libtool zlib1g-dev pkg-config
 
     git clone git://github.com/mono/mono
     cd mono
-    git checkout mono-3.0.10
+    git checkout mono-3.2.1
     ./autogen.sh --prefix=/usr/local
     make get-monolite-latest
     make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe
@@ -59,7 +58,6 @@
 
     git clone git://github.com/mono/xsp
     cd xsp
-    git checkout 3.0
     ./autogen.sh --prefix=/usr/local
     make
     sudo make install

BIN
aspnet/lib/.nuget/NuGet.exe


+ 2 - 2
aspnet/lib/.nuget/NuGet.targets

@@ -45,7 +45,7 @@
         <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
         
         <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
-        <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
+        <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono $(NuGetExePath)</NuGetCommand>
 
         <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
         
@@ -132,4 +132,4 @@
             </Code>
         </Task>
     </UsingTask>
-</Project>
+</Project>

+ 7 - 7
aspnet/lib/packages.config

@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="EntityFramework" version="6.0.0-alpha3" targetFramework="net45" />
-  <package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targetFramework="net45" />
-  <package id="Microsoft.AspNet.Razor" version="2.0.20715.0" targetFramework="net45" />
-  <package id="Microsoft.AspNet.WebPages" version="2.0.20710.0" targetFramework="net45" />
+  <package id="EntityFramework" version="6.0.0-beta1" targetFramework="net45" />
+  <package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net45" />
+  <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" />
+  <package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net45" />
   <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
   <package id="MSBuild.Microsoft.VisualStudio.Web.targets" version="11.0.2.1" />
-  <package id="mongocsharpdriver" version="1.8.1" targetFramework="net45" />
+  <package id="mongocsharpdriver" version="1.8.2" targetFramework="net45" />
   <package id="MySql.Data.Entity" version="6.7.2-beta-ef6" targetFramework="net45" />
-  <package id="Npgsql.EF6" version="2.0.12-pre4" targetFramework="net45" />
+  <package id="Npgsql" version="2.0.13-beta1" targetFramework="net45" />
   <package id="Newtonsoft.Json" version="5.0.6" targetFramework="net45" />
-  <package id="ServiceStack.Text" version="3.9.48" targetFramework="net45" />
+  <package id="ServiceStack.Text" version="3.9.56" targetFramework="net45" />
 </packages>

+ 13 - 13
aspnet/src/Benchmarks.AspNet.csproj

@@ -45,27 +45,27 @@
     <Reference Include="System.Web.Extensions" />
     <Reference Include="System.Web.Mvc">
       <Private>True</Private>
-      <HintPath>..\lib\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll</HintPath>
+      <HintPath>..\lib\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll</HintPath>
     </Reference>
     <Reference Include="System.Web.Helpers">
       <Private>True</Private>
-      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.Helpers.dll</HintPath>
+      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll</HintPath>
     </Reference>
     <Reference Include="System.Web.Razor">
       <Private>True</Private>
-      <HintPath>..\lib\Microsoft.AspNet.Razor.2.0.20715.0\lib\net40\System.Web.Razor.dll</HintPath>
+      <HintPath>..\lib\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll</HintPath>
     </Reference>
     <Reference Include="System.Web.WebPages">
       <Private>True</Private>
-      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.dll</HintPath>
+      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll</HintPath>
     </Reference>
     <Reference Include="System.Web.WebPages.Deployment">
       <Private>True</Private>
-      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Deployment.dll</HintPath>
+      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll</HintPath>
     </Reference>
     <Reference Include="System.Web.WebPages.Razor">
       <Private>True</Private>
-      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
+      <HintPath>..\lib\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.Web.Infrastructure">
       <Private>True</Private>
@@ -75,15 +75,15 @@
       <HintPath>..\lib\Newtonsoft.Json.5.0.6\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="ServiceStack.Text">
-      <HintPath>..\lib\ServiceStack.Text.3.9.48\lib\net35\ServiceStack.Text.dll</HintPath>
+      <HintPath>..\lib\ServiceStack.Text.3.9.56\lib\net35\ServiceStack.Text.dll</HintPath>
     </Reference>
     <Reference Include="EntityFramework">
       <Private>True</Private>
-      <HintPath>..\lib\EntityFramework.6.0.0-alpha3\lib\net45\EntityFramework.dll</HintPath>
+      <HintPath>..\lib\EntityFramework.6.0.0-beta1\lib\net45\EntityFramework.dll</HintPath>
     </Reference>
     <Reference Include="EntityFramework">
       <Private>True</Private>
-      <HintPath>..\lib\EntityFramework.6.0.0-alpha3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
+      <HintPath>..\lib\EntityFramework.6.0.0-beta1\lib\net45\EntityFramework.SqlServer.dll</HintPath>
     </Reference>
     <Reference Include="MySql">
       <Private>True</Private>
@@ -95,19 +95,19 @@
     </Reference>
     <Reference Include="Npgsql">
       <Private>True</Private>
-      <HintPath>..\lib\Npgsql.EF6.2.0.12-pre4\lib\net45\Npgsql.dll</HintPath>
+      <HintPath>..\lib\Npgsql.2.0.13-beta1\lib\net45\Npgsql.dll</HintPath>
     </Reference>
     <Reference Include="Npgsql">
       <Private>True</Private>
-      <HintPath>..\lib\Npgsql.EF6.2.0.12-pre4\lib\net45\Mono.Security.dll</HintPath>
+      <HintPath>..\lib\Npgsql.2.0.13-beta1\lib\net45\Mono.Security.dll</HintPath>
     </Reference>
     <Reference Include="MongoDB">
       <Private>True</Private>
-      <HintPath>..\lib\mongocsharpdriver.1.8.1\lib\net35\MongoDB.Bson.dll</HintPath>
+      <HintPath>..\lib\mongocsharpdriver.1.8.2\lib\net35\MongoDB.Bson.dll</HintPath>
     </Reference>
     <Reference Include="MongoDB">
       <Private>True</Private>
-      <HintPath>..\lib\mongocsharpdriver.1.8.1\lib\net35\MongoDB.Driver.dll</HintPath>
+      <HintPath>..\lib\mongocsharpdriver.1.8.2\lib\net35\MongoDB.Driver.dll</HintPath>
     </Reference>
   </ItemGroup>
   <ItemGroup>

+ 4 - 4
aspnet/src/Web.config

@@ -16,15 +16,15 @@
     <DbProviderFactories>
       <clear/>
       <add name="MySql.Data.MySqlClient" description="Data Provider for MySQL" invariant="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.7.2.0"/>
-      <add name="Npgsql" description="Data Provider for PostgreSQL" invariant="Npgsql" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0"/>
-      <add name="SqlClient Data Provider" description=".Net Framework Data Provider for SqlServer" invariant="System.Data.SqlClient" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
+      <add name="Npgsql" description="Data Provider for PostgreSQL" invariant="Npgsql" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.13.91"/>
+      <add name="System.Data.SqlClient" description="Data Provider for Microsoft SQL Server" invariant="System.Data.SqlClient" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0"/>
     </DbProviderFactories>
   </system.data>
   <!-- Entity Framework -->
   <entityFramework>
     <providers>
       <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity, Version=6.7.2.0"/>
-      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql, Version=2.0.12.0"/>
+      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql, Version=2.0.13.91"/>
       <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
     </providers>
   </entityFramework>
@@ -59,4 +59,4 @@
       <add name="Framework Benchmarks" type="Benchmarks.AspNet.Application"/>
     </httpModules>
   </system.web>
-</configuration>
+</configuration>

+ 28 - 12
framework_test.py

@@ -10,9 +10,13 @@ class FrameworkTest:
   ##########################################################################################
   # Class variables
   ##########################################################################################
-  headers = "-H 'Host: localhost' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Connection: keep-alive'"
-  headers_full = "-H 'Host: localhost' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) Gecko/20130501 Firefox/30.0 AppleWebKit/600.00 Chrome/30.0.0000.0 Trident/10.0 Safari/600.00' -H 'Cookie: uid=12345678901234567890; __utma=1.1234567890.1234567890.1234567890.1234567890.12; wd=2560x1600' -H 'Connection: keep-alive'"
+  headers_template = "-H 'Host: localhost' -H '{accept}' -H 'Connection: keep-alive'"
+  headers_full_template = "-H 'Host: localhost' -H '{accept}' -H 'Accept-Language: en-US,en;q=0.5' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) Gecko/20130501 Firefox/30.0 AppleWebKit/600.00 Chrome/30.0.0000.0 Trident/10.0 Safari/600.00' -H 'Cookie: uid=12345678901234567890; __utma=1.1234567890.1234567890.1234567890.1234567890.12; wd=2560x1600' -H 'Connection: keep-alive'"
  
+  accept_json = "Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7"
+  accept_html = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+  accept_plaintext = "Accept: text/plain,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7"
+
   concurrency_template = """
     
     echo ""
@@ -215,7 +219,7 @@ class FrameworkTest:
       if self.json_url_passed and (self.benchmarker.type == "all" or self.benchmarker.type == "json"):
         sys.stdout.write("BENCHMARKING JSON ... ") 
         sys.stdout.flush()
-        remote_script = self.__generate_concurrency_script(self.json_url, self.port)
+        remote_script = self.__generate_concurrency_script(self.json_url, self.port, self.accept_json)
         self.__run_benchmark(remote_script, self.benchmarker.output_file(self.name, 'json'))
         results = self.__parse_test('json')
         self.benchmarker.report_results(framework=self, test="json", results=results['results'])
@@ -229,7 +233,7 @@ class FrameworkTest:
       if self.db_url_passed and (self.benchmarker.type == "all" or self.benchmarker.type == "db"):
         sys.stdout.write("BENCHMARKING DB ... ") 
         sys.stdout.flush()
-        remote_script = self.__generate_concurrency_script(self.db_url, self.port)
+        remote_script = self.__generate_concurrency_script(self.db_url, self.port, self.accept_json)
         self.__run_benchmark(remote_script, self.benchmarker.output_file(self.name, 'db'))
         results = self.__parse_test('db')
         self.benchmarker.report_results(framework=self, test="db", results=results['results'])
@@ -243,7 +247,7 @@ class FrameworkTest:
       if self.query_url_passed and (self.benchmarker.type == "all" or self.benchmarker.type == "query"):
         sys.stdout.write("BENCHMARKING Query ... ") 
         sys.stdout.flush()
-        remote_script = self.__generate_query_script(self.query_url, self.port)
+        remote_script = self.__generate_query_script(self.query_url, self.port, self.accept_json)
         self.__run_benchmark(remote_script, self.benchmarker.output_file(self.name, 'query'))
         results = self.__parse_test('query')
         self.benchmarker.report_results(framework=self, test="query", results=results['results'])
@@ -256,7 +260,7 @@ class FrameworkTest:
       if self.fortune_url_passed and (self.benchmarker.type == "all" or self.benchmarker.type == "fortune"):
         sys.stdout.write("BENCHMARKING Fortune ... ") 
         sys.stdout.flush()
-        remote_script = self.__generate_concurrency_script(self.fortune_url, self.port)
+        remote_script = self.__generate_concurrency_script(self.fortune_url, self.port, self.accept_html)
         self.__run_benchmark(remote_script, self.benchmarker.output_file(self.name, 'fortune'))
         results = self.__parse_test('fortune')
         self.benchmarker.report_results(framework=self, test="fortune", results=results['results'])
@@ -269,7 +273,7 @@ class FrameworkTest:
       if self.update_url_passed and (self.benchmarker.type == "all" or self.benchmarker.type == "update"):
         sys.stdout.write("BENCHMARKING Update ... ") 
         sys.stdout.flush()
-        remote_script = self.__generate_query_script(self.update_url, self.port)
+        remote_script = self.__generate_query_script(self.update_url, self.port, self.accept_json)
         self.__run_benchmark(remote_script, self.benchmarker.output_file(self.name, 'update'))
         results = self.__parse_test('update')
         self.benchmarker.report_results(framework=self, test="update", results=results['results'])
@@ -282,7 +286,7 @@ class FrameworkTest:
       if self.plaintext_url_passed and (self.benchmarker.type == "all" or self.benchmarker.type == "plaintext"):
         sys.stdout.write("BENCHMARKING Plaintext ... ") 
         sys.stdout.flush()
-        remote_script = self.__generate_concurrency_script(self.plaintext_url, self.port, wrk_command="wrk-pipeline", intervals=[256,1024,4096,16384], pipeline="--pipeline 16")
+        remote_script = self.__generate_concurrency_script(self.plaintext_url, self.port, self.accept_plaintext, wrk_command="wrk-pipeline", intervals=[256,1024,4096,16384], pipeline="--pipeline 16")
         self.__run_benchmark(remote_script, self.benchmarker.output_file(self.name, 'plaintext'))
         results = self.__parse_test('plaintext')
         self.benchmarker.report_results(framework=self, test="plaintext", results=results['results'])
@@ -449,13 +453,14 @@ class FrameworkTest:
   # specifically works for the variable concurrency tests (JSON
   # and DB)
   ############################################################
-  def __generate_concurrency_script(self, url, port, wrk_command="wrk", intervals=[], pipeline=""):
+  def __generate_concurrency_script(self, url, port, accept_header, wrk_command="wrk", intervals=[], pipeline=""):
     if len(intervals) == 0:
       intervals = self.benchmarker.concurrency_levels
+    headers = self.__get_request_headers(accept_header)
     return self.concurrency_template.format(max_concurrency=self.benchmarker.max_concurrency, 
       max_threads=self.benchmarker.max_threads, name=self.name, duration=self.benchmarker.duration, 
       interval=" ".join("{}".format(item) for item in intervals), 
-      server_host=self.benchmarker.server_host, port=port, url=url, headers=self.headers, wrk=wrk_command,
+      server_host=self.benchmarker.server_host, port=port, url=url, headers=headers, wrk=wrk_command,
       pipeline=pipeline)
   ############################################################
   # End __generate_concurrency_script
@@ -467,15 +472,26 @@ class FrameworkTest:
   # be run on the client to benchmark a single test. This
   # specifically works for the variable query tests (Query)
   ############################################################
-  def __generate_query_script(self, url, port):
+  def __generate_query_script(self, url, port, accept_header):
+    headers = self.__get_request_headers(accept_header)
     return self.query_template.format(max_concurrency=self.benchmarker.max_concurrency, 
       max_threads=self.benchmarker.max_threads, name=self.name, duration=self.benchmarker.duration, 
       interval=" ".join("{}".format(item) for item in self.benchmarker.query_intervals), 
-      server_host=self.benchmarker.server_host, port=port, url=url, headers=self.headers)
+      server_host=self.benchmarker.server_host, port=port, url=url, headers=headers)
   ############################################################
   # End __generate_query_script
   ############################################################
 
+  ############################################################
+  # __get_request_headers(accept_header)
+  # Generates the complete HTTP header string
+  ############################################################
+  def __get_request_headers(self, accept_header):
+    return self.headers_template.format(accept=accept_header)
+  ############################################################
+  # End __format_request_headers
+  ############################################################
+
   ##########################################################################################
   # Constructor
   ##########################################################################################  

+ 1 - 1
installer.ps1

@@ -108,7 +108,7 @@ $file = (cat $php_download_page_file) -join ""
 if ($file -match '(?s)h4 id="php-5.4-nts-VC9-x86".*?href="/downloads/releases/(.*?)">Zip</a>') {
     $php_installer_file = $matches[1]
     $php_installer_url = "http://windows.php.net/downloads/releases/$php_installer_file"
-    Write-Host "Current PHP 5.4 release found at $php_current_release"
+    Write-Host "Current PHP 5.4 release found at $php_installer_url"
 }
 else {
     Write-Host "ERROR: Current PHP release was not found. Aborting."

+ 85 - 52
installer.py

@@ -1,6 +1,7 @@
 import subprocess
 import os
 import time
+import sys
 
 class Installer:
 
@@ -21,6 +22,8 @@ class Installer:
   # __install_server_software
   ############################################################
   def __install_server_software(self):
+    print("\nINSTALL: Installing server software\n")
+
     #######################################
     # Prerequisites
     #######################################
@@ -34,6 +37,24 @@ class Installer:
     self.__run_command("cp ../config/benchmark_profile ../../.bash_profile")
     self.__run_command("sudo sh -c \"echo '*               -    nofile          16384' >> /etc/security/limits.conf\"")
 
+    ##############################################################
+    # System Tools
+    ##############################################################
+
+    #
+    # Leiningen
+    #
+    self.__run_command("mkdir -p bin")
+    self.__run_command("wget https://raw.github.com/technomancy/leiningen/stable/bin/lein")
+    self.__run_command("mv lein bin/lein")
+    self.__run_command("chmod +x bin/lein")
+
+    #
+    # Maven
+    #
+    self.__run_command("sudo apt-get install maven -qq")
+    self.__run_command("mvn -version")
+
     #######################################
     # Languages
     #######################################
@@ -72,16 +93,16 @@ class Installer:
 
     self.__run_command("curl -L get.rvm.io | bash -s head")
     self.__run_command("echo rvm_auto_reload_flag=2 >> ~/.rvmrc")
-    subprocess.call(["bash", "-c", "source ~/.rvm/scripts/'rvm' && rvm install 2.0.0-p0"])
-    subprocess.call(["bash", "-c", "source ~/.rvm/scripts/'rvm' && rvm 2.0.0-p0 do gem install bundler"])
-    subprocess.call(["bash", "-c", "source ~/.rvm/scripts/'rvm' && rvm install jruby-1.7.4"])
-    subprocess.call(["bash", "-c", "source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do gem install bundler"])
+    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm install 2.0.0-p0")
+    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm 2.0.0-p0 do gem install bundler")
+    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm install jruby-1.7.4")
+    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do gem install bundler")
 
     # We need a newer version of jruby-rack
     self.__run_command("git clone git://github.com/jruby/jruby-rack.git")
-    subprocess.call(["bash", "-c", "cd installs/jruby-rack && source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do bundle install"])
-    subprocess.call(["bash", "-c", "cd installs/jruby-rack && source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do jruby -S bundle exec rake clean gem SKIP_SPECS=true"])
-    subprocess.call(["bash", "-c", "cd installs/jruby-rack/target && source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do gem install jruby-rack-1.2.0.SNAPSHOT.gem"])
+    self.__bash_from_string("cd jruby-rack && source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do bundle install")
+    self.__bash_from_string("cd jruby-rack && source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do jruby -S bundle exec rake clean gem SKIP_SPECS=true")
+    self.__bash_from_string("cd jruby-rack/target && source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.4 do gem install jruby-rack-1.2.0.SNAPSHOT.gem")
 
     #
     # go
@@ -150,7 +171,7 @@ class Installer:
     # Mono
     #
     self.__run_command("git clone git://github.com/mono/mono")
-    self.__run_command("git checkout mono-3.0.10", cwd="mono")
+    self.__run_command("git checkout mono-3.2.1", cwd="mono")
     self.__run_command("./autogen.sh --prefix=/usr/local", cwd="mono")
     self.__run_command("make get-monolite-latest", cwd="mono")
     self.__run_command("make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe", cwd="mono")
@@ -159,7 +180,6 @@ class Installer:
     self.__run_command("mozroots --import --sync")
 
     self.__run_command("git clone git://github.com/mono/xsp")
-    self.__run_command("git checkout 3.0", cwd="xsp")
     self.__run_command("./autogen.sh --prefix=/usr/local", cwd="xsp")
     self.__run_command("make", cwd="xsp")
     self.__run_command("sudo make install", cwd="xsp")
@@ -209,39 +229,37 @@ class Installer:
     self.__run_command("cat ../config/resin.xml > resin-4.0.36/conf/resin.xml")
 
     ##############################################################
-    #
     # Frameworks
-    #
     ##############################################################
 
-    ##############################
+    #
     # Grails
-    ##############################
+    #
     self.__run_command("wget http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/grails-2.1.1.zip")
     self.__run_command("unzip -o grails-2.1.1.zip")
     self.__run_command("rm grails-2.1.1.zip")
 
-    ##############################
+    #
     # Play 2
-    ##############################
+    #
     self.__run_command("wget http://downloads.typesafe.com/play/2.1.2-RC1/play-2.1.2-RC1.zip")
     self.__run_command("unzip -o play-2.1.2-RC1.zip")
     self.__run_command("rm play-2.1.2-RC1.zip")
 
-    ##############################
+    #
     # Play 1
-    ##############################
+    #
     self.__run_command("wget http://downloads.typesafe.com/releases/play-1.2.5.zip")
     self.__run_command("unzip -o play-1.2.5.zip")
     self.__run_command("rm play-1.2.5.zip")
     self.__run_command("mv play-1.2.5/play play-1.2.5/play1")
 
     # siena
-    self.__run_command("play-1.2.5/play1 install siena", send_yes=True)
+    self.__run_command("yes | play-1.2.5/play1 install siena")
 
-    ##############################
+    #
     # TreeFrog Framework
-    ##############################
+    #
     self.__run_command("sudo apt-get install qt4-qmake libqt4-dev libqt4-sql-mysql g++", True)
     self.__run_command("wget http://downloads.sourceforge.net/project/treefrog/src/treefrog-1.6.tar.gz")
     self.__run_command("tar xzf treefrog-1.6.tar.gz")
@@ -252,41 +270,23 @@ class Installer:
     self.__run_command("make", cwd="treefrog-1.6/tools")
     self.__run_command("sudo make install", cwd="treefrog-1.6/tools")
 
-    ##############################
+    #
     # Vert.x
-    ##############################
-    self.__run_command("curl http://vert-x.github.io/vertx-downloads/downloads/vert.x-1.3.1.final.tar.gz | tar xvz")
+    #
+    self.__run_command("curl http://vertx.io/vertx-downloads/downloads/vert.x-1.3.1.final.tar.gz | tar xvz")
 
-    ##############################
+    #
     # Yesod
-    ##############################
+    #
     self.__run_command("cabal update")
     self.__run_command("cabal install yesod persistent-mysql")
 
-    ##############################
-    # Jester
-    ##############################
-    self.__run_command("git clone git://github.com/dom96/jester.git jester/jester")
-
-    ##############################################################
     #
-    # System Tools
+    # Jester
     #
-    ##############################################################
-
-    ##############################
-    # Maven
-    ##############################
-    # self.__run_command("sudo apt-get install maven2", send_yes=True)
-    self.__run_command("curl www.us.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz | tar xvz")
+    self.__run_command("git clone git://github.com/dom96/jester.git jester/jester")
 
-    ##############################
-    # Leiningen
-    ##############################
-    self.__run_command("mkdir -p bin")
-    self.__run_command("wget https://raw.github.com/technomancy/leiningen/stable/bin/lein")
-    self.__run_command("mv lein bin/lein")
-    self.__run_command("chmod +x bin/lein")
+    print("\nINSTALL: Finished installing server software\n")
   ############################################################
   # End __install_server_software
   ############################################################
@@ -303,7 +303,7 @@ class Installer:
       if pypy:  self.__run_command(pypy_bin + cmd)
 
     self.__run_command("curl -L http://bitbucket.org/pypy/pypy/downloads/pypy-2.1-linux64.tar.bz2 | tar xj")
-    self.__run_command('ln -s pypy-2.1 pypy')
+    self.__run_command('ln -sf pypy-2.1 pypy')
     self.__run_command("curl -L http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz | tar xz")
     self.__run_command("curl -L http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz | tar xJ")
     self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py2 --disable-shared CC=gcc-4.8", cwd="Python-2.7.5")
@@ -313,7 +313,6 @@ class Installer:
     self.__run_command("make -j", cwd="Python-3.3.2")
     self.__run_command("make install", cwd="Python-3.3.2")
 
-
     self.__run_command("wget https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py")
     self.__run_command(pypy_bin + "/pypy ez_setup.py")
     self.__run_command(python_bin + "/python ez_setup.py")
@@ -357,12 +356,24 @@ class Installer:
     easy_install('bottle==0.11.6', two=True, three=True, pypy=True)
     easy_install('bottle-sqlalchemy==0.4', two=True, three=True, pypy=True)
 
+  ############################################################
+  # __install_error
+  ############################################################
+  def __install_error(self, message):
+    print("\nINSTALL ERROR: %s\n" % message)
+    if self.benchmarker.install_error_action == 'abort':
+      sys.exit("Installation aborted.")
+  ############################################################
+  # End __install_error
+  ############################################################
 
   ############################################################
   # __install_client_software
   ############################################################
   def __install_client_software(self):
-    subprocess.call(self.benchmarker.sftp_string(batch_file="config/client_sftp_batch"), shell=True)
+    print("\nINSTALL: Installing client software\n")
+
+    self.__run_command("cd .. && " + self.benchmarker.sftp_string(batch_file="config/client_sftp_batch"), True)
 
     remote_script = """
 
@@ -444,11 +455,17 @@ class Installer:
     sudo cp -R -p /var/log/mongodb /ssd/log/
     sudo start mongodb
     """
+    
+    print("\nINSTALL: %s" % self.benchmarker.ssh_string)
     p = subprocess.Popen(self.benchmarker.ssh_string.split(" "), stdin=subprocess.PIPE)
     p.communicate(remote_script)
+    returncode = p.returncode
+    if returncode != 0:
+      self.__install_error("status code %s running subprocess '%s'." % (returncode, self.benchmarker.ssh_string))
 
+    print("\nINSTALL: Finished installing client software\n")
   ############################################################
-  # End __parse_results
+  # End __install_client_software
   ############################################################
 
   ############################################################
@@ -460,14 +477,30 @@ class Installer:
     except AttributeError:
       cwd = self.install_dir
 
+    print("\nINSTALL: %s (cwd=%s)" % (command, cwd))
     if send_yes:
-      subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, cwd=cwd).communicate("yes")
+      process = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, cwd=cwd)
+      process.communicate("yes")
+      returncode = process.returncode
     else:
-      subprocess.call(command, shell=True, cwd=cwd)
+      returncode = subprocess.call(command, shell=True, cwd=cwd)
+
+    if returncode != 0:
+      self.__install_error("status code %s running command '%s' in directory '%s'." % (returncode, command, cwd))
   ############################################################
   # End __run_command
   ############################################################
 
+  ############################################################
+  # __bash_from_string
+  # Runs bash -c "command" in install_dir.
+  ############################################################
+  def __bash_from_string(self, command):
+    self.__run_command('bash -c "%s"' % command)
+  ############################################################
+  # End __bash_from_string
+  ############################################################
+
   ############################################################
   # __init__(benchmarker)
   ############################################################

+ 1 - 1
luminus/hello/project.clj

@@ -6,7 +6,7 @@
    [lib-noir "0.6.6"]
    [compojure "1.1.5"]
    [ring-server "0.2.8"]
-   [selmer "0.3.6"]
+   [selmer "0.4.0"]
    [com.taoensso/timbre "1.6.0"]
    [com.postspectacular/rotor "0.1.0"]
    [com.taoensso/tower "1.5.1"]

+ 5 - 0
run-tests.py

@@ -1,11 +1,15 @@
 #!/usr/bin/env python
 import argparse
+import sys
 from benchmarker import Benchmarker
+from unbuffered import Unbuffered
 
 ###################################################################################################
 # Main
 ###################################################################################################
 
+sys.stdout=Unbuffered(sys.stdout)
+
 ##########################################################
 # Set up argument parser
 ##########################################################
@@ -18,6 +22,7 @@ parser.add_argument('-i', dest='identity_file', help='ssh key to ssh from the se
 parser.add_argument('-p', dest='password_prompt', action='store_true')
 parser.add_argument('--install-software', action='store_true', help='runs the installation script before running the rest of the commands')
 parser.add_argument('--install', choices=['client', 'server', 'all'], default='all', help='Allows you to only install the server or client software')
+parser.add_argument('--install-error-action', choices=['abort', 'continue'], default='continue', help='action to take in case of error during installation')
 parser.add_argument('--test', nargs='+', help='names of tests to run')
 parser.add_argument('--exclude', nargs='+', help='names of tests to exclude')
 parser.add_argument('--type', choices=['all', 'json', 'db', 'query', 'fortune', 'update', 'plaintext'], default='all', help='which type of test to run')

BIN
servicestack/src/.nuget/NuGet.exe


+ 1 - 1
servlet/README.md

@@ -8,7 +8,7 @@ For raw Servlets there is no broad consensus on JSON encoding so we have selecte
 * [JSON test source](src/main/java/hello/JsonServlet.java)
 
 ### Data-Store/Database Mapping Test
-* [DB test source](src/main/java/hello/DBServlet.java)
+* [DB test source](src/main/java/hello/DbPoolServlet.java)
 
 ## Infrastructure Software Versions
 The tests were run with:

+ 13 - 0
unbuffered.py

@@ -0,0 +1,13 @@
+# Wrapper for unbuffered stream writing.
+# http://stackoverflow.com/a/107717/376366
+# Used to make sure print output appears in the correct order
+# in log files when spawning subprocesses.
+
+class Unbuffered:
+  def __init__(self, stream):
+    self.stream = stream
+  def write(self, data):
+    self.stream.write(data)
+    self.stream.flush()
+  def __getattr__(self, attr):
+    return getattr(self.stream, attr)