You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@storm.apache.org by bo...@apache.org on 2014/10/15 18:15:16 UTC

[03/50] git commit: Merge remote-tracking branch 'upstream/master' into STORM-439

Merge remote-tracking branch 'upstream/master' into STORM-439

Conflicts:
	storm-core/src/ui/public/js/visualization.js
	storm-core/src/ui/public/templates/component-page-template.html
	storm-core/src/ui/public/templates/index-page-template.html
	storm-core/src/ui/public/templates/topology-page-template.html


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

Branch: refs/heads/security
Commit: 55231b27922a7cccf7592ebc82de37791a097a07
Parents: cccd4a5 b0974a3
Author: Parth Brahmbhatt <br...@gmail.com>
Authored: Wed Sep 24 13:43:09 2014 -0700
Committer: Parth Brahmbhatt <br...@gmail.com>
Committed: Wed Sep 24 13:43:09 2014 -0700

----------------------------------------------------------------------
 CHANGELOG.md                                    |  17 +
 DEVELOPER.md                                    |   2 +-
 LICENSE                                         |  25 +
 README.markdown                                 |   7 +-
 STORM-UI-REST-API.md                            |   4 +-
 dev-tools/jira-github-join.py                   |   2 +-
 .../multilang/resources/asyncSplitsentence.js   |  32 +
 .../multilang/resources/randomsentence.js       |  75 +++
 .../multilang/resources/splitsentence.js        |  26 +
 .../storm-starter/multilang/resources/storm.js  | 349 +++++++++++
 .../storm/starter/WordCountTopologyNode.java    | 121 ++++
 .../src/jvm/storm/kafka/KafkaUtils.java         |   5 +-
 .../src/jvm/storm/kafka/PartitionManager.java   |   5 +-
 pom.xml                                         |   2 +-
 storm-core/pom.xml                              |  53 +-
 .../src/clj/backtype/storm/daemon/common.clj    |   3 +
 .../src/clj/backtype/storm/daemon/nimbus.clj    |   4 +-
 storm-core/src/clj/backtype/storm/event.clj     |   3 +
 .../backtype/storm/scheduler/EvenScheduler.clj  |   2 +-
 storm-core/src/clj/backtype/storm/testing.clj   |   2 +-
 storm-core/src/clj/backtype/storm/util.clj      |   2 +-
 storm-core/src/dev/resources/storm.js           | 349 +++++++++++
 storm-core/src/dev/resources/tester_bolt.js     |  27 +
 storm-core/src/dev/resources/tester_spout.js    |  58 ++
 .../src/jvm/backtype/storm/StormSubmitter.java  |  16 +
 .../backtype/storm/messaging/netty/Client.java  |  27 +-
 .../StormBoundedExponentialBackoffRetry.java    |  74 +++
 .../src/jvm/backtype/storm/utils/Utils.java     |  30 +-
 storm-core/src/ui/public/component.html         |   6 +
 storm-core/src/ui/public/images/spinner.gif     | Bin 0 -> 23470 bytes
 storm-core/src/ui/public/index.html             |   6 +
 .../src/ui/public/js/jquery.blockUI.min.js      |   6 +
 storm-core/src/ui/public/js/script.js           |  11 +
 storm-core/src/ui/public/js/visualization.js    |  14 +-
 .../templates/component-page-template.html      | 593 ++++++++++++++-----
 .../public/templates/index-page-template.html   | 219 +++++--
 .../templates/topology-page-template.html       | 195 +++++-
 storm-core/src/ui/public/topology.html          |   6 +
 .../test/clj/backtype/storm/multilang_test.clj  |  55 +-
 .../test/clj/backtype/storm/scheduler_test.clj  |  21 +
 .../test/clj/backtype/storm/utils_test.clj      |   3 +-
 ...StormBoundedExponentialBackoffRetryTest.java | 101 ++++
 42 files changed, 2265 insertions(+), 293 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/component.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/component.html
index 21a5e76,6fa998f..fddb9ef
--- a/storm-core/src/ui/public/component.html
+++ b/storm-core/src/ui/public/component.html
@@@ -23,8 -24,9 +24,9 @@@
  <script src="/js/jquery.tablesorter.min.js" type="text/javascript"></script>
  <script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script>
  <script src="/js/jquery.mustache.js" type="text/javascript"></script>
 -<script src="/js/purl.js" type="text/javascript"></script>
 +<script src="/js/url.min.js" type="text/javascript"></script>
  <script src="/js/bootstrap-twipsy.js" type="text/javascript"></script>
