This is an automated email from the ASF dual-hosted git repository.

samt pushed a commit to branch cassandra-3.11
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 87a46c36f0a54c608a01d026a3d7816137fbbb69
Merge: a68a7c5 ad2f41e
Author: Sam Tunnicliffe <[email protected]>
AuthorDate: Tue Apr 27 09:19:29 2021 +0100

    Merge branch 'cassandra-3.0' into cassandra-3.11

 .build/build-rat.xml                               | 100 +++++++++++----------
 build.xml                                          |  32 ++++---
 doc/source/_templates/indexcontent.html            |  16 ++++
 doc/source/_theme/cassandra_theme/defindex.html    |  16 ++++
 doc/source/_theme/cassandra_theme/layout.html      |  16 ++++
 doc/source/_theme/cassandra_theme/search.html      |  16 ++++
 .../org/apache/cassandra/stress/graph/graph.html   |  17 +++-
 7 files changed, 148 insertions(+), 65 deletions(-)

diff --cc .build/build-rat.xml
index cfb3c8b,fd1b0f3..4a6ebfc
--- a/.build/build-rat.xml
+++ b/.build/build-rat.xml
@@@ -38,34 -32,46 +32,46 @@@
          <typedef uri="antlib:org.apache.rat.anttasks" 
classpathref="rat.classpath"/>
      </target>
  
-     <target name="rat-check" depends="_rat_init" if="${rat.enabled}" 
description="License checks on source" >
+     <target name="_build_ratinclude" depends="_rat_init">
+         <exec executable="git" failifexecutionfails="true" failonerror="true" 
output="build/.versioned_files">
+             <arg line="ls-tree -r HEAD --name-only"/>
+         </exec>
+         <copy file="build/.versioned_files" tofile="build/.ratinclude">
+             <filterchain>
+                 <linecontainsregexp>
+                     <regexp 
pattern=".*\.(java|py|sh|xml|spec|md|iml|bat|btm|cql|css|g|html|jflex|jks|mod|name|pom|textile|yml|yaml|MIDRES|HIGHRES|LOWRES)$"/>
+                 </linecontainsregexp>
+             </filterchain>
+         </copy>
+     </target>
+ 
+     <target name="rat-check" depends="_build_ratinclude" unless="${rat.skip}" 
description="License checks on source" >
          <rat:report reportFile="${build.dir}/rat.txt">
-             <fileset dir="."
-                      
includes="**/*.java,**/*.py,**/*.sh,**/.xml,**/*.spec,**/*.md,**/*.iml,**/*.bat,**/*.btm,**/*.cql,**/*.css,**/*.g,**/*.hmtl,**/*.jflex,**/*.jks,**/*.mod,**/*.name,**/*.pom,**/*.textile,**/*.yml,**/*.yaml,**/*.HIGHRES,**/*.LOWRES"
-                      excludesfile=".gitignore">
-                      <!-- Config files with not much creativity -->
-                      <exclude name="**/metrics-reporter-config-sample.yaml"/>
-                      <exclude name="**/cassandra.yaml"/>
-                      <exclude name="**/cassandra-murmur.yaml"/>
-                      <exclude name="**/cassandra-seeds.yaml"/>
-                      <exclude name="**/test/conf/cassandra.yaml"/>
-                      <exclude name="**/test/conf/cassandra_encryption.yaml"/>
-                      <exclude name="**/test/conf/cdc.yaml"/>
-                      <exclude 
name="**/test/conf/commitlog_compression_LZ4.yaml"/>
-                      <exclude 
name="**/test/conf/commitlog_compression_Zstd.yaml"/>
-                      <exclude 
name="**/test/conf/system_keyspaces_directory.yaml"/>
-                      <exclude 
name="**/test/conf/unit-test-conf/test-native-port.yaml"/>
-                      <exclude 
name="**/test/data/jmxdump/cassandra-3.0-jmx.yaml"/>
-                      <exclude 
name="**/test/data/jmxdump/cassandra-3.11-jmx.yaml"/>
-                      <exclude 
name="**/test/data/jmxdump/cassandra-4.0-jmx.yaml"/>
-                      <exclude name="**/tools/cqlstress-counter-example.yaml"/>
-                      <exclude name="**/tools/cqlstress-example.yaml"/>
-                      <exclude 
name="**/tools/cqlstress-insanity-example.yaml"/>
-                      <exclude name="**/tools/cqlstress-lwt-example.yaml"/>
-                      <!-- NOTICE files -->
-                      <exclude NAME="**/NOTICE.md"/>
-                      <!-- LICENSE files -->
-                      <exclude NAME="**/LICENSE.md"/>
+             <fileset dir="." includesfile="build/.ratinclude">
 -                <!-- Config files with not much creativity -->
 -                <exclude name="**/ide/**/*"/>
 -                <exclude name="**/metrics-reporter-config-sample.yaml"/>
 -                <exclude name="**/cassandra.yaml"/>
 -                <exclude name="**/cassandra-murmur.yaml"/>
 -                <exclude name="**/cassandra-seeds.yaml"/>
 -                <exclude name="**/test/conf/cassandra.yaml"/>
 -                <exclude name="**/test/conf/cassandra_encryption.yaml"/>
 -                <exclude name="**/test/conf/cdc.yaml"/>
 -                <exclude name="**/test/conf/commitlog_compression_LZ4.yaml"/>
 -                <exclude name="**/test/conf/commitlog_compression_Zstd.yaml"/>
 -                <exclude name="**/test/conf/system_keyspaces_directory.yaml"/>
 -                <exclude 
