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]