+ <script src="/js/jquery.blockUI.min.js" type="text/javascript"></script>
  <script src="/js/script.js" type="text/javascript"></script>
  <script src="/js/moment.min.js" type="text/javascript"></script>
  </head>
@@@ -46,10 -48,14 +48,14 @@@
  </div>
  <p id="toggle-switch" style="display: block;" class="js-only"></p>
  <script>
+ $(document).ajaxStop($.unblockUI);
+ $(document).ajaxStart(function(){
+     $.blockUI({ message: '<img src="images/spinner.gif" /> <h3>Loading component summary...</h3>'});
+ });
  $(document).ready(function() {
 -    var componentId = $.url().param("id");
 -    var topologyId = $.url().param("topology_id");
 -    var window = $.url().param("window");
 +    var componentId = $.url("?id");
 +    var topologyId = $.url("?topology_id");
 +    var window = $.url("?window");
      var sys = $.cookies.get("sys") || "false";
      var url = "/api/v1/topology/"+topologyId+"/component/"+componentId+"?sys="+sys;
      if(window) url += "&window="+window;

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/js/script.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/js/visualization.js
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/js/visualization.js
index 6d00901,7cec697..1e1c4d6
--- a/storm-core/src/ui/public/js/visualization.js
+++ b/storm-core/src/ui/public/js/visualization.js
@@@ -389,10 -389,11 +389,11 @@@ function show_visualization(sys) 
  
      should_update = true;
      var update_freq_ms = 10000;
-     var update = function(should_rechoose){
+     var update = function(should_rechoose) {
+       if(should_update) {
          $.ajax({
 -            url: "/api/v1/topology/" + $.url().param("id") + "/visualization",
 +            url: "/api/v1/topology/"+$.url("?id")+"/visualization",
-             success: function(data, status, jqXHR) {
+             success: function (data, status, jqXHR) {
                  topology_data = data;
                  update_data(topology_data, sys);
                  sys.renderer.signal_update();

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/templates/component-page-template.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/templates/component-page-template.html
index f912bd3,f718967..1e916e3
--- a/storm-core/src/ui/public/templates/component-page-template.html
+++ b/storm-core/src/ui/public/templates/component-page-template.html
@@@ -15,159 -15,474 +15,474 @@@
   limitations under the License.
  -->
  <script id="component-summary-template" type="text/html">
- <h2>Component summary</h2>
- <table><thead><tr><th><span class="tip right" title="The ID assigned to a the Component by the Topology.">Id</span></th><th><span class="tip above" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">Topology</span></th><th><span class="tip above" title="Executors are threads in a Worker process.">Executors</span></th><th><span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">Tasks</span></th></tr></thead>
- <tbody>
- <tr>
- <td>{{id}}</td>
- <td><a href="/topology.html?id={{encodedTopologyId}}">{{name}}</a></td>
- <td>{{executors}}</td>
- <td>{{tasks}}</td>
- </tbody>
- </table>
+   <h2>Component summary</h2>
+   <table>
+     <thead>
+       <tr>
+         <th>
+           <span class="tip right" title="The ID assigned to a the Component by the Topology.">
+             Id
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">
+             Topology
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="Executors are threads in a Worker process.">
+             Executors
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">
+             Tasks
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       <tr>
+         <td>{{id}}</td>
 -        <td><a href="/topology.html?id={{topologyId}}">{{name}}</a></td>
++        <td><a href="/topology.html?id={{encodedTopologyId}}">{{name}}</a></td>
+         <td>{{executors}}</td>
+         <td>{{tasks}}</td>
+     </tbody>
+   </table>
  </script>
  <script id="spout-stats-detail-template" type="text/html">
- <h2>Spout stats</h2>
- <table class="zebra-striped" id="spout-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">Window</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">Transferred</span></th><th class="header"><span class="tip above" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">Complete latency (ms)</span></th><th class="header"><span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">Acked</span></th><th class="header"><span data-original-title="The number of Tuple &quot;trees&quot; that were 
 explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#spoutSummary}}
- <tr>
- <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
- <td>{{transferred}}</td>
- <td>{{emitted}}</td>
- <td>{{completeLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/spoutSummary}}
- </tbody>
- </table>
+   <h2>Spout stats</h2>
+   <table class="zebra-striped" id="spout-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">
+             Window
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">
+             Complete latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#spoutSummary}}
+       <tr>
 -        <td><a href="/component.html?id={{id}}&topology_id={{topologyId}}&window={{window}}">{{windowPretty}}</a></td>
++        <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
+         <td>{{transferred}}</td>
+         <td>{{emitted}}</td>
+         <td>{{completeLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/spoutSummary}}
+     </tbody>
+   </table>
  </script>
  <script id="output-stats-template" type="text/html">
- <h2>Output stats ({{windowHint}})</h2>
- <table class="zebra-striped" id="output-stats-table"><thead><tr><th class="header headerSortDown"><span data-original-title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given." class="tip right">Stream</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">Transferred</span></th><th class="header"><span data-original-title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done." class="tip above">Complete latency (ms)</span></th><th class="header"><span data-original-title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done." class="tip above">Acked</span></th><th class="header"><span data-original-title="The number of Tupl
 e &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#outputStats}}
- <tr>
- <td>{{stream}}</td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{completeLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/outputStats}}
- </tbody>
- </table>
+   <h2>Output stats ({{windowHint}})</h2>
+   <table class="zebra-striped" id="output-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span data-original-title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given." class="tip right">
+             Stream
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done." class="tip above">
+             Complete latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done." class="tip above">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#outputStats}}
+       <tr>
+         <td>{{stream}}</td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{completeLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/outputStats}}
+     </tbody>
+   </table>
  </script>
  <script id="executor-stats-template" type="text/html">
- <h2>Executors ({{windowHint}})</h2>
- <table class="zebra-striped" id="executor-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The unique executor ID.">Id</span></th><th class="header"><span class="tip right" title="The length of time an Executor (thread) has been alive.">Uptime</span></th><th class="header"><span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">Host</span></th><th class="header"><span data-original-title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker." class="tip above">Port</span></th><th class="header"><span data-original-title="The number of Tuples emitted." class="tip above">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th><th class="header"><span class="tip abov
 e" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">Complete latency (ms)</span></th><th class="header"><span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">Acked</span></th><th class="header"><span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#executorStats}}
- <tr>
- <td>{{id}}</td>
- <td>{{uptime}}</td>
- <td>{{host}}</td>
- <td><a href="{{workerLogLink}}">{{port}}</a></td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{completeLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/executorStats}}
- </tbody>
- </table>
+   <h2>Executors ({{windowHint}})</h2>
+   <table class="zebra-striped" id="executor-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The unique executor ID.">
+             Id
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip right" title="The length of time an Executor (thread) has been alive.">
+             Uptime
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">
+             Host
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker." class="tip above">
+             Port
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples emitted." class="tip above">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">
+             Complete latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#executorStats}}
+       <tr>
+         <td>{{id}}</td>
+         <td>{{uptime}}</td>
+         <td>{{host}}</td>
+         <td><a href="{{workerLogLink}}">{{port}}</a></td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{completeLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/executorStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-stats-template" type="text/html">
- <h2>Bolt stats</h2>
- <table class="zebra-striped" id="bolt-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">Window</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th><th class="header"><span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">Execute latency (ms)</span></th><th class="header"><span class="tip above" title="The number of incoming Tuples processed.">Executed</span></th><th class="header"><span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple unt
 il a number of other Tuples have been received." class="tip above">Process latency (ms)</span></th><th class="header"><span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">Acked</span></th><th class="header"><span data-original-title="The number of tuples Failed by this Bolt." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#boltStats}}
- <tr>
- <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{executeLatency}}</td>
- <td>{{executed}}</td>
- <td>{{processLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/boltStats}}
- </tbody>
- </table>
+   <h2>Bolt stats</h2>
+   <table class="zebra-striped" id="bolt-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">
+             Window
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">
+             Execute latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of incoming Tuples processed.">
+             Executed
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">
+             Process latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of tuples Failed by this Bolt." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#boltStats}}
+       <tr>
 -        <td><a href="/component.html?id={{id}}&topology_id={{topologyId}}&window={{window}}">{{windowPretty}}</a></td>
++        <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{executeLatency}}</td>
+         <td>{{executed}}</td>
+         <td>{{processLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/boltStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-input-stats-template" type="text/html">
- <h2>Input stats ({{windowHint}})</h2>
- <table class="zebra-striped" id="bolt-input-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The ID assigned to a the Component by the Topology.">Component</span></th><th class="header"><span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">Stream</span></th><th class="header"><span class="tip above" title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple.">Execute latency (ms)</span></th><th class="header"><span class="tip above" title="The number of incoming Tuples processed.">Executed</span></th><th class="header"><span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">Process latency (ms)</span></th><th class="header"><span class="t
 ip above" title="The number of Tuples acknowledged by this Bolt.">Acked</span></th><th class="header"><span data-original-title="The number of tuples Failed by this Bolt." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#inputStats}}
- <tr>
- <td>{{component}}</td>
- <td>{{stream}}</td>
- <td>{{executeLatency}}</td>
- <td>{{executed}}</td>
- <td>{{processLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/inputStats}}
- </tbody>
- </table>
+   <h2>Input stats ({{windowHint}})</h2>
+   <table class="zebra-striped" id="bolt-input-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The ID assigned to a the Component by the Topology.">
+             Component
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">
+             Stream
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple.">
+             Execute latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of incoming Tuples processed.">
+             Executed
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">
+             Process latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples acknowledged by this Bolt.">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of tuples Failed by this Bolt." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#inputStats}}
+       <tr>
+         <td>{{component}}</td>
+         <td>{{stream}}</td>
+         <td>{{executeLatency}}</td>
+         <td>{{executed}}</td>
+         <td>{{processLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/inputStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-output-stats-template" type="text/html">
- <h2>Output stats ({{windowHint}})</h2>
- <table class="zebra-striped" id="bolt-output-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">Stream</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th></tr></thead>
- <tbody>
- {{#outputStats}}
- <tr>
- <td>{{stream}}</td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- </tr>
- {{/outputStats}}
- </tbody>
- </table>
+   <h2>Output stats ({{windowHint}})</h2>
+   <table class="zebra-striped" id="bolt-output-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">
+             Stream
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#outputStats}}
+       <tr>
+         <td>{{stream}}</td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+       </tr>
+       {{/outputStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-executor-template" type="text/html">
- <h2>Executors</h2>
- <table class="zebra-striped" id="bolt-executor-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The unique executor ID.">Id</span></th><th class="header"><span data-original-title="The length of time an Executor (thread) has been alive." class="tip right">Uptime</span></th><th class="header"><span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">Host</span></th><th class="header"><span class="tip above" title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker.">Port</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th><th class="header"><span class="tip above" title="If th
 is is around 1.0, the corresponding Bolt is running as fast as it can, so you may want to increase the Bolt's parallelism. This is (number executed * average execute latency) / measurement time.">Capacity (last 10m)</span></th><th class="header"><span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">Execute latency (ms)</span></th><th class="header"><span class="tip above" title="The number of incoming Tuples processed.">Executed</span></th><th class="header"><span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">Process latency (ms)</span></th><th class="header"><span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">Acked</span></th><th class="header"><span data-or
 iginal-title="The number of tuples Failed by this Bolt." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#executorStats}}
- <tr>
- <td>{{id}}}</td>
- <td>{{uptime}}</td>
- <td>{{host}}</td>
- <td><a href="{{workerLogLink}}">{{port}}</a></td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{capacity}}</td>
- <td>{{executeLatency}}</td>
- <td>{{executed}}</td>
- <td>{{processLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/executorStats}}
- </tbody>
- </table>
+   <h2>Executors</h2>
+   <table class="zebra-striped" id="bolt-executor-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The unique executor ID.">
+             Id
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The length of time an Executor (thread) has been alive." class="tip right">
+             Uptime
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">
+             Host
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker.">
+             Port
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="If this is around 1.0, the corresponding Bolt is running as fast as it can, so you may want to increase the Bolt's parallelism. This is (number executed * average execute latency) / measurement time.">
+             Capacity (last 10m)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">
+             Execute latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of incoming Tuples processed.">
+             Executed
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">
+             Process latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of tuples Failed by this Bolt." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#executorStats}}
+       <tr>
+         <td>{{id}}}</td>
+         <td>{{uptime}}</td>
+         <td>{{host}}</td>
+         <td><a href="{{workerLogLink}}">{{port}}</a></td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{capacity}}</td>
+         <td>{{executeLatency}}</td>
+         <td>{{executed}}</td>
+         <td>{{processLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/executorStats}}
+     </tbody>
+   </table>
  </script>
  <script id="component-errors-template" type="text/html">
- <h2>Errors</h2>
- <table class="zebra-striped" id="component-errors-table"><thead><tr><th>Time</th><th>Error Host</th><th>Error Port</th><th>Error</th></tr></thead>
- <tbody>
- {{#componentErrors}}
- <tr>
- <td>{{time}}</td>
- <td>{{errorHost}}</td>
- <td><a href="{{errorWorkerLogLink}}">{{errorPort}}</a></td>
- <td>
-   <span id="{{errorLapsedSecs}}" class="errorSpan">{{error}}</span>
- </td>
- </tr>
- {{/componentErrors}}
- </tbody>
- </table>
+   <h2>Errors</h2>
+   <table class="zebra-striped" id="component-errors-table">
+     <thead>
+       <tr>
+         <th>Time</th>
+         <th>Error Host</th>
+         <th>Error Port</th>
+         <th>Error</th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#componentErrors}}
+       <tr>
+         <td>{{time}}</td>
+         <td>{{errorHost}}</td>
+         <td><a href="{{errorWorkerLogLink}}">{{errorPort}}</a></td>
+         <td>
+           <span id="{{errorLapsedSecs}}" class="errorSpan">{{error}}</span>
+         </td>
+       </tr>
+       {{/componentErrors}}
+     </tbody>
+   </table>
  </script>

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/templates/index-page-template.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/templates/index-page-template.html
index d0db1bf,d249fac..e3aab5e
--- a/storm-core/src/ui/public/templates/index-page-template.html
+++ b/storm-core/src/ui/public/templates/index-page-template.html
@@@ -31,36 -75,103 +75,103 @@@
  </table>
  </script>
  <script id="topology-summary-template" type="text/html">
- <table class="zebra-striped" id="topology-summary-table">
- <thead><tr><th><span class="tip right" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">Name</span></th><th><span class="tip right" title="The unique ID given to a Topology each time it is launched.">Id</span></th><th><span class="tip above" title="The status can be one of ACTIVE, INACTIVE, KILLED, or REBALANCING.">Status</span></th><th><span class="tip above" title="The time since the Topology was submitted.">Uptime</span></th><th><span class="tip above" title="The number of Workers (processes).">Num workers</span></th><th><span class="tip above" title="Executors are threads in a Worker process.">Num executors</span></th><th><span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">Num tasks</span></th></tr></thead>
- <tbody>
- {{#topologies}}
- <tr>
-   <td><a href="/topology.html?id={{encodedId}}">{{name}}</a></td>
-   <td>{{id}}</td>
-   <td>{{status}}</td>
-   <td>{{uptime}}</td>
-   <td>{{workersTotal}}</td>
-   <td>{{executorsTotal}}</td>
-   <td>{{tasksTotal}}</td>
- </tr>
- {{/topologies}}
- </tbody>
- </table>
+   <table class="zebra-striped" id="topology-summary-table">
+     <thead>
+       <tr>
+         <th>
+           <span class="tip right" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">
+             Name
+           </span>
+         </th>
+         <th>
+           <span class="tip right" title="The unique ID given to a Topology each time it is launched.">
+             Id
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The status can be one of ACTIVE, INACTIVE, KILLED, or REBALANCING.">
+             Status
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The time since the Topology was submitted.">
+             Uptime
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The number of Workers (processes).">
+             Num workers
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="Executors are threads in a Worker process.">
+             Num executors
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">
+             Num tasks
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#topologies}}
+       <tr>
 -        <td><a href="/topology.html?id={{id}}">{{name}}</a></td>
++        <td><a href="/topology.html?id={{encodedId}}">{{name}}</a></td>
+         <td>{{id}}</td>
+         <td>{{status}}</td>
+         <td>{{uptime}}</td>
+         <td>{{workersTotal}}</td>
+         <td>{{executorsTotal}}</td>
+         <td>{{tasksTotal}}</td>
+       </tr>
+       {{/topologies}}
+     </tbody>
+   </table>
  </script>
  <script id="supervisor-summary-template" type="text/html">
- <table class="zebra-striped" id="supervisor-summary-table"><thead><tr><th><span class="tip right" title="A unique identifier given to a Supervisor when it joins the cluster.">Id</span></th><th><span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">Host</span></th><th><span class="tip above" title="The length of time a Supervisor has been registered to the cluster.">Uptime</span></th><th><span class="tip above" title="Slots are Workers (processes).">Slots</span></th><th><span class="tip left" title="Slots are Workers (processes).">Used slots</span></th></tr></thead>
- <tbody>
- {{#supervisors}}
- <tr>
-   <td>{{id}}</td>
-   <td>{{host}}</td>
-   <td>{{uptime}}</td>
-   <td>{{slotsTotal}}</td>
-   <td>{{slotsUsed}}</td>
- </tr>
- {{/supervisors}}
- </tbody>
+ <table class="zebra-striped" id="supervisor-summary-table">
+   <thead>
+     <tr>
+       <th>
+         <span class="tip right" title="A unique identifier given to a Supervisor when it joins the cluster.">
+           Id
+         </span>
+       </th>
+       <th>
+         <span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">
+           Host
+         </span>
+       </th>
+       <th>
+         <span class="tip above" title="The length of time a Supervisor has been registered to the cluster.">
+           Uptime
+         </span>
+       </th>
+       <th>
+         <span class="tip above" title="Slots are Workers (processes).">
+           Slots
+         </span>
+       </th>
+       <th>
+         <span class="tip left" title="Slots are Workers (processes).">
+           Used slots
+         </span>
+       </th>
+     </tr>
+   </thead>
+   <tbody>
+     {{#supervisors}}
+     <tr>
+       <td>{{id}}</td>
+       <td>{{host}}</td>
+       <td>{{uptime}}</td>
+       <td>{{slotsTotal}}</td>
+       <td>{{slotsUsed}}</td>
+     </tr>
+     {{/supervisors}}
+   </tbody>
  </table>
  </script>
  

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/templates/topology-page-template.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/templates/topology-page-template.html
index c5b3db0,b977071..3479fc1
--- a/storm-core/src/ui/public/templates/topology-page-template.html
+++ b/storm-core/src/ui/public/templates/topology-page-template.html
@@@ -148,5 -326,8 +326,8 @@@
  </script>
  
  <script id="topology-actions-template" type="text/html">
-   <input {{activateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate"><input {{deactivateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate"><input {{rebalanceStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance"><input {{killStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
 -  <input {{activateStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate">
 -  <input {{deactivateStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate">
 -  <input {{rebalanceStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance">
 -  <input {{killStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
++  <input {{activateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate">
++  <input {{deactivateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate">
++  <input {{rebalanceStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance">
++  <input {{killStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
  </script>

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/topology.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/topology.html
index e4da3c5,9d53144..6940df4
--- a/storm-core/src/ui/public/topology.html
+++ b/storm-core/src/ui/public/topology.html
@@@ -24,8 -25,9 +25,9 @@@
  <script src="/js/jquery.tablesorter.min.js" type="text/javascript"></script>
  <script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script>
  <script src="/js/jquery.mustache.js" type="text/javascript"></script>
 -<script src="/js/purl.js" type="text/javascript"></script>
 +<script src="/js/url.min.js" type="text/javascript"></script>
  <script src="/js/bootstrap-twipsy.js" type="text/javascript"></script>
+ <script src="/js/jquery.blockUI.min.js" type="text/javascript"></script>
  <script src="/js/script.js" type="text/javascript"></script>
  <script src="/js/visualization.js" type="text/javascript"></script>
  <script src="/js/arbor.js" type="text/javascript"></script>
@@@ -55,9 -57,13 +57,13 @@@
  </div>
  </body>
  <script>
+ $(document).ajaxStop($.unblockUI);
+ $(document).ajaxStart(function(){
+     $.blockUI({ message: '<img src="images/spinner.gif" /> <h3>Loading topology summary...</h3>'});
+ });
  $(document).ready(function() {
 -    var topologyId = $.url().param("id");
 -    var window = $.url().param("window");
 +    var topologyId = $.url("?id");
 +    var window = $.url("?window");
      var sys = $.cookies.get("sys") || "false";
      var url = "/api/v1/topology/"+topologyId+"?sys="+sys;
      if(window) url += "&window="+window;