name="**/test/conf/unit-test-conf/test-native-port.yaml"/>
 -                <exclude name="**/test/data/jmxdump/cassandra-3.0-jmx.yaml"/>
 -                <exclude name="**/test/data/jmxdump/cassandra-3.11-jmx.yaml"/>
 -                <exclude name="**/test/data/jmxdump/cassandra-4.0-jmx.yaml"/>
 -                <exclude name="**/tools/cqlstress-counter-example.yaml"/>
 -                <exclude name="**/tools/cqlstress-example.yaml"/>
 -                <exclude name="**/tools/cqlstress-insanity-example.yaml"/>
 -                <exclude name="**/tools/cqlstress-lwt-example.yaml"/>
 -                <!-- NOTICE files -->
 -                <exclude NAME="**/NOTICE.md"/>
 -                <!-- LICENSE files -->
 -                <exclude NAME="**/LICENSE.md"/>
++                 <!-- Config files with not much creativity -->
++                 <exclude name="**/ide/**/*"/>
++                 <exclude name="**/metrics-reporter-config-sample.yaml"/>
++                 <exclude name="**/cassandra.yaml"/>
++                 <exclude name="**/cassandra-murmur.yaml"/>
++                 <exclude name="**/cassandra-seeds.yaml"/>
++                 <exclude name="**/test/conf/cassandra.yaml"/>
++                 <exclude name="**/test/conf/cassandra_encryption.yaml"/>
++                 <exclude name="**/test/conf/cdc.yaml"/>
++                 <exclude name="**/test/conf/commitlog_compression_LZ4.yaml"/>
++                 <exclude 
name="**/test/conf/commitlog_compression_Zstd.yaml"/>
++                 <exclude 
name="**/test/conf/system_keyspaces_directory.yaml"/>
++                 <exclude 
name="**/test/conf/unit-test-conf/test-native-port.yaml"/>
++                 <exclude name="**/test/data/jmxdump/cassandra-3.0-jmx.yaml"/>
++                 <exclude 
name="**/test/data/jmxdump/cassandra-3.11-jmx.yaml"/>
++                 <exclude name="**/test/data/jmxdump/cassandra-4.0-jmx.yaml"/>
++                 <exclude name="**/tools/cqlstress-counter-example.yaml"/>
++                 <exclude name="**/tools/cqlstress-example.yaml"/>
++                 <exclude name="**/tools/cqlstress-insanity-example.yaml"/>
++                 <exclude name="**/tools/cqlstress-lwt-example.yaml"/>
++                 <!-- NOTICE files -->
++                 <exclude NAME="**/NOTICE.md"/>
++                 <!-- LICENSE files -->
++                 <exclude NAME="**/LICENSE.md"/>
              </fileset>
          </rat:report>
          <exec executable="grep" outputproperty="rat.failed.files" 
failifexecutionfails="false">
diff --cc doc/source/_templates/indexcontent.html
index a95191c,0000000..eaaaca5
mode 100644,000000..100644
--- a/doc/source/_templates/indexcontent.html
+++ b/doc/source/_templates/indexcontent.html
@@@ -1,75 -1,0 +1,91 @@@
++<!--
++  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.
++-->
 +{% extends "layout.html" %}
 +{%- block htmltitle -%}
 +<title>{{ html_title }}</title>
 +{%- endblock -%}
 +{% block body %}
 +  <h1>{{ docstitle|e }}</h1>
 +  <p>
 +  {% trans %}Welcome! This is the documentation for Apache Cassandra {{ 
version }}.{% endtrans %}
 +  </p>
 +<div id="wipwarning">This documentation is a work-in-progress.
 +    <a href="{{ pathto("bugs") }}">Contributions</a> are welcome.</div>
 +
 +<h3>Main documentation</h3>
 +
 +<table class="contentstable doc-landing-table" align="center">
 +  <tr>
 +    <td class="left-column">
 +      <p class="biglink"><a class="biglink" href="{{ 
pathto("getting_started/index") }}">{% trans %}Getting started{% endtrans 
%}</a><br/>
 +      <span class="linkdescr">{% trans %}Newbie friendly starting point{% 
endtrans %}</span></p>
 +    </td>
 +    <td class="right-column">
 +      <p class="biglink"><a class="biglink" href="{{ 
pathto("operating/index") }}">{% trans %}Operating Cassandra{% endtrans 
%}</a><br/>
 +      <span class="linkdescr">{% trans %}The operator's corner{% endtrans 
%}</span></p>
 +    </td>
 +  </tr>
 +  <tr>
 +    <td class="left-column">
 +      <p class="biglink"><a class="biglink" href="{{ 
pathto("architecture/index") }}">{% trans %}Cassandra Architecture{% endtrans 
%}</a><br/>
 +      <span class="linkdescr">{% trans %}Cassandra's big picture{% endtrans 
%}</span></p>
 +    </td>
 +    <td class="right-column">
 +      <p class="biglink"><a class="biglink" href="{{ pathto("tools/index") 
}}">{% trans %}Cassandra's Tools{% endtrans %}</a><br/>
 +      <span class="linkdescr">{% trans %}cqlsh, nodetool, ...{% endtrans 
%}</span></p>
 +    </td>
 +  </tr>
 +  <tr>
 +    <td class="left-column">
 +      <p class="biglink"><a class="biglink" href="{{ 
pathto("data_modeling/index") }}">{% trans %}Data Modeling{% endtrans 
%}</a><br/>
 +      <span class="linkdescr">{% trans %}Or how to make square pegs fit round 
holes{% endtrans %}</span></p>
 +    </td>
 +    <td class="right-column">
 +      <p class="biglink"><a class="biglink" href="{{ 
pathto("troubleshooting/index") }}">{% trans %}Troubleshooting{% endtrans 
%}</a><br/>
 +      <span class="linkdescr">{% trans %}What to look for when you have a 
problem{% endtrans %}</span></p>
 +    </td>
 +  </tr>
 +  <tr>
 +    <td class="left-column">
 +      <p class="biglink"><a class="biglink" href="{{ pathto("cql/index") 
}}">{% trans %}Cassandra Query Language{% endtrans %}</a><br/>
 +      <span class="linkdescr">{% trans %}CQL reference documentation{% 
endtrans %}</span></p>
 +    </td>
 +    <td class="right-column">
 +      <p class="biglink"><a class="biglink" href="{{ 
