Modified: helix/site-content/1.0.3-docs/tutorial_user_content_store.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/1.0.3-docs/tutorial_user_content_store.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/1.0.3-docs/tutorial_user_content_store.html (original)
+++ helix/site-content/1.0.3-docs/tutorial_user_content_store.html Mon Apr 25 
08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia at 2022-04-23  Rendered using Reflow Maven 
Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia at 2022-04-25  Rendered using Reflow Maven 
Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-tutorial_user_content_store project-103-docs" 
data-spy="scroll" data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -119,7 +132,7 @@
                                <li><a href="./" title="Release 1.0.3">Release 
1.0.3</a></li>
                                <li class="divider">/</li>
                                <li>Tutorial - User Defined Content Store for 
Tasks</li>
-                               <li class="publishDate version-date 
pull-right">Last Published: 2022-04-23</li>
+                               <li class="publishDate version-date 
pull-right">Last Published: 2022-04-25</li>
                        </ul>
                </div>
        </header>
@@ -179,14 +192,14 @@ under the License.
    <pre><code>  private static class ContentStoreTask extends UserContentStore 
implements Task {
     @Override public TaskResult run() {
       // put values into the store
-      putUserContent(&quot;ContentTest&quot;, &quot;Value1&quot;, Scope.JOB);
-      putUserContent(&quot;ContentTest&quot;, &quot;Value2&quot;, 
Scope.WORKFLOW);
-      putUserContent(&quot;ContentTest&quot;, &quot;Value3&quot;, Scope.TASK);
+      putUserContent("ContentTest", "Value1", Scope.JOB);
+      putUserContent("ContentTest", "Value2", Scope.WORKFLOW);
+      putUserContent("ContentTest", "Value3", Scope.TASK);
       
       // get the values with the same key in the different scopes
-      if (!getUserContent(&quot;ContentTest&quot;, 
Scope.JOB).equals(&quot;Value1&quot;) ||
-          !getUserContent(&quot;ContentTest&quot;, 
Scope.WORKFLOW).equals(&quot;Value2&quot;) ||
-          !getUserContent(&quot;ContentTest&quot;, 
Scope.TASK).equals(&quot;Value3&quot;)) {
+      if (!getUserContent("ContentTest", Scope.JOB).equals("Value1") ||
+          !getUserContent("ContentTest", Scope.WORKFLOW).equals("Value2") ||
+          !getUserContent("ContentTest", Scope.TASK).equals("Value3")) {
         return new TaskResult(TaskResult.Status.FAILED, null);
       }
       
@@ -266,7 +279,7 @@ under the License.
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a 
href="https://helix.apache.org/1.0.3-docs/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html (original)
+++ helix/site-content/1.0.3-docs/tutorial_user_def_rebalancer.html Mon Apr 25 
08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia at 2022-04-23  Rendered using Reflow Maven 
Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia at 2022-04-25  Rendered using Reflow Maven 
Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-tutorial_user_def_rebalancer project-103-docs" 
data-spy="scroll" data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -119,7 +132,7 @@
                                <li><a href="./" title="Release 1.0.3">Release 
1.0.3</a></li>
                                <li class="divider">/</li>
                                <li>Tutorial - User-Defined Rebalancing</li>
-                               <li class="publishDate version-date 
pull-right">Last Published: 2022-04-23</li>
+                               <li class="publishDate version-date 
pull-right">Last Published: 2022-04-25</li>
                        </ul>
                </div>
        </header>
@@ -216,12 +229,12 @@ IdealState computeNewIdealState(String r
   </ul> 
   <div class="source"> 
    <pre><code>{
-  &quot;lock_0&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_1&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_2&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_3&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_4&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_5&quot;: [&quot;Participant_A&quot;],
+  "lock_0": ["Participant_A"],
+  "lock_1": ["Participant_A"],
+  "lock_2": ["Participant_A"],
+  "lock_3": ["Participant_A"],
+  "lock_4": ["Participant_A"],
+  "lock_5": ["Participant_A"],
 }
 </code></pre> 
   </div> 
@@ -231,12 +244,12 @@ IdealState computeNewIdealState(String r
   </ul> 
   <div class="source"> 
    <pre><code>{
-  &quot;lock_0&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_1&quot;: [&quot;Participant_B&quot;],
-  &quot;lock_2&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_3&quot;: [&quot;Participant_B&quot;],
-  &quot;lock_4&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_5&quot;: [&quot;Participant_B&quot;],
+  "lock_0": ["Participant_A"],
+  "lock_1": ["Participant_B"],
+  "lock_2": ["Participant_A"],
+  "lock_3": ["Participant_B"],
+  "lock_4": ["Participant_A"],
+  "lock_5": ["Participant_B"],
 }
 </code></pre> 
   </div> 
@@ -246,27 +259,27 @@ IdealState computeNewIdealState(String r
   </ul> 
   <div class="source"> 
    <pre><code>{
-  &quot;lock_0&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_1&quot;: [&quot;Participant_B&quot;],
-  &quot;lock_2&quot;: [&quot;Participant_C&quot;],
-  &quot;lock_3&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_4&quot;: [&quot;Participant_B&quot;],
-  &quot;lock_5&quot;: [&quot;Participant_C&quot;],
+  "lock_0": ["Participant_A"],
+  "lock_1": ["Participant_B"],
+  "lock_2": ["Participant_C"],
+  "lock_3": ["Participant_A"],
+  "lock_4": ["Participant_B"],
+  "lock_5": ["Participant_C"],
 }
 </code></pre> 
   </div> 
-  <p>This is the steady state of the system. Notice that four of the six locks 
now have a different owner. That is because of the na&iuml;ve modulus-based 
assignmemt approach used by the user-defined rebalancer. However, the interface 
is flexible enough to allow you to employ consistent hashing or any other 
scheme if minimal movement is a system requirement.</p> 
+  <p>This is the steady state of the system. Notice that four of the six locks 
now have a different owner. That is because of the naïve modulus-based 
assignmemt approach used by the user-defined rebalancer. However, the interface 
is flexible enough to allow you to employ consistent hashing or any other 
scheme if minimal movement is a system requirement.</p> 
   <ul> 
    <li>Participant_B fails</li> 
   </ul> 
   <div class="source"> 
    <pre><code>{
-  &quot;lock_0&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_1&quot;: [&quot;Participant_C&quot;],
-  &quot;lock_2&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_3&quot;: [&quot;Participant_C&quot;],
-  &quot;lock_4&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_5&quot;: [&quot;Participant_C&quot;],
+  "lock_0": ["Participant_A"],
+  "lock_1": ["Participant_C"],
+  "lock_2": ["Participant_A"],
+  "lock_3": ["Participant_C"],
+  "lock_4": ["Participant_A"],
+  "lock_5": ["Participant_C"],
 }
 </code></pre> 
   </div> 
@@ -276,12 +289,12 @@ IdealState computeNewIdealState(String r
   </ul> 
   <div class="source"> 
    <pre><code>{
-  &quot;lock_0&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_1&quot;: [&quot;Participant_B&quot;],
-  &quot;lock_2&quot;: [&quot;Participant_C&quot;],
-  &quot;lock_3&quot;: [&quot;Participant_A&quot;],
-  &quot;lock_4&quot;: [&quot;Participant_B&quot;],
-  &quot;lock_5&quot;: [&quot;Participant_C&quot;],
+  "lock_0": ["Participant_A"],
+  "lock_1": ["Participant_B"],
+  "lock_2": ["Participant_C"],
+  "lock_3": ["Participant_A"],
+  "lock_4": ["Participant_B"],
+  "lock_5": ["Participant_C"],
 }
 </code></pre> 
   </div> 
@@ -365,7 +378,7 @@ IdealState computeNewIdealState(String r
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a 
href="https://helix.apache.org/1.0.3-docs/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/1.0.3-docs/tutorial_yaml.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/1.0.3-docs/tutorial_yaml.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/1.0.3-docs/tutorial_yaml.html (original)
+++ helix/site-content/1.0.3-docs/tutorial_yaml.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia at 2022-04-23  Rendered using Reflow Maven 
Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia at 2022-04-25  Rendered using Reflow Maven 
Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-tutorial_yaml project-103-docs" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -119,7 +132,7 @@
                                <li><a href="./" title="Release 1.0.3">Release 
1.0.3</a></li>
                                <li class="divider">/</li>
                                <li>Tutorial - YAML Cluster Setup</li>
-                               <li class="publishDate version-date 
pull-right">Last Published: 2022-04-23</li>
+                               <li class="publishDate version-date 
pull-right">Last Published: 2022-04-25</li>
                        </ul>
                </div>
        </header>
@@ -185,11 +198,11 @@ resources:
       state:
         counts: # maximum number of replicas of a partition that can be in 
each state (required if model not built-in)
           - name: LOCKED
-            count: &quot;1&quot;
+            count: "1"
           - name: RELEASED
-            count: &quot;-1&quot;
+            count: "-1"
           - name: DROPPED
-            count: &quot;-1&quot;
+            count: "-1"
         priorityList: [LOCKED, RELEASED, DROPPED] # states in order of 
priority (all priorities equal if not specified)
       transition: # transitions priority to enforce order that transitions 
occur
         priorityList: [Unlock, Lock, Undrop, DropUnlock, DropLock] # all 
priorities equal if not specified
@@ -215,7 +228,7 @@ participants: # list of nodes that can s
   <pre><code>YAMLClusterSetup setup = new YAMLClusterSetup(zkAddress);
 InputStream input =
     Thread.currentThread().getContextClassLoader()
-        .getResourceAsStream(&quot;lock-manager-config.yaml&quot;);
+        .getResourceAsStream("lock-manager-config.yaml");
 YAMLClusterSetup.YAMLClusterConfig config = setup.setupCluster(input);
 </code></pre> 
  </div> 
@@ -294,7 +307,7 @@ YAMLClusterSetup.YAMLClusterConfig confi
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a 
href="https://helix.apache.org/1.0.3-docs/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/Architecture.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/Architecture.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/Architecture.html (original)
+++ helix/site-content/Architecture.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-architecture project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -190,7 +203,7 @@ under the License.
   <li>A service discovery mechanism to route requests</li> 
  </ul> 
  <p>To build such a system, we need a mechanism to coordinate between 
different nodes and other components in the system. This mechanism can be 
achieved with software that reacts to any change in the cluster and comes up 
with a set of tasks needed to bring the cluster to a stable state. The set of 
tasks will be assigned to one or more nodes in the cluster. Helix serves this 
purpose of managing the various components in the cluster.</p> 
- <p><img src="images/system.png" alt="Helix Design" /></p> 
+ <p><img src="images/system.png" alt="Helix Design"></p> 
 </section> 
 <section> 
  <h2 id="Distributed_System_Components">Distributed System Components</h2> 
@@ -205,7 +218,7 @@ under the License.
 </section> 
 <section> 
  <h2 id="Roles">Roles</h2> 
- <p><img src="images/HELIX-components.png" alt="Helix Design" /></p> 
+ <p><img src="images/HELIX-components.png" alt="Helix Design"></p> 
  <p>Not all nodes in a distributed system will perform similar 
functionalities. For example, a few nodes might be serving requests and a few 
nodes might be sending requests, and some other nodes might be controlling the 
nodes in the cluster. Thus, Helix categorizes nodes by their specific roles in 
the system.</p> 
  <p>Helix divides nodes into 3 logical components based on their 
responsibilities:</p> 
  <ol style="list-style-type: decimal"> 
@@ -257,7 +270,7 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
 
 </code></pre> 
  </div> 
- <p><img src="images/statemachine.png" alt="Helix Design" /></p> 
+ <p><img src="images/statemachine.png" alt="Helix Design"></p> 
 </section> 
 <section> 
  <h2 id="Concepts">Concepts</h2> 
@@ -353,7 +366,7 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
  <section> 
   <h3 
id="Interaction_between_the_Controller.2C_Participant_and_Spectator">Interaction
 between the Controller, Participant and Spectator</h3> 
   <p>The following picture shows how Controllers, Participants and Spectators 
interact with each other.</p> 
-  <p><img src="images/helix-architecture.png" alt="Helix Architecture" /></p> 
+  <p><img src="images/helix-architecture.png" alt="Helix Architecture"></p> 
  </section> 
 </section> 
 <section> 
@@ -405,7 +418,7 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
   <li>PARTICIPANT: contains participant scope configurations</li> 
  </ul> 
  <p>The following image shows an example of the Helix ZNode layout for a 
cluster named “test-cluster”:</p> 
- <p><img src="images/helix-znode-layout.png" alt="Helix znode layout" /></p> 
+ <p><img src="images/helix-znode-layout.png" alt="Helix znode layout"></p> 
 </section>
                        </div>
                </div>
@@ -527,7 +540,7 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/ClientLibraries.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/ClientLibraries.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/ClientLibraries.html (original)
+++ helix/site-content/ClientLibraries.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-clientlibraries project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -318,7 +331,7 @@ under the License.
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/Concepts.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/Concepts.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/Concepts.html (original)
+++ helix/site-content/Concepts.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-concepts project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -188,18 +201,18 @@ under the License.
   <h3 id="Ideal_State">Ideal State</h3> 
   <p>An <b>IdealState</b> allows one to map tasks to location and state. A 
standard way of expressing this in Helix is as follows:</p> 
   <div class="source"> 
-   <pre><code>&quot;TASK_NAME&quot; : {
-  &quot;LOCATION&quot; : &quot;STATE&quot;
+   <pre><code>"TASK_NAME" : {
+  "LOCATION" : "STATE"
 }
 </code></pre> 
   </div> 
-  <p>Consider a simple case where you want to launch a resource 
&quot;myTask&quot; on node &quot;N1&quot;. The IdealState for this can be 
expressed as follows:</p> 
+  <p>Consider a simple case where you want to launch a resource "myTask" on 
node "N1". The IdealState for this can be expressed as follows:</p> 
   <div class="source"> 
    <pre><code>{
-  &quot;id&quot; : &quot;MyTask&quot;,
-  &quot;mapFields&quot; : {
-    &quot;myTask&quot; : {
-      &quot;N1&quot; : &quot;ONLINE&quot;,
+  "id" : "MyTask",
+  "mapFields" : {
+    "myTask" : {
+      "N1" : "ONLINE",
     }
   }
 }
@@ -209,22 +222,22 @@ under the License.
  <section> 
   <h3 id="Partition">Partition</h3> 
   <p>If this task get too big to fit on one box, you might want to divide it 
into subtasks. Each subtask is referred to as a <b>partition</b> in Helix. 
Let's say you want to divide the task into 3 subtasks/partitions, the 
IdealState can be changed as shown below.</p> 
-  <p>&quot;myTask_0&quot;, &quot;myTask_1&quot;, &quot;myTask_2&quot; are 
logical names representing the partitions of myTask. Each tasks runs on N1, N2 
and N3 respectively.</p> 
+  <p>"myTask_0", "myTask_1", "myTask_2" are logical names representing the 
partitions of myTask. Each tasks runs on N1, N2 and N3 respectively.</p> 
   <div class="source"> 
    <pre><code>{
-  &quot;id&quot; : &quot;myTask&quot;,
-  &quot;simpleFields&quot; : {
-    &quot;NUM_PARTITIONS&quot; : &quot;3&quot;,
+  "id" : "myTask",
+  "simpleFields" : {
+    "NUM_PARTITIONS" : "3",
   }
- &quot;mapFields&quot; : {
-    &quot;myTask_0&quot; : {
-      &quot;N1&quot; : &quot;ONLINE&quot;,
+ "mapFields" : {
+    "myTask_0" : {
+      "N1" : "ONLINE",
     },
-    &quot;myTask_1&quot; : {
-      &quot;N2&quot; : &quot;ONLINE&quot;,
+    "myTask_1" : {
+      "N2" : "ONLINE",
     },
-    &quot;myTask_2&quot; : {
-      &quot;N3&quot; : &quot;ONLINE&quot;,
+    "myTask_2" : {
+      "N3" : "ONLINE",
     }
   }
 }
@@ -238,23 +251,23 @@ under the License.
   <p>For increasing the availability of the system, it's better to place the 
replica of a given partition on different nodes.</p> 
   <div class="source"> 
    <pre><code>{
-  &quot;id&quot; : &quot;myIndex&quot;,
-  &quot;simpleFields&quot; : {
-    &quot;NUM_PARTITIONS&quot; : &quot;3&quot;,
-    &quot;REPLICAS&quot; : &quot;2&quot;,
+  "id" : "myIndex",
+  "simpleFields" : {
+    "NUM_PARTITIONS" : "3",
+    "REPLICAS" : "2",
   },
- &quot;mapFields&quot; : {
-    &quot;myIndex_0&quot; : {
-      &quot;N1&quot; : &quot;ONLINE&quot;,
-      &quot;N2&quot; : &quot;ONLINE&quot;
+ "mapFields" : {
+    "myIndex_0" : {
+      "N1" : "ONLINE",
+      "N2" : "ONLINE"
     },
-    &quot;myIndex_1&quot; : {
-      &quot;N2&quot; : &quot;ONLINE&quot;,
-      &quot;N3&quot; : &quot;ONLINE&quot;
+    "myIndex_1" : {
+      "N2" : "ONLINE",
+      "N3" : "ONLINE"
     },
-    &quot;myIndex_2&quot; : {
-      &quot;N3&quot; : &quot;ONLINE&quot;,
-      &quot;N1&quot; : &quot;ONLINE&quot;
+    "myIndex_2" : {
+      "N3" : "ONLINE",
+      "N1" : "ONLINE"
     }
   }
 }
@@ -267,15 +280,15 @@ under the License.
   <p>Helix allows one to assign different <b>states</b> to each replica. Let's 
say you have two MySQL instances N1 and N2, where one will serve as MASTER and 
another as SLAVE. The IdealState can be changed to:</p> 
   <div class="source"> 
    <pre><code>{
-  &quot;id&quot; : &quot;myDB&quot;,
-  &quot;simpleFields&quot; : {
-    &quot;NUM_PARTITIONS&quot; : &quot;1&quot;,
-    &quot;REPLICAS&quot; : &quot;2&quot;,
+  "id" : "myDB",
+  "simpleFields" : {
+    "NUM_PARTITIONS" : "1",
+    "REPLICAS" : "2",
   },
-  &quot;mapFields&quot; : {
-    &quot;myDB&quot; : {
-      &quot;N1&quot; : &quot;MASTER&quot;,
-      &quot;N2&quot; : &quot;SLAVE&quot;,
+  "mapFields" : {
+    "myDB" : {
+      "N1" : "MASTER",
+      "N2" : "SLAVE",
     }
   }
 }
@@ -309,16 +322,16 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
   <p>Helix allows each resource to be associated with one state machine. This 
means you can have one resource as an index and another as a database in the 
same cluster. One can associate each resource with a state machine as 
follows:</p> 
   <div class="source"> 
    <pre><code>{
-  &quot;id&quot; : &quot;myDB&quot;,
-  &quot;simpleFields&quot; : {
-    &quot;NUM_PARTITIONS&quot; : &quot;1&quot;,
-    &quot;REPLICAS&quot; : &quot;2&quot;,
-    &quot;STATE_MODEL_DEF_REF&quot; : &quot;MasterSlave&quot;,
+  "id" : "myDB",
+  "simpleFields" : {
+    "NUM_PARTITIONS" : "1",
+    "REPLICAS" : "2",
+    "STATE_MODEL_DEF_REF" : "MasterSlave",
   },
-  &quot;mapFields&quot; : {
-    &quot;myDB&quot; : {
-      &quot;N1&quot; : &quot;MASTER&quot;,
-      &quot;N2&quot; : &quot;SLAVE&quot;,
+  "mapFields" : {
+    "myDB" : {
+      "N1" : "MASTER",
+      "N2" : "SLAVE",
     }
   }
 }
@@ -335,21 +348,21 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
   </ul> 
   <div class="source"> 
    <pre><code>{
-  &quot;id&quot;:&quot;MyResource&quot;
-  ,&quot;simpleFields&quot;:{
-    ,&quot;SESSION_ID&quot;:&quot;13d0e34675e0002&quot;
-    ,&quot;INSTANCE_NAME&quot;:&quot;node1&quot;
-    ,&quot;STATE_MODEL_DEF&quot;:&quot;MasterSlave&quot;
+  "id":"MyResource"
+  ,"simpleFields":{
+    ,"SESSION_ID":"13d0e34675e0002"
+    ,"INSTANCE_NAME":"node1"
+    ,"STATE_MODEL_DEF":"MasterSlave"
   }
-  ,&quot;mapFields&quot;:{
-    &quot;MyResource_0&quot;:{
-      &quot;CURRENT_STATE&quot;:&quot;SLAVE&quot;
+  ,"mapFields":{
+    "MyResource_0":{
+      "CURRENT_STATE":"SLAVE"
     }
-    ,&quot;MyResource_1&quot;:{
-      &quot;CURRENT_STATE&quot;:&quot;MASTER&quot;
+    ,"MyResource_1":{
+      "CURRENT_STATE":"MASTER"
     }
-    ,&quot;MyResource_2&quot;:{
-      &quot;CURRENT_STATE&quot;:&quot;MASTER&quot;
+    ,"MyResource_2":{
+      "CURRENT_STATE":"MASTER"
     }
   }
 }
@@ -362,22 +375,22 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
   <p>In order to communicate with the participants, external clients need to 
know the current state of each of the participants. The external clients are 
referred to as <b>spectators</b>. In order to make the life of spectator 
simple, Helix provides an ExternalView that is an aggregated view of the 
current state across all nodes. The ExternalView has a similar format as 
IdealState.</p> 
   <div class="source"> 
    <pre><code>{
-  &quot;id&quot;:&quot;MyResource&quot;,
-  &quot;mapFields&quot;:{
-    &quot;MyResource_0&quot;:{
-      &quot;N1&quot;:&quot;SLAVE&quot;,
-      &quot;N2&quot;:&quot;MASTER&quot;,
-      &quot;N3&quot;:&quot;OFFLINE&quot;
+  "id":"MyResource",
+  "mapFields":{
+    "MyResource_0":{
+      "N1":"SLAVE",
+      "N2":"MASTER",
+      "N3":"OFFLINE"
     },
-    &quot;MyResource_1&quot;:{
-      &quot;N1&quot;:&quot;MASTER&quot;,
-      &quot;N2&quot;:&quot;SLAVE&quot;,
-      &quot;N3&quot;:&quot;ERROR&quot;
+    "MyResource_1":{
+      "N1":"MASTER",
+      "N2":"SLAVE",
+      "N3":"ERROR"
     },
-    &quot;MyResource_2&quot;:{
-      &quot;N1&quot;:&quot;MASTER&quot;,
-      &quot;N2&quot;:&quot;SLAVE&quot;,
-      &quot;N3&quot;:&quot;SLAVE&quot;
+    "MyResource_2":{
+      "N1":"MASTER",
+      "N2":"SLAVE",
+      "N3":"SLAVE"
     }
   }
 }
@@ -408,7 +421,7 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
   <p>Helix allows various granularities of control for adjusting the ideal 
state. Whenever a cluster event occurs, Helix can operate in one of three 
modes:</p> 
   <ul> 
    <li><b>FULL_AUTO</b>: Helix will automatically determine the location and 
state of each replica based on constraints</li> 
-   <li><b>SEMI_AUTO</b>: Helix will take in a &quot;preference list&quot; 
representing the location each replica can live at, and automatically determine 
the state based on constraints</li> 
+   <li><b>SEMI_AUTO</b>: Helix will take in a "preference list" representing 
the location each replica can live at, and automatically determine the state 
based on constraints</li> 
    <li><b>CUSTOMIZED</b>: Helix will take in a map of location to state and 
fire transitions to get the external view to match</li> 
   </ul> 
   <p>Helix comes with a few algorithms to automatically compute the IdealState 
based on the constraints. For example, if you have a resource of 3 partitions 
and 2 replicas, Helix can automatically compute the IdealState based on the 
nodes that are currently active. See the <a 
href="./0.6.4-docs/tutorial_rebalance.html">tutorial</a> to find out more about 
various execution modes of Helix like FULL_AUTO, SEMI_AUTO and CUSTOMIZED.</p> 
@@ -534,7 +547,7 @@ MASTER  | SLAVE    | SLAVE  |   N/A   |
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/IRC.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/IRC.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/IRC.html (original)
+++ helix/site-content/IRC.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-irc project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -181,8 +194,7 @@ under the License.
  <p>We're often available on the <code>#apachehelix</code> channel on the 
<code>chat.freenode.net</code> server. You can use your favorite IRC client or 
the web client below to connect.</p> 
  <section> 
   <h3 id="Web_IRC_Client">Web IRC Client</h3> 
-  <p>To connect to our channel, just enter a username below.</p> 
-  <iframe src="http://webchat.freenode.net/?channels=apachehelix"; 
style="width: 100%; height: 500px; border: 
none;"></iframe>&lt;/section&gt;&lt;/section&gt; 
+  <p>To connect to our channel, just enter a username below.</p> <iframe 
src="http://webchat.freenode.net/?channels=apachehelix"; style="width: 100%; 
height: 500px; border: none;"></iframe> 
  </section> 
 </section>
                        </div>
@@ -305,7 +317,7 @@ under the License.
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/Publications.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/Publications.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/Publications.html (original)
+++ helix/site-content/Publications.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-publications project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -317,7 +330,7 @@ under the License.
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/UseCases.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/UseCases.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/UseCases.html (original)
+++ helix/site-content/UseCases.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-usecases project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -245,7 +258,7 @@ ONLINE  |  OFFLINE |   N/A  |
  <p>LinkedIn�s Search-as-a-service lets internal customers define custom 
indexes on a chosen dataset and then makes those indexes searchable via a 
service API. The index service runs on a cluster of machines. The index is 
broken into partitions and each partition has a configured number of replicas. 
Each cluster server runs an instance of the Sensei system (an online index 
store) and hosts index partitions. Each new indexing service gets assigned to a 
set of servers, and the partition replicas must be evenly distributed across 
those servers.</p> 
  <section> 
   <h3 id="State_model">State model</h3> 
-  <p><img src="images/bootstrap_statemodel.gif" alt="Helix Design" /></p> 
+  <p><img src="images/bootstrap_statemodel.gif" alt="Helix Design"></p> 
  </section> 
 </section>
                        </div>
@@ -368,7 +381,7 @@ ONLINE  |  OFFLINE |   N/A  |
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/design/crush-ed.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/design/crush-ed.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/design/crush-ed.html (original)
+++ helix/site-content/design/crush-ed.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -29,24 +35,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-design-crush-ed project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -180,11 +193,11 @@
   </ul> </li> 
 </ul> 
 <h1>Overview</h1> 
-<p>CRUSH (or MultiRoundCRUSH)&nbsp;algorithm ensures consistent partition 
distribution. It is based on pseudo-random partition placement.&nbsp; When the 
number of placed items (in our case the partitions) approaches infinity, the 
distribution approaches perfectly uniform.<br /> However, it behaves the worst 
with a small number of placed items.&nbsp; Especially, for those single tenant 
clusters with a small number of partitions, we may experience un-evenly 
partition distributions over instances in the cluster.<br /> According to the 
data we collected from our PROD environment, distribution calculated 
by&nbsp;CRUSH is not satisfying. About 50% difference between the heavy loaded 
nodes and the light loaded nodes. Even with MultiRoundCRUSH, the difference is 
still about 30%.</p> 
+<p>CRUSH (or MultiRoundCRUSH)&nbsp;algorithm ensures consistent partition 
distribution. It is based on pseudo-random partition placement.&nbsp; When the 
number of placed items (in our case the partitions) approaches infinity, the 
distribution approaches perfectly uniform.<br> However, it behaves the worst 
with a small number of placed items.&nbsp; Especially, for those single tenant 
clusters with a small number of partitions, we may experience un-evenly 
partition distributions over instances in the cluster.<br> According to the 
data we collected from our PROD environment, distribution calculated 
by&nbsp;CRUSH is not satisfying. About 50% difference between the heavy loaded 
nodes and the light loaded nodes. Even with MultiRoundCRUSH, the difference is 
still about 30%.</p> 
 <p>Alternatively, card dealing strategy generates more even distribution in 
this cases. However, comparing it with CRUSH, there will be much more extra 
partition movements (&nbsp;A movement is “extra” if the host instance has 
one partition out and another partition in) when the cluster topology is 
changed.&nbsp;The legacy AutoRebalanceStrategy, which is also based on card 
dealing, resolves this issue by taking the current mapping as an input. And it 
only changes the mapping for the delta part. It means the algorithm is not 
deterministic. Worse, it does not support fault zone configuration. So legacy 
AutoRebalanceStrategy is not an option.</p> 
 <p>Given a deterministic algorithm is required, we find load balance and 
minimal partition movements are hard to achieve at the same time. A trade-off 
between uniform distribution and partition movements during cluster changes is 
needed.</p> 
-<p>In this document, we propose a hybrid algorithm based on CRUSH that ensures 
both&nbsp;even distribution and minimized extra partition movement. We call it 
CRUSH-ed.<br /> The basic idea is running additional rounds of re-balance on 
the uneven partitions.&nbsp;Note that CRUSH-ed guarantees stability 
(deterministic) and is fault zone aware.</p> 
-<p>According to our experiments, CRUSH-ed results in a much more uniform 
distribution and very few extra partition movements (when nodes are 
changed&nbsp;unexpectedly) compared with the original CRUSH. The cost is 
additional run time for the re-assigning calculation.<br /> We think CRUSH-ed 
can to achieve better partition assignment in most of the cases.</p> 
+<p>In this document, we propose a hybrid algorithm based on CRUSH that ensures 
both&nbsp;even distribution and minimized extra partition movement. We call it 
CRUSH-ed.<br> The basic idea is running additional rounds of re-balance on the 
uneven partitions.&nbsp;Note that CRUSH-ed guarantees stability (deterministic) 
and is fault zone aware.</p> 
+<p>According to our experiments, CRUSH-ed results in a much more uniform 
distribution and very few extra partition movements (when nodes are 
changed&nbsp;unexpectedly) compared with the original CRUSH. The cost is 
additional run time for the re-assigning calculation.<br> We think CRUSH-ed can 
to achieve better partition assignment in most of the cases.</p> 
 <h1>Design</h1> 
 <p>In general, we have 2 goals:</p> 
 <ol style="list-style-type: decimal"> 
@@ -192,26 +205,26 @@
  <li>Minimize partition movements when nodes are changed.</li> 
 </ol> 
 <p>CRUSH has very small movement count, but the distribution is not 
optimal.</p> 
-<p>As for MultiRound-CRUSH, it is designed for even distribution. The idea is 
running CRUSH multiple times. Each time the CRUSH will only be applied to the 
spiking part. So the distribution would eventually converge to even 
distribution.<br /> However, the number of iterations that are required is not 
guaranteed. And there will be more partition movements when the topology of the 
nodes is changed. As a result, it more or less fails both goals. Still not 
ideal.</p> 
-<p>Since we already have a good base, we built CRUSH-ed based on CRUSH. It 
changes the uneven partition assignment generated by CRUSH as following.<br /> 
Note that blue part should keep unchanged before and after.</p> 
+<p>As for MultiRound-CRUSH, it is designed for even distribution. The idea is 
running CRUSH multiple times. Each time the CRUSH will only be applied to the 
spiking part. So the distribution would eventually converge to even 
distribution.<br> However, the number of iterations that are required is not 
guaranteed. And there will be more partition movements when the topology of the 
nodes is changed. As a result, it more or less fails both goals. Still not 
ideal.</p> 
+<p>Since we already have a good base, we built CRUSH-ed based on CRUSH. It 
changes the uneven partition assignment generated by CRUSH as following.<br> 
Note that blue part should keep unchanged before and after.</p> 
 <p>Before (CRUSH)</p> 
-<p><img src="images/design/crushed/214844314.png" alt="Before (CRUSH)" /></p> 
+<p><img src="images/design/crushed/214844314.png" alt="Before (CRUSH)"></p> 
 <p>After (new strategy)</p> 
-<p><img src="images/design/crushed/214844313.png" alt="After (new strategy)" 
/></p> 
-<p>Since the problem is NP-hard. We are not expecting the best assignment. A 
greedy algorithm works good enough.<br /> After we tried different designs, we 
find it's hard to achieve both goals (even distribution and fewer movements) 
using a single strategy. So we decided to apply a hybrid algorithm that 
finishes the work step by step.</p> 
-<p><b>Step 1, run CRUSH to get a base assignment.</b><br /> The base 
assignment usually contains a certain number of uneven partitions, so we need 
the following steps to re-distribute them.</p> 
-<p><b>Step 2, run a card dealing algorithm on the uneven parts.</b><br /> And 
assign them to idle nodes. This algorithm is conceptually simple. The result 
ensures that all partitions are assigned to instances with minimum difference. 
Note that when fault zone joins the game, our greedy algorithm may not be able 
to calculate possible results because the candidate assignment may have fault 
zone conflict. So we add the buffer to tolerate small uneven assignment.</p> 
+<p><img src="images/design/crushed/214844313.png" alt="After (new 
strategy)"></p> 
+<p>Since the problem is NP-hard. We are not expecting the best assignment. A 
greedy algorithm works good enough.<br> After we tried different designs, we 
find it's hard to achieve both goals (even distribution and fewer movements) 
using a single strategy. So we decided to apply a hybrid algorithm that 
finishes the work step by step.</p> 
+<p><b>Step 1, run CRUSH to get a base assignment.</b><br> The base assignment 
usually contains a certain number of uneven partitions, so we need the 
following steps to re-distribute them.</p> 
+<p><b>Step 2, run a card dealing algorithm on the uneven parts.</b><br> And 
assign them to idle nodes. This algorithm is conceptually simple. The result 
ensures that all partitions are assigned to instances with minimum difference. 
Note that when fault zone joins the game, our greedy algorithm may not be able 
to calculate possible results because the candidate assignment may have fault 
zone conflict. So we add the buffer to tolerate small uneven assignment.</p> 
 <p>Example of assignments after step 2,</p> 
-<p><img src="images/design/crushed/214844288.png" alt="Example" /></p> 
-<p><b>Step 3, Shuffle partitions' preference lists.</b><br /> Since replica 
states are assigned according to node order in these lists, if the lists are 
randomly ordered, the states will also be random. This may cause uneven states 
distribution.<br /> To resolve this issue, before the final step 4, CRUSH-ed 
executes a simpler version card dealing algorithm on replica's order to shuffle 
them in each preference list. This operation results in a much evener state 
distribution.</p> 
+<p><img src="images/design/crushed/214844288.png" alt="Example"></p> 
+<p><b>Step 3, Shuffle partitions' preference lists.</b><br> Since replica 
states are assigned according to node order in these lists, if the lists are 
randomly ordered, the states will also be random. This may cause uneven states 
distribution.<br> To resolve this issue, before the final step 4, CRUSH-ed 
executes a simpler version card dealing algorithm on replica's order to shuffle 
them in each preference list. This operation results in a much evener state 
distribution.</p> 
 <p>Example of master distribution before step 3,</p> 
-<p><img src="images/design/crushed/214844287.png" alt="Example" /></p> 
+<p><img src="images/design/crushed/214844287.png" alt="Example"></p> 
 <p>Example of master distribution after step 3,</p> 
-<p><img src="images/design/crushed/214844286.png" alt="Example" /></p> 
-<p><b>Step 4, re-calculate the assignment for the partitions on temporarily 
disabled nodes using a consistent hashing algorithm.</b><br /> Consistent 
hashing can ensure minimize partition movement.<br /> Note that the first 3 
steps are using full node list, regardless of disabled or offline nodes. So the 
assignment will be stable even the algorithm contains random factors such 
hashCode. Then step 4 ensures all the disabled nodes are handled correctly 
without causing huge partition movements.</p> 
+<p><img src="images/design/crushed/214844286.png" alt="Example"></p> 
+<p><b>Step 4, re-calculate the assignment for the partitions on temporarily 
disabled nodes using a consistent hashing algorithm.</b><br> Consistent hashing 
can ensure minimize partition movement.<br> Note that the first 3 steps are 
using full node list, regardless of disabled or offline nodes. So the 
assignment will be stable even the algorithm contains random factors such 
hashCode. Then step 4 ensures all the disabled nodes are handled correctly 
without causing huge partition movements.</p> 
 <p>Assume the first node is down, after step 4, the final assignment and 
master distribution are as following. Note that there is no assignment on the 
first node anymore.</p> 
-<p><img src="images/design/crushed/214844285.png" alt="Example" /></p> 
-<p>One potential issue of using intuitive algorithm is not converging. In this 
case, CRUSH-ed falls back to CRUSH.<br /> Pseudocode is listed below.</p> 
+<p><img src="images/design/crushed/214844285.png" alt="Example"></p> 
+<p>One potential issue of using intuitive algorithm is not converging. In this 
case, CRUSH-ed falls back to CRUSH.<br> Pseudocode is listed below.</p> 
 <p><b>Pseudo Code</b></p> 
 <div class="source"> 
  <pre><code>// Round 1: Calculate mapping using the base strategy.
@@ -244,7 +257,7 @@ if (!nodeToPartitionMap.isEmpty()) {
 </code></pre> 
 </div> 
 <p>The re-assigning logic is generic and can be applied to any algorithms. So 
we created an abstract class for common logic. And then create strategy classes 
for Helix users. The Java class diagram looks like following.</p> 
-<p><img src="images/design/crushed/214844307.png" alt="Example" /></p> 
+<p><img src="images/design/crushed/214844307.png" alt="Example"></p> 
 <section> 
  <section> 
   <h3 id="Cap_of.C2.A0difference_participant_load_using_CRUSH-ed">Cap 
of&nbsp;difference participant load using CRUSH-ed</h3> 
@@ -252,7 +265,7 @@ if (!nodeToPartitionMap.isEmpty()) {
  </section> 
  <section> 
   <h3 
id="Not_a_global_uniform_distribution_solution_that_considers_node_capacity">Not
 a global uniform distribution solution that considers node capacity</h3> 
-  <p>Global distribution algorithm requires the algorithm takes other 
resources' partition distribution as part of the input. Since this related the 
distribution of all resources, the distribution would be very unstable. Any 
change in any resource will change it. As a result, 
the&nbsp;rebalance&nbsp;process may lead to a large number of partition 
movement.<br /> Therefore, the solution in this document cannot be used to 
calculate global uniform distribution, neither node capacity aware 
throttling.<br /> This requirement would be investigated in another initiative. 
Please refer to future works.</p> 
+  <p>Global distribution algorithm requires the algorithm takes other 
resources' partition distribution as part of the input. Since this related the 
distribution of all resources, the distribution would be very unstable. Any 
change in any resource will change it. As a result, 
the&nbsp;rebalance&nbsp;process may lead to a large number of partition 
movement.<br> Therefore, the solution in this document cannot be used to 
calculate global uniform distribution, neither node capacity aware 
throttling.<br> This requirement would be investigated in another initiative. 
Please refer to future works.</p> 
   <h1>Experiment</h1> 
   <p>We tested CRUSH-ed by simulating rebalancing using real product clusters 
topology data. And we tested multiple scenarios:</p> 
   <ul> 
@@ -261,54 +274,54 @@ if (!nodeToPartitionMap.isEmpty()) {
    <li>Adding hosts to simulate expansion.</li> 
    <li>Rolling upgrade.</li> 
   </ul> 
-  <p>All results show that CRUSH-ed generates more uniform global distribution 
compared with CRUSH.<br /> Moreover, partition movements in most scenarios are 
minimized. Except for hosts expansion case. Which can be controlled by 
configuring state transition throttling.</p> 
+  <p>All results show that CRUSH-ed generates more uniform global distribution 
compared with CRUSH.<br> Moreover, partition movements in most scenarios are 
minimized. Except for hosts expansion case. Which can be controlled by 
configuring state transition throttling.</p> 
  </section> 
 </section> 
 <section> 
  <h2 id="Partition_Distribution">Partition Distribution</h2> 
- <p>Following charts demonstrate the worst cases (min load vs. max load) and 
STDEVs of partition/master distributions of several Espresso PROD clusters.<br 
/> If we measure the improvement by STDEV, CRUSH-ed reduces the partition 
distribution unevenness by 87% on average compared with CRUSH. And for master 
replica distribution, the evenness improvement is 68% on average and 81% in 
maximum.</p> 
- <p><img src="images/design/crushed/214844302.png" alt="Example" /><img 
src="images/design/crushed/214844301.png" alt="Example" /></p> 
- <p><img src="images/design/crushed/214844298.png" alt="Example" /><img 
src="images/design/crushed/214844297.png" alt="Example" /></p> 
- <p>In addition, even for the clusters that already have good distribution 
using CRUSH, their real resource usage might be uneven because of partitions 
size variance.<br /> For example, Venice-0 has more than 50k replicas. So even 
with CRUSH, partition distribution is already good, STDEV is 32.<br /> However, 
because the partitions are quite different in storage usage, nodes' storage 
usage STDEV is 222. Max disk usage is about 2956GB.</p> 
- <p>Then, if using CRUSH-ed, the partition distribution is improved a little 
bit, STDEV is 6.<br /> Moreover, since all the resources have a uniform 
distribution, total storage usage is much evener compared with CRUSH. STDEV is 
30. And max disk usage is about 2644GB.</p> 
+ <p>Following charts demonstrate the worst cases (min load vs. max load) and 
STDEVs of partition/master distributions of several Espresso PROD clusters.<br> 
If we measure the improvement by STDEV, CRUSH-ed reduces the partition 
distribution unevenness by 87% on average compared with CRUSH. And for master 
replica distribution, the evenness improvement is 68% on average and 81% in 
maximum.</p> 
+ <p><img src="images/design/crushed/214844302.png" alt="Example"><img 
src="images/design/crushed/214844301.png" alt="Example"></p> 
+ <p><img src="images/design/crushed/214844298.png" alt="Example"><img 
src="images/design/crushed/214844297.png" alt="Example"></p> 
+ <p>In addition, even for the clusters that already have good distribution 
using CRUSH, their real resource usage might be uneven because of partitions 
size variance.<br> For example, Venice-0 has more than 50k replicas. So even 
with CRUSH, partition distribution is already good, STDEV is 32.<br> However, 
because the partitions are quite different in storage usage, nodes' storage 
usage STDEV is 222. Max disk usage is about 2956GB.</p> 
+ <p>Then, if using CRUSH-ed, the partition distribution is improved a little 
bit, STDEV is 6.<br> Moreover, since all the resources have a uniform 
distribution, total storage usage is much evener compared with CRUSH. STDEV is 
30. And max disk usage is about 2644GB.</p> 
  <p>Given the host resource is reserved according to max usage, CRUSH-ed can 
save (2956 - 2644) / 2956 = 10.5% cost.</p> 
- <p><img src="images/design/crushed/214844300.png" alt="Example" /><img 
src="images/design/crushed/214844299.png" alt="Example" /></p> 
+ <p><img src="images/design/crushed/214844300.png" alt="Example"><img 
src="images/design/crushed/214844299.png" alt="Example"></p> 
 </section> 
 <section> 
  <h2 id="Disabling_Nodes">Disabling Nodes</h2> 
- <p>When nodes are offline or disabled, CRUSH-ed will re-assigned the 
partitions to other live nodes. The algorithm ensures only moving the necessary 
partitions.<br /> We simulated disabling a certain number of nodes, and check 
the changes regarding partition movement and master changes. We also used the 
expected movement (the partitions/masters count on the disabled nodes) as a 
baseline to measure if any extra movements happen.</p> 
+ <p>When nodes are offline or disabled, CRUSH-ed will re-assigned the 
partitions to other live nodes. The algorithm ensures only moving the necessary 
partitions.<br> We simulated disabling a certain number of nodes, and check the 
changes regarding partition movement and master changes. We also used the 
expected movement (the partitions/masters count on the disabled nodes) as a 
baseline to measure if any extra movements happen.</p> 
  <p>The results show that movement is highly correlated to the portion of 
disabled nodes. And extra movements are minor (in most cases 0 movements).</p> 
  <p>Note that <b>Rate</b> in this document is <b>the changed number / total 
partition or master count</b>.</p> 
- <p><img src="images/design/crushed/214844296.png" alt="Example" /><img 
src="images/design/crushed/214844295.png" alt="Example" /></p> 
+ <p><img src="images/design/crushed/214844296.png" alt="Example"><img 
src="images/design/crushed/214844295.png" alt="Example"></p> 
 </section> 
 <section> 
  <h2 id="Rolling_upgrade">Rolling upgrade</h2> 
- <p>Rolling upgrade is different from disabling nodes. Since nodes are reset 
one by one, in this test we assume the difference could be 2 nodes in maximum 
(for example, upgrading Node A then upgrading Node B).<br /> In this case, 
movements are still minimized.</p> 
- <p>Note that in real PROD clusters, since admin can set delayed scheduler, 
there won't be movement at all.<br /> Following chart shows the maximum 
recorded movements or master changes during the whole rolling upgrade process. 
Even with the worst case, extra partition movements and master changes are 
close to 0%.<br /> <img src="images/design/crushed/214844289.png" alt="Example" 
/></p> 
+ <p>Rolling upgrade is different from disabling nodes. Since nodes are reset 
one by one, in this test we assume the difference could be 2 nodes in maximum 
(for example, upgrading Node A then upgrading Node B).<br> In this case, 
movements are still minimized.</p> 
+ <p>Note that in real PROD clusters, since admin can set delayed scheduler, 
there won't be movement at all.<br> Following chart shows the maximum recorded 
movements or master changes during the whole rolling upgrade process. Even with 
the worst case, extra partition movements and master changes are close to 
0%.<br> <img src="images/design/crushed/214844289.png" alt="Example"></p> 
 </section> 
 <section> 
  <h2 id="Adding_Nodes">Adding Nodes</h2> 
- <p>Adding nodes (or cluster expansion) changes topology. CRUSH-ed leverages 
card dealing for evenness. So when topology changes, the movements would be 
much more than CRUSH.<br /> As we evaluated, the moved partitions are majority 
uneven ones.</p> 
- <p>According to our experiment using all Espresso clusters, the extra 
partition movement rate could be as much as 23%. And master changes could be as 
much as 58%.<br /> The percentage is still compared with total partition count 
or total master count.</p> 
+ <p>Adding nodes (or cluster expansion) changes topology. CRUSH-ed leverages 
card dealing for evenness. So when topology changes, the movements would be 
much more than CRUSH.<br> As we evaluated, the moved partitions are majority 
uneven ones.</p> 
+ <p>According to our experiment using all Espresso clusters, the extra 
partition movement rate could be as much as 23%. And master changes could be as 
much as 58%.<br> The percentage is still compared with total partition count or 
total master count.</p> 
  <p>Note the extra change rate is not correlated with the number of additional 
nodes. So our recommendation is finishing expansion in one operation so as to 
do only one partition shuffling.</p> 
- <p><img src="images/design/crushed/214844294.png" alt="Example" /></p> 
+ <p><img src="images/design/crushed/214844294.png" alt="Example"></p> 
 </section> 
 <section> 
  <h2 id="Algorithm_Performance">Algorithm Performance</h2> 
- <p>We compared CRUSH-ed with CRUSH algorithms using different instance 
numbers. The tests are executed multiple times and we recorded middle 
numbers.<br /> The results are shown as follows.</p> 
+ <p>We compared CRUSH-ed with CRUSH algorithms using different instance 
numbers. The tests are executed multiple times and we recorded middle 
numbers.<br> The results are shown as follows.</p> 
  <p>Note that CRUSH-ed does not cost much additional calculating time for 
regular rebalancing. In maximum, 30% more runtime compared with CRUSH. And it 
will be less than MultiRoundCRUSH.</p> 
- <p><img src="images/design/crushed/214844283.png" alt="Example" /><img 
src="images/design/crushed/214844284.png" alt="Example" /></p> 
+ <p><img src="images/design/crushed/214844283.png" alt="Example"><img 
src="images/design/crushed/214844284.png" alt="Example"></p> 
  <p>However, when there are nodes down since CRUSH-ed needs to run an 
additional consistent hashing based re-distribution, the calculating time will 
be much longer. More than 3 times compared with CRUSH.</p> 
- <p><img src="images/design/crushed/214844282.png" alt="Example" /></p> 
+ <p><img src="images/design/crushed/214844282.png" alt="Example"></p> 
  <p>With some <b>performance improvements</b>, such as using cache to avoid 
duplicate calculation, we achieved to greatly reduce CRUSH-ed's running time. 
According to our experiment, it is now close to MultiRound CRUSH.</p> 
- <p><img src="images/design/crushed/214844281.png" alt="Example" /></p> 
+ <p><img src="images/design/crushed/214844281.png" alt="Example"></p> 
 </section> 
 <section> 
  <h2 id="Additional_Tests_for_Corner_Cases">Additional Tests for Corner 
Cases</h2> 
  <p>These tests prove that the algorithm still works in the&nbsp;extreme 
cases.</p> 
  <p><b>ESPRESSO_IDENTITY</b></p> 
  <p>This cluster has only one resource. We get the distribution details for 
all 4 fabrics.</p> 
- <p><img src="images/design/crushed/214844292.png" alt="Example" /><img 
src="images/design/crushed/214844293.png" alt="Example" /><img 
src="images/design/crushed/214844291.png" alt="Example" /><img 
src="images/design/crushed/214844290.png" alt="Example" /></p> 
+ <p><img src="images/design/crushed/214844292.png" alt="Example"><img 
src="images/design/crushed/214844293.png" alt="Example"><img 
src="images/design/crushed/214844291.png" alt="Example"><img 
src="images/design/crushed/214844290.png" alt="Example"></p> 
  <section> 
   <section> 
    <h4 
id="a100_nodes.2C_100_resources_and_101_partitions_for_each_resource">100 
nodes, 100 resources and 101 partitions for each resource</h4> 
@@ -504,15 +517,15 @@ if (!nodeToPartitionMap.isEmpty()) {
   </ol> 
   <p><b>IdeaState SimpleFields Example</b></p> 
   <div class="source"> 
-   <pre><code>HELIX_ENABLED : &quot;true&quot;
-IDEAL\_STATE\_MODE : &quot;AUTO_REBALANCE&quot;
-REBALANCE\_MODE : &quot;FULL\_AUTO&quot;
-REBALANCE_STRATEGY : 
&quot;org.apache.helix.controller.rebalancer.strategy.CrushRebalanceStrategy&quot;
-MIN\_ACTIVE\_REPLICAS : &quot;0&quot;
-NUM_PARTITIONS : &quot;64&quot;
-REBALANCER\_CLASS\_NAME : 
&quot;org.apache.helix.controller.rebalancer.DelayedAutoRebalancer&quot;
-REPLICAS : &quot;1&quot;
-STATE\_MODEL\_DEF_REF : &quot;LeaderStandby&quot;
+   <pre><code>HELIX_ENABLED : "true"
+IDEAL\_STATE\_MODE : "AUTO_REBALANCE"
+REBALANCE\_MODE : "FULL\_AUTO"
+REBALANCE_STRATEGY : 
"org.apache.helix.controller.rebalancer.strategy.CrushRebalanceStrategy"
+MIN\_ACTIVE\_REPLICAS : "0"
+NUM_PARTITIONS : "64"
+REBALANCER\_CLASS\_NAME : 
"org.apache.helix.controller.rebalancer.DelayedAutoRebalancer"
+REPLICAS : "1"
+STATE\_MODEL\_DEF_REF : "LeaderStandby"
 </code></pre> 
   </div> 
   <h1>Future Works</h1> 
@@ -520,7 +533,7 @@ STATE\_MODEL\_DEF_REF : &quot;LeaderStan
 </section> 
 <section> 
  <h2 id="Instance_Level_Capacity_Limitation">Instance Level Capacity 
Limitation</h2> 
- <p>Currently, all resources are assigned separately.<br /> The pros of this 
design are&nbsp;that resources change won't cause existing partitions to be 
re-assigned.<br /> The cons are:</p> 
+ <p>Currently, all resources are assigned separately.<br> The pros of this 
design are&nbsp;that resources change won't cause existing partitions to be 
re-assigned.<br> The cons are:</p> 
  <ol style="list-style-type: decimal"> 
   <li>It's hard to ensure strict global uniform distribution.</li> 
   <li>Instance level capacity control is not possible given the algorithm 
doesn't have a global view of partition assignment.</li> 
@@ -528,7 +541,7 @@ STATE\_MODEL\_DEF_REF : &quot;LeaderStan
 </section> 
 <section> 
  <h2 
id="Rebalance_Algorithm_Takes_Partition_Weight_into_Consideration">Rebalance 
Algorithm Takes Partition Weight into Consideration</h2> 
- <p>This algorithm still considers all partitions to be equally weighted. But 
in reality, different partitions may have different resource requirements.<br 
/> Application admins need to configure partition weight and Helix should 
assignment them accordingly.</p> 
+ <p>This algorithm still considers all partitions to be equally weighted. But 
in reality, different partitions may have different resource requirements.<br> 
Application admins need to configure partition weight and Helix should 
assignment them accordingly.</p> 
  <p>Note this feature only makes sense when it is applied to a global 
assignment algorithm since each partition in the same resource are weighted the 
same.</p> 
 </section>
                        </div>
@@ -651,7 +664,7 @@ STATE\_MODEL\_DEF_REF : &quot;LeaderStan
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>

Modified: helix/site-content/download.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/download.html?rev=1900255&r1=1900254&r2=1900255&view=diff
==============================================================================
--- helix/site-content/download.html (original)
+++ helix/site-content/download.html Mon Apr 25 08:18:23 2022
@@ -1,7 +1,13 @@
 
 <!DOCTYPE html>
+
+
+
+
+
+
 <!--
- Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 
2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin)
+ Generated by Apache Maven Doxia Rendered using Reflow Maven Skin 2.0.0 
(https://olamy.github.io/reflow-maven-skin)
 -->
 <html  xml:lang="en" lang="en">
 
@@ -30,24 +36,31 @@
                <![endif]-->
 
 
-               <script type="text/javascript">
-
-        var _gaq = _gaq || [];
-        _gaq.push(['_setAccount', 'UA-3211522-12']);
-        _gaq.push(['_trackPageview']);
 
-        (function() {
-        var ga = document.createElement('script'); ga.type = 
'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
-        })();
 
-      </script>
 
-       </head>
+    
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+                        _paq.push(['disableCookies']);
+                                    _paq.push(['trackPageView']);
+                                    _paq.push(['enableLinkTracking']);
+                    
+    (function() {
+        var u="https://analytics.apache.org";;
+        _paq.push(['setTrackerUrl', u+'/matomo.php']);
+        _paq.push(['setSiteId', '15']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+       </head>
 
        <body class="page-download project-website" data-spy="scroll" 
data-offset="60" data-target="#toc-scroll-target">
 
+    
                <div class="navbar navbar-fixed-top">
                        <div class="navbar-inner">
                                <div class="container">
@@ -179,15 +192,13 @@
 <section> 
  <h2 id="Current_Release">Current Release</h2> 
  <p>Release date: 04/30/2018 </p> 
- <p><a href="releasenotes/release-0.8.0.html">0.8.0 Release notes</a></p> 
- <a name="mirror"></a> 
+ <p><a href="releasenotes/release-0.8.0.html">0.8.0 Release notes</a></p> <a 
name="mirror"></a> 
  <section> 
   <h3 id="Mirror">Mirror</h3> 
-  <p> [if-any logo] <a href="[link]"> <img src="[logo]" align="right" 
border="0" alt="logo" /> </a> [end] The currently selected mirror is 
<b>[preferred]</b>. If you encounter a problem with this mirror, please select 
another mirror. If all mirrors are failing, there are <i>backup</i> mirrors (at 
the end of the mirrors list) that should be available. </p> 
+  <p> [if-any logo] <a href="[link]"> <img src="[logo]" align="right" 
border="0" alt="logo"> </a> [end] The currently selected mirror is 
<b>[preferred]</b>. If you encounter a problem with this mirror, please select 
another mirror. If all mirrors are failing, there are <i>backup</i> mirrors (at 
the end of the mirrors list) that should be available. </p> 
   <form action="[location]" method="get" id="SelectMirror" class="form-inline">
-    Other mirrors: 
-   <select name="Preferred" class="input-xlarge"> [if-any http] [for http] 
<option value="[http]">[http]</option> [end] [end] [if-any ftp] [for ftp] 
<option value="[ftp]">[ftp]</option> [end] [end] [if-any backup] [for backup] 
<option value="[backup]">[backup] (backup)</option> [end] [end] </select> 
-   <input type="submit" value="Change" class="btn" /> 
+    Other mirrors: <select name="Preferred" class="input-xlarge"> [if-any 
http] [for http] <option value="[http]">[http]</option> [end] [end] [if-any 
ftp] [for ftp] <option value="[ftp]">[ftp]</option> [end] [end] [if-any backup] 
[for backup] <option value="[backup]">[backup] (backup)</option> [end] [end] 
</select> 
+   <input type="submit" value="Change" class="btn"> 
   </form> 
   <p> You may also consult the <a class="externalLink" 
href="http://www.apache.org/mirrors/";>complete list of mirrors.</a> </p> 
  </section> 
@@ -263,12 +274,12 @@
   <pre>% pgpk -a KEYS
 % pgpv downloaded_file.asc</pre> 
  </div> or 
- <br /> 
+ <br> 
  <div class="source"> 
   <pre>% pgp -ka KEYS
 % pgp downloaded_file.asc</pre> 
  </div> or 
- <br /> 
+ <br> 
  <div class="source"> 
   <pre>% gpg --import KEYS
 % gpg --verify downloaded_file.asc</pre> 
@@ -400,7 +411,7 @@
                        <div class="span12">
                                <p class="pull-right"><a href="#">Back to 
top</a></p>
                                <p class="copyright">Copyright &copy;2022 <a 
href="https://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
-                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p>
+                               <p><a 
href="https://github.com/olamy/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy"; 
target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p>
                <div class="row span16"><div>Apache Helix, Apache, the Apache 
feather logo, and the Apache Helix project logos are trademarks of The Apache 
Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.</div>
         <a href="https://helix.apache.org/privacy-policy.html";>Privacy 
Policy</a>


Reply via email to