pathto("development/index") }}">{% trans %}Cassandra Development{% endtrans 
%}</a><br/>
 +      <span class="linkdescr">{% trans %}Learn how to improve Cassandra and 
contribute patches{% endtrans %}</span></p>
 +    </td>
 +  </tr>
 +  <tr>
 +    <td class="left-column">
 +      <p class="biglink"><a class="biglink" href="{{ pathto("faq/index") 
}}">{% trans %}FAQs{% endtrans %}</a><br/>
 +      <span class="linkdescr">{% trans %}Frequently Asked Questions (with 
answers!){% endtrans %}</span></p>
 +    </td>
 +    <td class="right-column">
 +      <p class="biglink"><a class="biglink" href="{{ 
pathto("configuration/index") }}">{% trans %}Configuration{% endtrans 
%}</a><br/>
 +      <span class="linkdescr">{% trans %}Cassandra's handles and knobs{% 
endtrans %}</span></p>
 +    </td>
 +  </tr>
 +</table>
 +
 +<h3>Meta informations</h3>
 +
 +<ul>
 +  <li><a class="biglink" href="{{ pathto("bugs") }}">{% trans %}Reporting 
bugs{% endtrans %}</a></li>
 +  <li><a class="biglink" href="{{ pathto("contactus") }}">{% trans %}Contact 
us{% endtrans %}</a></li>
 +</ul>
 +
 +{% endblock %}
diff --cc doc/source/_theme/cassandra_theme/defindex.html
index 1809332,0000000..a7bd5b8
mode 100644,000000..100644
--- a/doc/source/_theme/cassandra_theme/defindex.html
+++ b/doc/source/_theme/cassandra_theme/defindex.html
@@@ -1,25 -1,0 +1,41 @@@
++<!--
++  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
++  limitatins under the License.
++-->
 +---
 +layout: doclandingpage
 +title: "Documentation"
 +is_homepage: false
 +is_sphinx_doc: false
 +---
 +{% block body %}
 +  <h2>{{ docstitle|e }}</h2>
 +  {% block tables %}
 +  <p><strong>{{ _('Indices and tables:') }}</strong></p>
 +  <table class="contentstable" align="center"><tr>
 +    <td width="50%">
 +      <p class="biglink"><a class="biglink" href="{{ pathto("contents") 
}}">{{ _('Complete Table of Contents') }}</a><br>
 +         <span class="linkdescr">{{ _('lists all sections and subsections') 
}}</span></p>
 +      <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">{{ 
_('Search Page') }}</a><br>
 +         <span class="linkdescr">{{ _('search this documentation') 
}}</span></p>
 +    </td><td width="50%">
 +      <p class="biglink"><a class="biglink" href="{{ pathto("modindex") 
}}">{{ _('Global Module Index') }}</a><br>
 +         <span class="linkdescr">{{ _('quick access to all modules') 
}}</span></p>
 +      <p class="biglink"><a class="biglink" href="{{ pathto("genindex") 
}}">{{ _('General Index') }}</a><br>
 +         <span class="linkdescr">{{ _('all functions, classes, terms') 
}}</span></p>
 +    </td></tr>
 +  </table>
 +  {% endblock %}
 +{% endblock %}
diff --cc doc/source/_theme/cassandra_theme/layout.html
index 186e043,0000000..69363cc
mode 100644,000000..100644
--- a/doc/source/_theme/cassandra_theme/layout.html
+++ b/doc/source/_theme/cassandra_theme/layout.html
@@@ -1,93 -1,0 +1,109 @@@
++<!--
++  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.
++-->
 +---
 +layout: docpage
 +{% block title %}
 +title: "Documentation"
 +{% endblock%}
 +is_homepage: false
 +is_sphinx_doc: true
 +{% for doc in parents %}
 +doc-parent: "{{ doc.title }}"
 +{% endfor %}
 +doc-title: "{{ title }}"
 +doc-header-links: '
 +  <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}"/>
 +  {%- if parents %}
 +      <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ 
parents[-1].link|e }}"/>
 +  {%- endif %}
 +  {%- if next %}
 +      <link rel="next" title="{{ next.title|striptags|e }}" href="{{ 
next.link|e }}"/>
 +  {%- endif %}
 +  {%- if prev %}
 +      <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ 
prev.link|e }}"/>
 +  {%- endif %}
 +'
 +doc-search-path: "{{ pathto('search') }}"
 +{% block extrafooter %}
 +extra-footer: '
 +<script type="text/javascript">
 +    var DOCUMENTATION_OPTIONS = {
 +      URL_ROOT:    "{{ url_root }}",
 +      VERSION:     "{{ release|e }}",
 +      COLLAPSE_INDEX: false,
 +      FILE_SUFFIX: "{{ "" if no_search_suffix else file_suffix }}",
 +      HAS_SOURCE:  false,
 +      SOURCELINK_SUFFIX: "{{ sourcelink_suffix }}"
 +    };
 +</script>
 +'
 +{% endblock %}
 +---
 +<div class="container-fluid">
 +  <div class="row">
 +    <div class="col-md-3">
 +      <div class="doc-navigation">
 +        <div class="doc-menu" role="navigation">
 +          <div class="navbar-header">
 +            <button type="button" class="pull-left navbar-toggle" 
data-toggle="collapse" data-target=".sidebar-navbar-collapse">
 +              <span class="sr-only">Toggle navigation</span>
 +              <span class="icon-bar"></span>
 +              <span class="icon-bar"></span>
 +              <span class="icon-bar"></span>
 +            </button>
 +          </div>
 +          <div class="navbar-collapse collapse sidebar-navbar-collapse">
 +            <form id="doc-search-form" class="navbar-form" action="{{ 
pathto('search') }}" method="get" role="search">
 +              <div class="form-group">
 +                <input type="text" size="30" class="form-control input-sm" 
name="q" placeholder="Search docs">
 +                <input type="hidden" name="check_keywords" value="yes" />
 +                <input type="hidden" name="area" value="default" />
 +              </div>
 +            </form>
 +            {% block menu %}
 +            {% set toctree = toctree(maxdepth=3, collapse=True, 
includehidden=True) %}
 +            {% if toctree %}
 +            {{ toctree }}
 +            {% else %}
 +            <!-- Local TOC -->
 +            <div class="local-toc">{{ toc }}</div>
 +            {% endif %}
 +            {% endblock %}
 +          </div><!--/.nav-collapse -->
 +        </div>
 +      </div>
 +    </div>
 +    <div class="col-md-8">
 +      <div class="content doc-content">
 +        <div class="content-container">
 +          {% block body %}{% endblock %}
 +
 +          {% if next or prev %}
 +          <div class="doc-prev-next-links" role="navigation" 
aria-label="footer navigation">
 +            {% if next %}
 +            <a href="{{ next.link|e }}" class="btn btn-default pull-right " 
role="button" title="{{ next.title|striptags|e }}" accesskey="n">Next <span 
class="glyphicon glyphicon-circle-arrow-right" aria-hidden="true"></span></a>
 +            {% endif %}
 +            {% if prev %}
 +            <a href="{{ prev.link|e }}" class="btn btn-default" role="button" 
title="{{ prev.title|striptags|e }}" accesskey="p"><span class="glyphicon 
glyphicon-circle-arrow-left" aria-hidden="true"></span> Previous</a>
 +            {% endif %}
 +          </div>
 +          {% endif %}
 +        </div>
 +      </div>
 +    </div>
 +  </div>
 +</div>
diff --cc doc/source/_theme/cassandra_theme/search.html
index d5e26a9,0000000..1a4bff5
mode 100644,000000..100644
--- a/doc/source/_theme/cassandra_theme/search.html
+++ b/doc/source/_theme/cassandra_theme/search.html
@@@ -1,53 -1,0 +1,69 @@@
++<!--
++  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.
++-->
 +{%- extends "layout.html" %}
 +{% block title %}
 +title: "{{_('Search')}}"
 +{% endblock %}
 +{% block extrafooter %}
 +extra-footer: '
 +  <script type="text/javascript">
 +    var DOCUMENTATION_OPTIONS = {
 +      URL_ROOT:    "{{ url_root }}",
 +      VERSION:     "{{ release|e }}",
 +      COLLAPSE_INDEX: false,
 +      FILE_SUFFIX: "{{ "" if no_search_suffix else file_suffix }}",
 +      HAS_SOURCE:  false,
 +      SOURCELINK_SUFFIX: "{{ sourcelink_suffix }}"
 +    };
 +  </script>
 +  <script type="text/javascript">
 +    jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) 
}}"); });
 +  </script>
 +  {# this is used when loading the search index using $.ajax fails,
 +     such as on Chrome for documents on localhost #}
 +  <script type="text/javascript" id="searchindexloader"></script>
 +'
 +{% endblock %}
 +{% block body %}
 +  <noscript>
 +  <div id="fallback" class="admonition warning">
 +    <p class="last">
 +      {% trans %}Please activate JavaScript to enable the search
 +      functionality.{% endtrans %}
 +    </p>
 +  </div>
 +  </noscript>
 +
 +  {% if search_performed %}
 +    <h2>{{ _('Search Results') }}</h2>
 +    {% if not search_results %}
 +      <p>{{ _('Your search did not match any documents. Please make sure that 
all words are spelled correctly.') }}</p>
 +    {% endif %}
 +  {% endif %}
 +  <div id="search-results">
 +  {% if search_results %}
 +    <ul>
 +    {% for href, caption, context in search_results %}
 +      <li>
 +        <a href="{{ pathto(item.href) }}">{{ caption }}</a>
 +        <p class="context">{{ context|e }}</p>
 +      </li>
 +    {% endfor %}
 +    </ul>
 +  {% endif %}
 +  </div>
 +{% endblock %}
diff --cc 
tools/stress/src/resources/org/apache/cassandra/stress/graph/graph.html
index 86bedfc,0000000..e75a06d
mode 100644,000000..100644
--- a/tools/stress/src/resources/org/apache/cassandra/stress/graph/graph.html
+++ b/tools/stress/src/resources/org/apache/cassandra/stress/graph/graph.html
@@@ -1,658 -1,0 +1,673 @@@
 +<!DOCTYPE html>
++<!--
++  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
++  limitatins under the License.
++-->
 +<!-- cstar_perf (https://github.com/datastax/cstar_perf) graphing
 +utility adapted for use directly with command line cassandra-stress -->
 +
 +<head>
 +  <meta charset="utf-8">
 +  <script language="javascript" type="text/javascript">
 +    <!--
 +
 +/* stats start */
 +
 +/* stats end */
 +
 +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | 
jquery.org/license */
 +!function(a,b){"object"==typeof module&&"object"==typeof 
module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw
 new Error("jQuery requires a window with a document");return 
b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var 
c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return
 new 
m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,
 [...]
 +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return 
k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof
 b||"function"==typeof 
b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void
 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof 
b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function 
R(a,b,c){if(m.acceptData(a)){var 
d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b& [...]
 +},cur:function(){var a=Zb.propHooks[this.prop];return 
a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var 
b,c=Zb.propHooks[this.prop];return 
this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.pro
 [...]
 +
 +
 +
 +/** d3js **/
 +!function(){function n(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function 
t(n){return null!=n&&!isNaN(n)}function 
e(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var
 i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return 
r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var
 i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function r(n){return 
n.length}function u(n){for(var t=1;n*t%1;)t*=10;return t}function i(n,t) [...]
 +return t.precision=function(n){return 
arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function Ge(n){var 
t=Je(function(t,e){return n([t*Ca,e*Ca])});return function(n){return 
er(t(n))}}function Ke(n){this.stream=n}function 
Qe(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function
 nr(n){return tr(function(){return n})()}function tr(n [...]
 +return o>=1?(i.event&&i.event.end.call(n,l,t),s()):void 0}function 
s(){return--u.count?delete u[e]:delete n.__transition__,1}var 
l=n.__data__,f=i.ease,h=i.delay,g=i.duration,p=Ba,v=[];return 
p.t=h+a,r>=h?o(r-h):(p.c=o,void 0)},0,a)}}function 
Uo(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function 
jo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function 
Ho(n){return n.toISOString()}function Fo(n,t,e){function r(t){return 
n(t)}function u(n,e) [...]
 +for(var 
o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return
 
x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Zo.geo.centroid=function(n){hc=gc=pc=vc=dc=mc=yc=xc=Mc=_c=bc=0,Zo.geo.stream(n,wc);var
 t=Mc,e=_c,r=bc,u=t*t+e*e+r*r;return 
Ea>u&&(t=mc,e=yc,r=xc,ka>gc&&(t=pc,e=vc,r=dc),u=t*t+e*e+r*r,Ea>u)?[0/0,0/0]:[Math.atan2(e,t)*Ca,G(r/Math.sqrt(u))*Ca]};var
 hc,gc,pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc={sphere:v,point:ye,lineStart:Me,l [...]
 +return c>=ys?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 
0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 
0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 
0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 
"+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 
"+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 
"+i*h+","+i*g+"L0,0"+"Z"}var t=Qi,e=no,r=to,u=eo;return 
n.innerRadius=function(e){return arguments.length?(t=bt(e),n):t},n.outerRad 
[...]
 +
 +// parseUri 1.2.2
 +// (c) Steven Levithan <stevenlevithan.com>
 +// MIT License
 +
 +function parseUri (str) {
 +      var     o   = parseUri.options,
 +              m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
 +              uri = {},
 +              i   = 14;
 +
 +      while (i--) uri[o.key[i]] = m[i] || "";
 +
 +      uri[o.q.name] = {};
 +      uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
 +              if ($1) uri[o.q.name][$1] = $2;
 +      });
 +
 +      return uri;
 +};
 +
 +parseUri.options = {
 +      strictMode: false,
 +      key: 
["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
 +      q:   {
 +              name:   "queryKey",
 +              parser: /(?:^|&)([^&=]*)=?([^&]*)/g
 +      },
 +      parser: {
 +              strict: 
/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
 +              loose:  
/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
 +      }
 +};
 +
 +
 +// graph.js
 +var drawGraph = function() {
 +
 +    $("svg").remove();
 +
 +    //Dataset and metric to draw is passed via query option:
 +    query = parseUri(location).queryKey;
 +    query.stats = unescape(query.stats);
 +    stats_db = '/tests/artifacts/' + query.stats + '/stats';
 +    var metric = query.metric;
 +    var operation = query.operation;
 +    var smoothing = query.smoothing;
 +    var show_aggregates = query.show_aggregates;
 +
 +    xmin = query.xmin;
 +    xmax = query.xmax;
 +    ymin = query.ymin;
 +    ymax = query.ymax;
 +
 +    //Pull metrics from the stats json:
 +    stress_metrics = $.extend([], stats['stats'][0]['metrics']);
 +    $.each(stress_metrics, function(i,v) {
 +        stress_metrics[i] = v.replace(/\W/g,"_");
 +    });
 +    stress_metric_names = {};
 +    $.each(stress_metrics, function(i,v) {
 +        stress_metric_names[v] = stats['stats'][0]['metrics'][i];
 +    });
 +    //Replace names of shorthand metric names with longer ones:
 +    $.extend(stress_metric_names, {
 +       "mean": "latency mean",
 +       "med" : "latency median",
 +       "_95" : "latency 95th pct",
 +       "_99" : "latency 99th pct",
 +       "_999": "latency 99.9th pct",
 +       "max" : "latency max",
 +       "max_ms" : "gc max (ms)",
 +       "sum_ms" : "gc sum (ms)",
 +       "sdv_ms" : "gc sdv (ms)",
 +       "mb"     : "gc MB"
 +    });
 +
 +    var updateURLBar = function() {
 +        //Update the URL bar with the current parameters:
 +        window.history.replaceState(null,null,parseUri(location).path + "?" + 
$.param(query));
 +    };
 +    
 +    //Check query parameters:
 +    if (metric == undefined) {
 +        metric = query.metric = 'op_s';
 +    }
 +    if (operation == undefined) {
 +        operation = query.operation = stats['stats'][0]['test'];
 +    }
 +    if (smoothing == undefined) {
 +        smoothing = query.smoothing = 1;
 +    }
 +    if (show_aggregates == undefined || query.show_aggregates == 'true') {
 +        show_aggregates = query.show_aggregates = true;
 +    } else {
 +        show_aggregates = query.show_aggregates = false;
 +    }
 +    updateURLBar();
 +
 +    var metric_index = stress_metrics.indexOf(metric);
 +    var time_index = stress_metrics.indexOf('time');
 +
 +    /// Add dropdown controls to select chart criteria / options:
 +    var chart_controls = $('<div id="chart_controls"/>');
 +    var chart_controls_tbl = $('<table/>');
 +    chart_controls.append(chart_controls_tbl);
 +    $('body').append(chart_controls);
 +    var metric_selector = $('<select id="metric_selector"/>');
 +    $.each(stress_metric_names, function(k,v) {
 +        if (k == 'time') {
 +            return; //Elapsed time makes no sense to graph, skip it.
 +        }
 +        var option = $('<option/>').attr('value', k).text(v);
 +        if (metric == k) {
 +            option.attr('selected','selected');
 +        }
 +        metric_selector.append(option);
 +
 +    });
 +    chart_controls_tbl.append('<tr><td><label for="metric_selector"/>Choose 
metric:</label></td><td id="metric_selector_td"></td></tr>')
 +    $('#metric_selector_td').append(metric_selector);
 +
 +    var operation_selector = $('<select id="operation_selector"/>')
 +    chart_controls_tbl.append('<tr><td><label 
for="operation_selector"/>Choose operation:</label></td><td 
id="operation_selector_td"></td></tr>')
 +    $('#operation_selector_td').append(operation_selector);
 +
 +
 +    var smoothing_selector = $('<select id="smoothing_selector"/>')
 +    $.each([1,2,3,4,5,6,7,8], function(i, v) {
 +        var option = $('<option/>').attr('value', v).text(v);
 +        if (smoothing == v) {
 +            option.attr('selected','selected');
 +        }
 +        smoothing_selector.append(option);
 +    });
 +    chart_controls_tbl.append('<tr><td style="width:150px"><label 
for="smoothing_selector"/>Data smoothing:</label></td><td 
id="smoothing_selector_td"></td></tr>')
 +    $("#smoothing_selector_td").append(smoothing_selector);
 +
 +    var show_aggregates_checkbox = $('<input type="checkbox" 
id="show_aggregates_checkbox"/>');
 +    chart_controls_tbl.append('<tr><td style="padding-top:10px"><label 
for="show_aggregates_checkbox">Show aggregates</label></td><td 
id="show_aggregates_td"></td></tr>');
 +    $("#show_aggregates_td").append(show_aggregates_checkbox);
 +    show_aggregates_checkbox.attr("checked", show_aggregates);
 +
 +    chart_controls_tbl.append('<tr><td colspan="100%">Zoom: <a href="#" 
id="reset_zoom">reset</a><table id="zoom"><tr><td><label for="xmin"/>x 
min</label></td><td><input id="xmin"/></td><td><label for="xmax"/>x 
max</label></td><td><input id="xmax"/></td></tr><tr><td><label for="ymin"/>y 
min</label></td><td><input id="ymin"/></td><td><label for="ymax"/>y 
max</label></td><td><input id="ymax"/></td></tr></table></td></tr>');
 +
 +    chart_controls_tbl.append('<tr><td style="padding-top:10px" 
colspan="100%">To hide/show a dataset click on the associated colored 
box</td></tr>');
 +
 +    var raw_data;
 +
 +    //Callback to draw graph once we have json data.
 +    var graph_callback = function() {
 +        var data = [];
 +        var trials = {};
 +        var data_by_title = {};
 +        //Keep track of what operations are availble from the test:
 +        var operations = {};
 +
 +        raw_data.stats.forEach(function(d) {
 +            // Make a copy of d so we never modify raw_data
 +            d = $.extend({}, d);
 +            operations[d.test] = true;
 +            if (d.test!=operation) {
 +                return;
 +            }
 +            d.title = d['label'] != undefined ? d['label'] : d['revision'];
 +            data_by_title[d.title] = d;
 +            data.push(d);
 +            trials[d.title] = d;
 +            //Clean up the intervals:
 +            //Remove every other item, so as to smooth the line:
 +            var new_intervals = [];
 +            d.intervals.forEach(function(i, x) {
 +                if (x % smoothing == 0) {
 +                    new_intervals.push(i);
 +                }
 +            });
 +            d.intervals = new_intervals;
 +        });
 +
 +        //Fill operations available from test:
 +        operation_selector.children().remove();
 +        $.each(operations, function(k) {
 +            var option = $('<option/>').attr('value', k).text(k);
 +            if (operation == k) {
 +                option.attr('selected','selected');
 +            }
 +            operation_selector.append(option);
 +        });
 +
 +        var getMetricValue = function(d) {
 +            if (metric_index >= 0) {
 +                //This is one of the metrics directly reported by stress:
 +                return d[metric_index];
 +            } else {
 +                //This metric is not reported by stress, so compute it 
ourselves:
 +                if (metric == 'num_timeouts') {
 +                    return d[stress_metrics.indexOf('interval_op_rate')] - 
d[stress_metrics.indexOf('interval_key_rate')];
 +                }
 +            }
 +        };
 +
 +        //Parse the dates:
 +        data.forEach(function(d) {
 +            d.date = new Date(Date.parse(d.date));
 +        });
 +
 +
 +        $("svg").remove();
 +        //Setup initial zoom level:
 +        defaultZoom = function(initialize) {
 +            if (!initialize) {
 +                //Reset zoom query params:
 +                query.xmin = xmin = undefined;
 +                query.xmax = xmax = undefined;
 +                query.ymin = ymin = undefined;
 +                query.ymax = ymax = undefined;
 +            }
 +            query.xmin = xmin = query.xmin ? query.xmin : 0;
 +            query.xmax = xmax = query.xmax ? query.xmax : 
Math.round(d3.max(data, function(d) {
 +                if (d.intervals.length > 0) {
 +                    return d.intervals[d.intervals.length-1][time_index];
 +                }
 +            }) * 1.1 * 100) / 100;
 +            query.ymin = ymin = query.ymin ? query.ymin : 0;
 +            query.ymax = ymax = query.ymax ? query.ymax : 
Math.round(d3.max(data, function(d) {
 +                return d3.max(d.intervals, function(i) {
 +                    return getMetricValue(i);
 +                });
 +            }) * 1.1 * 100) / 100;
 +            $("#xmin").val(xmin);
 +            $("#xmax").val(xmax);
 +            $("#ymin").val(ymin);
 +            $("#ymax").val(ymax);
 +            var updateX = function() {
 +                query.xmin = xmin = $("#xmin").val();
 +                query.xmax = xmax = $("#xmax").val();
 +                x.domain([xmin,xmax]);
 +                updateURLBar();
 +            };
 +            var updateY = function() {
 +                query.ymin = ymin = $("#ymin").val();
 +                query.ymax = ymax = $("#ymax").val();
 +                y.domain([ymin, ymax]);
 +                updateURLBar();
 +            };
 +            $("#xmin,#xmax").unbind().change(function(e) {
 +                updateX();
 +                redrawLines();
 +            });
 +            $("#ymin,#ymax").unbind().change(function(e) {
 +                updateY();
 +                redrawLines();
 +            });
 +            // The first time defaultZoom is called, we pass
 +            // initialize=true, and we do not call the change() method
 +            // yet. On subsequent calls, without initialize, we do.
 +            if (!initialize) {
 +                updateX();
 +                updateY();
 +                redrawLines();
 +            }
 +        }
 +        defaultZoom(true);
 +
 +        $("#reset_zoom").click(function(e) {
 +            defaultZoom();
 +            e.preventDefault();
 +        });
 +
 +        //Setup chart:
 +        var margin = {top: 20, right: 1180, bottom: 4240, left: 60};
 +        var width = 2060 - margin.left - margin.right;
 +        var height = 4700 - margin.top - margin.bottom;
 +
 +        var x = d3.scale.linear()
 +            .domain([xmin, xmax])
 +            .range([0, width]);
 +
 +        var y = d3.scale.linear()
 +            .domain([ymin, ymax])
 +            .range([height, 0]);
 +
 +        var color = d3.scale.category10();
 +        color.domain(data.map(function(d){return d.title}));
 +
 +        var xAxis = d3.svg.axis()
 +            .scale(x)
 +            .orient("bottom");
 +
 +        var yAxis = d3.svg.axis()
 +            .scale(y)
 +            .orient("left");
 +
 +        var line = d3.svg.line()
 +            .interpolate("basis")
 +            .x(function(d) {
 +                return x(d[time_index]); //time in seconds
 +            })
 +            .y(function(d) {
 +                return y(getMetricValue(d));
 +            });
 +
 +        $("body").append("<div id='svg_container'>");
 +
 +        var redrawLines = function() {
 +            svg.select(".x.axis").call(xAxis);
 +            svg.select(".y.axis").call(yAxis);
 +            svg.selectAll(".line")
 +                .attr("class","line")
 +                .attr("d", function(d) {
 +                    return line(d.intervals);
 +                })
 +            $("#xmin").val(x.domain()[0]);
 +            $("#xmax").val(x.domain()[1]);
 +            $("#ymin").val(y.domain()[0]);
 +            $("#ymax").val(y.domain()[1]);
 +        }
 +
 +        var zoom = d3.behavior.zoom()
 +            .x(x)
 +            .y(y)
 +            .on("zoom", redrawLines);
 +
 +        var svg = d3.select("div#svg_container").append("svg")
 +            .attr("width", width + margin.left + margin.right + 250)
 +            .attr("height", height + margin.top + margin.bottom)
 +            .append("g")
 +            .attr("transform", "translate(" + margin.left + "," + margin.top 
+ ")")
 +
 +        // Clip Path
 +        svg.append("svg:clipPath")
 +            .attr("id", "chart_clip")
 +            .append("svg:rect")
 +            .attr("width", width)
 +            .attr("height", height);
 +
 +        // Chart title
 +        svg.append("text")
 +            .attr("x", width / 2 )
 +            .attr("y", 0 )
 +            .style('font-size', '2em')
 +            .style("text-anchor", "middle")
 +            .text(raw_data.title + ' - ' + operation);
 +
 +        // Chart subtitle
 +        svg.append("text")
 +            .attr("x", width / 2 )
 +            .attr("y", 15 )
 +            .style('font-size', '1.2em')
 +            .style("text-anchor", "middle")
 +            .text((raw_data.subtitle ? raw_data.subtitle : ''));
 +
 +        // x-axis - time
 +        svg.append("g")
 +            .attr("class", "x axis")
 +            .attr("transform", "translate(0," + height + ")")
 +            .call(xAxis);
 +
 +        // x-axis label
 +        svg.append("text")
 +            .attr("x", width / 2 )
 +            .attr("y", height + 30 )
 +            .style("text-anchor", "middle")
 +            .style("font-size", "1.2em")
 +            .text(stress_metric_names['time']);
 +
 +        // y-axis
 +        svg.append("g")
 +            .attr("class", "y axis")
 +            .call(yAxis)
 +            .append("text")
 +            .attr("transform", "rotate(-90)")
 +            .attr("y", -60)
 +            .attr("dy", ".91em")
 +            .style("font-size", "1.2em")
 +            .style("text-anchor", "end")
 +            .text(stress_metric_names[metric]);
 +
 +        var trial = svg.selectAll(".trial")
 +            .data(data)
 +            .enter().append("g")
 +            .attr("class", "trial")
 +            .attr("title", function(d) {
 +                return d.title;
 +            });
 +
 +        // Draw benchmarked data:
 +        trial.append("path")
 +            .attr("class", "line")
 +            .attr("clip-path", "url(#chart_clip)")
 +            .attr("d", function(d) {
 +                return line(d.intervals);
 +            })
 +            .style("stroke", function(d) { return color(d.title); });
 +
 +        var legend = svg.selectAll(".legend")
 +            .data(color.domain())
 +            .enter().append("g")
 +            .attr("class", "legend")
 +            .attr("transform", function(d, i) {
 +                if (show_aggregates == true) {
 +                    var y_offset = 425 + (i*240) + 70;
 +                } else {
 +                    var y_offset = 425 + (i*25) + 70;
 +                }
 +                var x_offset = -550;
 +                return "translate(" + x_offset + "," + y_offset + ")";
 +            });
 +
 +        var renderLegendText = function(linenum, getTextCallback) {
 +            legend.append("text")
 +                .attr("x", width - 24 - 250)
 +                .attr("y", 12*linenum)
 +                .attr("dy", ".35em")
 +                .style("font-family", "monospace")
 +                .style("font-size", "1.2em")
 +                .style("text-anchor", "start")
 +                .text(function(d) {
 +                    return getTextCallback(d);
 +                });
 +        };
 +
 +        var padTextEnd = function(text, length) {
 +            for(var x=text.length; x<length; x++) {
 +                text = text + '\u00A0';
 +            }
 +            return text;
 +        };
 +        var padTextStart = function(text, length) {
 +            for(var x=text.length; x<length; x++) {
 +                text = '\u00A0' + text;
 +            }
 +            return text;
 +        };
 +
 +        renderLegendText(1, function(title) {
 +            return padTextStart(title, title.length + 5);
 +        });
 +
 +        if (show_aggregates === true) {
 +            renderLegendText(2, function(title) {
 +                return '---------------------------------------';
 +            });
 +
 +            renderLegendText(3, function(title) {
 +                return padTextEnd('op rate', 26) + " : " + 
data_by_title[title]['op rate'];
 +            });
 +
 +            renderLegendText(4, function(title) {
 +                return padTextEnd('partition rate', 26) + " : " + 
data_by_title[title]['partition rate'];
 +            });
 +
 +            renderLegendText(5, function(title) {
 +                return padTextEnd('row rate', 26) + ' : ' + 
data_by_title[title]['row rate'];
 +            });
 +
 +            renderLegendText(6, function(title) {
 +                return padTextEnd('latency mean', 26) + ' : ' + 
data_by_title[title]['latency mean'];
 +            });
 +
 +            renderLegendText(7, function(title) {
 +                return padTextEnd('latency median', 26) + ' : ' + 
data_by_title[title]['latency median'];
 +            });
 +
 +            renderLegendText(8, function(title) {
 +                return padTextEnd('latency 95th percentile', 26) + ' : ' + 
data_by_title[title]['latency 95th percentile'];
 +            });
 +
 +            renderLegendText(9, function(title) {
 +                return padTextEnd('latency 99th percentile', 26) + ' : ' + 
data_by_title[title]['latency 99th percentile'];
 +            });
 +
 +            renderLegendText(10, function(title) {
 +                return padTextEnd('latency 99.9th percentile', 26) + ' : ' + 
data_by_title[title]['latency 99.9th percentile'];
 +            });
 +
 +            renderLegendText(11, function(title) {
 +                return padTextEnd('latency max', 26) + ' : ' + 
data_by_title[title]['latency max'];
 +            });
 +
 +            renderLegendText(12, function(title) {
 +                return padTextEnd('total gc count', 26) + ' : ' + 
data_by_title[title]['total gc count'];
 +            });
 +
 +            renderLegendText(13, function(title) {
 +                return padTextEnd('total gc memory', 26) + ' : ' + 
data_by_title[title]['total gc memory'];
 +            });
 +
 +            renderLegendText(14, function(title) {
 +                return padTextEnd('total gc time', 26) + ' : ' + 
data_by_title[title]['total gc time'];
 +            });
 +
 +            renderLegendText(15, function(title) {
 +                return padTextEnd('avg gc time', 26) + ' : ' + 
data_by_title[title]['avg gc time'];
 +            });
 +
 +            renderLegendText(16, function(title) {
 +                return padTextEnd('stddev gc time', 26) + ' : ' + 
data_by_title[title]['stddev gc time'];
 +            });
 +
 +            renderLegendText(17, function(title) {
 +                return padTextEnd('Total operation time', 26) + ' : ' + 
data_by_title[title]['total operation time'];
 +            });
 +
 +            renderLegendText(18, function(title) {
 +                var cmd = data_by_title[title]['command'];
 +                return 'cmd: ' + cmd;
 +            });
 +        }
 +        legend.append("rect")
 +            .attr("x", width - 270)
 +            .attr("width", 18)
 +            .attr("height", 18)
 +            .attr("class", "legend-rect")
 +            .attr("title", function(title) {
 +                return title;
 +            })
 +            .style("fill", color);
 +
 +        //Make trials hideable by double clicking on the colored legend box
 +        $("rect.legend-rect").click(function() {
 +            $("g.trial[title='" + $(this).attr('title') + "']").toggle();
 +        });
 +
 +
 +        // Chart control callbacks:
 +        metric_selector.unbind().change(function(e) {
 +            // change the metric in the url to reload the page:
 +            metric = query.metric = this.value;
 +            metric_index = stress_metrics.indexOf(metric);
 +            graph_callback();
 +            defaultZoom();
 +        });
 +        operation_selector.unbind().change(function(e) {
 +            // change the metric in the url to reload the page:
 +            operation = query.operation = this.value;
 +            graph_callback();
 +            defaultZoom();
 +        });
 +        smoothing_selector.unbind().change(function(e) {
 +            // change the metric in the url to reload the page:
 +            smoothing = query.smoothing = this.value;
 +            graph_callback();
 +            defaultZoom();
 +        });
 +        show_aggregates_checkbox.unbind().change(function(e) {
 +            show_aggregates = query.show_aggregates = this.checked;
 +            graph_callback();
 +        });
 +
 +        updateURLBar();
 +
 +        $("#dl-test-data").attr("href",stats_db);
 +
 +        // Chart zoom/drag surface
 +        // This should always be last, so it's on top of everything else
 +        svg.append("svg:rect")
 +            .attr("id", "zoom_drag_surface")
 +            .attr("width", width)
 +            .attr("height", height);
 +    }
 +
 +    raw_data = stats;
 +    graph_callback();
 +
 +}
 +
 +$(document).ready(function(){
 +    
 +    drawGraph();
 +    
 +});
 +      -->
 +  </script>
 +  <style type="text/css">
 +div#chart_controls {
 +    margin-left: 900px;
 +    position: absolute;
 +}
 +
 +#chart_controls > table {
 +    width: 640px;
 +}
 +
 +#chart_controls td {
 +    padding: 2px;
 +}
 +
 +#chart_controls #zoom input {
 +    width: 50px;
 +}
 +
 +#chart_controls table#zoom {
 +    padding-left: 20px;
 +}
 +
 +#chart_controls table#zoom td {
 +    padding-left: 20px;
 +}
 +
 +#zoom_drag_surface {
 +    fill: rgba(250, 250, 255, 0.0);
 +    z-index: 100;
 +}
 +
 +svg {
 +  font: 10px sans-serif;
 +}
 +
 +.axis path,
 +.axis line {
 +  fill: none;
 +  stroke: #000;
 +  shape-rendering: crispEdges;
 +}
 +
 +.x.axis path {
 +  display: none;
 +}
 +
 +.line {
 +  fill: none;
 +  stroke: steelblue;
 +  stroke-width: 1.5px;
 +}
 +
 +  </style>
 +</head>
 +<body>
 +</body>
 +

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to