Added: helix/site-content/1.0.2-docs/tutorial_cloud_support.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/tutorial_cloud_support.html?rev=1890233&view=auto
==============================================================================
--- helix/site-content/1.0.2-docs/tutorial_cloud_support.html (added)
+++ helix/site-content/1.0.2-docs/tutorial_cloud_support.html Wed May 26 
21:09:44 2021
@@ -0,0 +1,473 @@
+
+<!DOCTYPE html>
+<!--
+ Generated by Apache Maven Doxia at 2021-05-26
+ Rendered using Maven Reflow Skin 1.0.0 
(http://andriusvelykis.github.com/reflow-maven-skin)
+-->
+<html  xml:lang="en" lang="en">
+
+       <head>
+               <meta charset="UTF-8" />
+               <title>Apache Helix -   Tutorial - Cloud Support</title>
+               <meta name="viewport" content="width=device-width, 
initial-scale=1.0" />
+               <meta name="description" content="" />
+               <meta http-equiv="content-language" content="en" />
+
+               <link href="./css/bootstrap.min.css" rel="stylesheet" />
+               <link href="./css/bootstrap-responsive.min.css" 
rel="stylesheet" />
+               <link href="./css/docs.css" rel="stylesheet" />
+               <link href="./css/reflow-skin.css" rel="stylesheet" />
+               
+               
+               <link href="./css/lightbox.css" rel="stylesheet" />
+               
+               <link href="./css/site.css" rel="stylesheet" />
+               <link href="./css/print.css" rel="stylesheet" media="print" />
+               
+               <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+               <!--[if lt IE 9]>
+                       <script 
src="http://html5shim.googlecode.com/svn/trunk/html5.js";></script>
+               <![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>
+
+       <body class="page-tutorial_cloud_support project-102-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">
+                                       <a class="btn btn-navbar" 
data-toggle="collapse" data-target=".nav-collapse">
+                                               <span class="icon-bar"></span>
+                                               <span class="icon-bar"></span>
+                                               <span class="icon-bar"></span>
+                                       </a>
+                                       <a class="brand" href="..">Apache 
Helix</a>
+                                       <div class="nav-collapse">
+                                               <ul class="nav pull-right">
+                                                       <li><a 
href="index.html" title="Helix 1.0.2">Helix 1.0.2 </a></li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Get Helix <b 
class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="download.html" title="Download">Download </a></li>
+                                                                       <li><a 
href="Building.html" title="Building">Building </a></li>
+                                                                       <li><a 
href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes 
</a></li>
+                                                               </ul>
+                                                       </li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Hands-On <b 
class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="Quickstart.html" title="Quick Start">Quick Start </a></li>
+                                                                       <li><a 
href="Tutorial.html" title="Tutorial">Tutorial </a></li>
+                                                                       <li><a 
href="../javadocs/1.0.2" title="Javadocs">Javadocs </a></li>
+                                                               </ul>
+                                                       </li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Recipes <b class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="recipes/lock_manager.html" title="Distributed lock manager">Distributed 
lock manager </a></li>
+                                                                       <li><a 
href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer 
group">Rabbit MQ consumer group </a></li>
+                                                                       <li><a 
href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file 
store">Rsync replicated file store </a></li>
+                                                                       <li><a 
href="recipes/service_discovery.html" title="Service discovery">Service 
discovery </a></li>
+                                                                       <li><a 
href="recipes/task_dag_execution.html" title="Distributed task DAG 
execution">Distributed task DAG execution </a></li>
+                                                               </ul>
+                                                       </li>
+                                               </ul>
+                                       </div><!--/.nav-collapse -->
+                               </div>
+                       </div>
+               </div>
+               
+       <div class="container">
+       
+       <!-- Masthead
+       ================================================== -->
+       <header class="jumbotron subhead">
+               <div class="row" id="banner">
+                       <div class="span12">
+                               <div class="pull-left">
+                                       <a href="../" id="bannerLeft"><img 
src="../images/helix-logo.jpg" alt='"''"' /></a>
+                                       <p class="lead">A cluster management 
framework for partitioned and replicated distributed resources</p>
+                               </div>
+                               <div class="pull-right">
+                                       <a href="http://www.apache.org/"; 
id="bannerRight"><img src="../images/feather_small.gif" alt='"''"' /></a>
+                               </div>
+                       </div>
+               </div>
+               <div>
+                       <ul class="breadcrumb">
+                               <li><a href="../" title="Apache Helix">Apache 
Helix </a></li>
+                               <li class="divider">/</li>
+                               <li><a href="./" title="Release 1.0.2">Release 
1.0.2 </a></li>
+                               <li class="divider">/</li>
+                               <li>  Tutorial - Cloud Support</li>
+                               <li class="publishDate version-date 
pull-right">Last Published: 2021-05-26</li>
+                       </ul>
+               </div>
+       </header>
+
+       <div class="main-body">
+       <div class="row">
+               <div class="span12">
+                       <div class="body-content">
+<!-- -
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License. --> 
+<p></p> 
+<div class="section"> 
+ <div class="page-header">
+  <h2 id="Helix_Tutorial:_Cloud_Support"><a href="./Tutorial.html">Helix 
Tutorial</a>: Cloud Support</h2>
+ </div> 
+ <p>There are emerging cases to use Helix in a cloud environment, especially 
in those well-known public cloud, e.g. Azure, AWS, GCP, etc. Compared to 
previous on premise use cases, Helix has faced both challenges and 
opportunities in providing cloud related support. </p> 
+ <p>As a first step, Helix implemented the support for participant auto 
registration in a cloud environment, which leverages the common feature of 
public cloud and facilitates Helix users when they need to create a cluster and 
register the participants to the cluster.</p> 
+ <p>After a Helix cluster is created, there are two ways to add instances (or 
participants, we will use them interchangeably in this tutorial) to the 
cluster. One is manual add, where users call their own scripts to add instance 
config to the cluster for each participant; and the other is auto join, where 
users set the auto join config of the cluster to be true, and each participant 
populates its own hostname, port number, and other information in instance 
config during connection. However, in an on premise environment, the auto join 
only works perfectly when users use Helix in a non rack-aware environment, 
meaning there is no fault domain concept. For a rack-aware environment, users 
still need to manually input the domain information to the instance config as 
it is hard for each participant to get its own fault domain information. 
Considering most users would use Helix in a rack-aware environment, it means 
manual work is still required.</p> 
+ <p>In a cloud environment, there is a good opportunity to achieve full 
automation as public cloud providers give domain information to each individual 
instance through a metadata endpoint. All of the above mentioned public cloud 
providers use a unique non-routable IP address (169.254.169.254) for this 
purpose. It can be accessed only from within the instance to retrieve the 
instance metadata information, which you can use to configure or manage the 
running instance. </p> 
+ <p>More specifically, in AWS, Azure, and GCP, the query to the fixed IP 
address <a class="externalLink" 
href="http://169.254.169.254/";>http://169.254.169.254/</a> inside each instance 
will return its metadata information that contains domain information. In AWS, 
the field is named as “placement”; in Azure, the field is named as 
“PlatformUpdateDomain”; and in GCP, the field is named as “zone”. It is 
usually just an integer denoting which fault domain the instance belongs to. 
This particular feature of public cloud is leveraged by Helix in cluster 
creation and partition registration process. </p> 
+ <div class="section"> 
+  <h3 id="What_Helix_Provides_for_Cloud_Environment">What Helix Provides for 
Cloud Environment</h3> 
+  <ul> 
+   <li>Provide definition of Helix cloud configs at cluster level and 
participant level</li> 
+   <li>Provide enhanced REST and Java APIs for cluster creation and cloud 
config update</li> 
+   <li>Provide generic interface for fetching and parsing cloud instance 
information</li> 
+   <li>Provide the implementation of Azure cloud instance information 
processor</li> 
+   <li>Provide the implementation of participant auto registration logic</li> 
+  </ul> 
+ </div> 
+ <div class="section"> 
+  <h3 id="How_to_Use_Cloud_Support">How to Use Cloud Support</h3> 
+  <p>First of all, you need to make sure that your environment is indeed a 
cloud environment. Otherwise, all the assumptions in this support will not 
hold. Then depending on what kind of cloud environment you are in, you will 
need to perform some or all of the following steps.</p> 
+  <div class="section"> 
+   <h4 id="Define_Cloud_config_at_Cluster_Level">Define Cloud config at 
Cluster Level</h4> 
+   <p>Helix provides cloud configs at two different levels, one is at cluster 
level, and the other is at participant level. We describe them separately.</p> 
+   <p>At cluster level, we have a new Znode called CloudConfig. It has a few 
fields that store the relatively static cloud information for the whole 
cluster. Similar to other existing configs, Helix provides cloud config 
builder, validation, get/set functions. As the following table shows, the first 
two fields are required, and the last three fields are optional. </p> 
+   <p><tt>CLOUD_ENABLED</tt> must be set to true if the user would like to use 
Helix cloud support. <tt>CLOUD_PROVIDER</tt> is the type of the cloud 
environment. Besides the few well-known public cloud providers, the user can 
also define his/her cloud environment as “CUSTOMIZED”. <tt>CLOUD_ID</tt> is 
an optional field. It can be used to record any specific metadata information 
the user would like to record, e.g. the ID for the particular cluster inside a 
cloud environment, etc. If the user chooses to use the provider that already 
has default implementations in Helix, e.g., Azure, he does not need to provide 
the last two fields, as Helix already provides the default value for these two 
fields in system property, which is considered as a bundle with Azure 
implementation that would be discussed later. If the user uses customized 
providers, or chooses some other cloud environment that has not been 
implemented in Helix yet, the user needs to provide the last two fields and/or <
 tt>CLOUD_ID</tt> depending on his/her usage. </p> 
+   <table border="0" class="bodyTable table table-striped table-hover"> 
+    <thead> 
+     <tr class="a"> 
+      <th>Field </th> 
+      <th>Meaning </th> 
+     </tr> 
+    </thead> 
+    <tbody> 
+     <tr class="b"> 
+      <td>CLOUD_ENABLED </td> 
+      <td>determine whether the cluster is inside cloud environment and use 
Helix cloud support </td> 
+     </tr> 
+     <tr class="a"> 
+      <td>CLOUD_PROVIDER </td> 
+      <td>denote what kind of cloud environment the cluster is in, e.g. Azure, 
AWS, GCP, or CUSTOMIZED </td> 
+     </tr> 
+     <tr class="b"> 
+      <td>CLOUD_ID </td> 
+      <td>the specific id in cloud environment that belongs to this cluster 
</td> 
+     </tr> 
+     <tr class="a"> 
+      <td>CLOUD_INFO_SOURCE </td> 
+      <td>the source for retrieving the cloud information. </td> 
+     </tr> 
+     <tr class="b"> 
+      <td>CLOUD_INFO_PROCESSOR_NAME </td> 
+      <td>the name of the function that processes the fetching and parsing of 
cloud information </td> 
+     </tr> 
+    </tbody> 
+   </table> 
+   <p>Users could use either REST API or Java API to set these configs.</p> 
+   <div class="section"> 
+    <h5 id="REST_API_Examples">REST API Examples</h5> 
+    <p>Helix enhanced current cluster creation REST API as well as Java API 
with extra fields that represent cloud related input. For example, in the 
following modified <tt>createCluster</tt> API, <tt>addCloudConfig</tt> is a 
Boolean value denotes whether to create with cloud config, and the 
<tt>cloudConfigManifest</tt> is the cloud config string, which will be 
converted to a Znode record.</p> 
+    <div class="source"> 
+     <pre>@PUT
+  @Path(&quot;{clusterId}&quot;)
+  public Response createCluster(@PathParam(&quot;clusterId&quot;) String 
clusterId, @DefaultValue(&quot;false&quot;) @QueryParam(&quot;recreate&quot;) 
String recreate,
+      @DefaultValue(&quot;false&quot;) @QueryParam(&quot;addCloudConfig&quot;) 
String addCloudConfig, String cloudConfigManifest)
+</pre> 
+    </div> 
+    <p>Besides the enhanced cluster creation API, Helix also provides a set of 
cloud specific APIs in Java and REST that handles the get/add/update of cloud 
config. </p> 
+    <ul> 
+     <li>Create cluster and add meanwhile cloud config related information to 
ZK.</li> 
+    </ul> 
+    <div class="source"> 
+     <pre>$ curl -X PUT -H &quot;Content-Type: application/json&quot; 
http://localhost:1234/admin/v2/clusters/myCluster?addCloudConfig=true -d '
+{
+    &quot;simpleFields&quot; : 
+    {
+        &quot;CLOUD_ENABLED&quot; : &quot;true&quot;,
+        &quot;CLOUD_PROVIDER&quot;: &quot;AWS&quot;,
+        &quot;CLOUD_ID&quot; : &quot;12345&quot;
+        &quot;CLOUD_INFO_SOURCE&quot;: {&quot;http://169.254.169.254/&quot;}
+        &quot;CLOUD_INFO_PROCESSOR_NAME&quot;: 
&quot;AWSCloudInformationProcesser&quot;
+    }
+}'
+</pre> 
+    </div> 
+    <ul> 
+     <li>Add cloud config to an existing cluster</li> 
+    </ul> 
+    <div class="source"> 
+     <pre>$ curl -X PUT -H &quot;Content-Type: application/json&quot; 
http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig -d '
+{
+    &quot;simpleFields&quot; : 
+    {
+        &quot;CLOUD_ENABLED&quot; : &quot;true&quot;,
+        &quot;CLOUD_PROVIDER&quot;: &quot;AWS&quot;,
+        &quot;CLOUD_ID&quot; : &quot;12345&quot;
+        &quot;CLOUD_INFO_SOURCE&quot;: {&quot;http://169.254.169.254/&quot;}
+        &quot;CLOUD_INFO_PROCESSOR_NAME&quot;: 
&quot;AWSCloudInformationProcesser&quot;
+    }
+}'
+</pre> 
+    </div> 
+    <ul> 
+     <li>Delete the cloud config of a cluster</li> 
+    </ul> 
+    <div class="source"> 
+     <pre>$ curl -X DELETE 
http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig
+</pre> 
+    </div> 
+    <ul> 
+     <li>Get the cloud config of a cluster</li> 
+    </ul> 
+    <div class="source"> 
+     <pre>$ curl -X GET 
http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig
+</pre> 
+    </div> 
+    <ul> 
+     <li>Update the cloud config of a cluster</li> 
+    </ul> 
+    <div class="source"> 
+     <pre>$ curl -X POST -H &quot;Content-Type: application/json&quot;  
http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig?command=update -d 
'
+{
+    &quot;simpleFields&quot; : {
+        &quot;CLOUD_ID&quot; : &quot;12345&quot;
+    }
+}'
+</pre> 
+    </div> 
+    <ul> 
+     <li>Delete some of the fields in the cloud config</li> 
+    </ul> 
+    <div class="source"> 
+     <pre>$ curl -X POST -H &quot;Content-Type: application/json&quot; 
http://localhost:1234/admin/v2/clusters/myCluster/cloudconfig?command=delete -d 
'
+{
+    &quot;simpleFields&quot; : {
+        &quot;CLOUD_ID&quot; : &quot;12345&quot;
+    }
+}'
+</pre> 
+    </div> 
+   </div> 
+  </div> 
+  <div class="section"> 
+   <h4 id="Define_Cloud_Configs_at_Participant_Level">Define Cloud Configs at 
Participant Level</h4> 
+   <p>At participant level, Helix allows users to provide detailed cloud 
properties, which is more related to the participant’s actions. For default 
value, Helix provides <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/resources/azure-cloud.properties";>Azure
 cloud properties</a>, including not only the default cluster level config 
values for Azure, like <tt>CLOUD_INFO_SOURCE</tt> and 
<tt>CLOUD_INFO_PROCESSOR_NAME</tt>, but also some participant specific values, 
such as http timeout when querying AIMS (Azure Instance Metadata Service) in 
Azure, max retry times, etc. </p> 
+   <div class="source"> 
+    
<pre>cloud_info_source=http://169.254.169.254/metadata/instance?api-version=2019-06-04
+cloud_info_processor_name=AzureCloudInstanceInformationProcessor
+cloud_max_retry=5
+connection_timeout_ms=5000
+request_timeout_ms=5000
+</pre> 
+   </div> 
+   <p>If users would like to use their customized config for participants, 
they can input the specific properties through <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/HelixManagerProperty.java";>Helix
 Manager Property</a> when composing <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixManager.java";>Zk
 Helix Manager</a>, which is passed into participants. <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/HelixManagerProperty.java";>Helix
 Manager Property</a> includes <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/HelixCloudProperty.java";>Helix
 Cloud Property</a> which includes commonly used cloud properties and also any 
kind of user defined cloud properties.</p> 
+   <div class="source"> 
+    <pre>public ZKHelixManager(String clusterName, String instanceName, 
InstanceType instanceType,
+    String zkAddress, HelixManagerStateListener stateListener, 
HelixManagerProperty helixManagerProperty)
+</pre> 
+   </div> 
+  </div> 
+  <div class="section"> 
+   <h4 id="Implement_Cloud_Instance_Information_if_necessary">Implement Cloud 
Instance Information (if necessary)</h4> 
+   <p>Helix has predefined a few fields in the interface of <a 
class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/api/cloud/CloudInstanceInformation.java";>CloudInstanceInformation</a>
 that are commonly used in participant. Users are free to define other fields 
in the instance metadata that they think are useful. </p> 
+   <div class="source"> 
+    <pre>public interface CloudInstanceInformation {
+  /**
+   * Get the the value of a specific cloud instance field by name
+   * @return the value of the field
+   */
+  String get(String key);
+
+  /**
+   * The enum contains all the required cloud instance field in Helix
+   */
+  enum CloudInstanceField {
+    INSTANCE_NAME,
+    FAULT_DOMAIN,
+    INSTANCE_SET_NAME
+  }
+}
+</pre> 
+   </div> 
+  </div> 
+  <div class="section"> 
+   <h4 
id="Implement_Cloud_Instance_Information_Processor_if_necessary">Implement 
Cloud Instance Information Processor (if necessary)</h4> 
+   <p>Helix provides an interface to fetch and parse cloud instance 
information as follows. Helix makes the interface generic enough so that users 
may implement their own fetching and parsing logic with maximum freedom. </p> 
+   <div class="source"> 
+    <pre>/**
+ * Generic interface to fetch and parse cloud instance information
+ */
+public interface CloudInstanceInformationProcessor&lt;T extends Object&gt; {
+
+  /**
+   * Get the raw cloud instance information
+   * @return raw cloud instance information
+   */
+  List&lt;T&gt; fetchCloudInstanceInformation();
+
+  /**
+   * Parse the raw cloud instance information in responses and compose 
required cloud instance information
+   * @return required cloud instance information
+   */
+  CloudInstanceInformation parseCloudInstanceInformation(List&lt;T&gt; 
responses);
+}
+</pre> 
+   </div> 
+   <p>Helix also implements an example processor for Azure in <a 
class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/cloud/azure/AzureCloudInstanceInformationProcessor.java";>AzureCloudInstanceInformationProcessor</a>.
 The implementation includes fetching and parsing Azure cloud instance 
information. The fetching function retrieves instance information from Azure 
AIMS, and the parsing function validates the response, and selects the fields 
needed for participant auto registration. If users would like to use Helix in 
an Azure environment, they do not need to implement it by themselves. </p> 
+   <p>If users need to use Helix in another cloud environment, they can 
implement their own information processor. The implementation would be similar 
to Azure implementation, and the main difference would be in how to parse the 
response and retrieve interested fields. </p> 
+  </div> 
+  <div class="section"> 
+   <h4 id="Config_Properly_for_Participant_Auto_Registration_to_Work">Config 
Properly for Participant Auto Registration to Work</h4> 
+   <p>To make the participant auto registration work, users would need to make 
sure their cluster config is set properly. The most important one is the 
<tt>allowParticipantAutoJoin</tt> field in cluster config.</p> 
+   <div class="source"> 
+    <pre>{
+    &quot;id&quot;: &quot;clusterName&quot;,
+    &quot;listFields&quot;: {},
+    &quot;mapFields&quot;: {},
+    &quot;simpleFields&quot;: {
+        ......
+        &quot;allowParticipantAutoJoin&quot;: &quot;true&quot;
+        ......
+    }
+}
+</pre> 
+   </div> 
+   <p>This field is used in participant manager logic as a prerequisite for 
participants to do auto registration. The detailed logic is shown in the 
following flow chart. The related code is in <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/manager/zk/ParticipantManager.java";>Participant
 Manager</a>.</p> 
+   <p><img src="./images/ParticipantAutoRegistrationLogic.png" 
alt="Participant Auto Registration Logic" /></p> 
+   <p>If the participant decides that it should do auto registration based on 
the config, it will first query cloud config and decide what environment it is 
in. Based on this information, the participant will call the corresponding 
cloud instance information processor. Then with all the information, especially 
the domain information, the participant can auto register to the cluster 
without any manual effort.</p> 
+  </div> 
+ </div> 
+</div>
+                       </div>
+               </div>
+       </div>
+       </div>
+
+       </div><!-- /container -->
+       
+       <!-- Footer
+       ================================================== -->
+       <footer class="well">
+               <div class="container">
+                       <div class="row">
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li class="nav-header">Get 
Helix</li>
+                                               <li>
+                                                       <a href="download.html" 
title="Download">Download </a>
+                                               </li>
+                                               <li>
+                                                       <a href="Building.html" 
title="Building">Building </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li 
class="nav-header">Hands-On</li>
+                                               <li>
+                                                       <a 
href="Quickstart.html" title="Quick Start">Quick Start </a>
+                                               </li>
+                                               <li>
+                                                       <a href="Tutorial.html" 
title="Tutorial">Tutorial </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="../javadocs/1.0.2" title="Javadocs">Javadocs </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li 
class="nav-header">Recipes</li>
+                                               <li>
+                                                       <a 
href="recipes/lock_manager.html" title="Distributed lock manager">Distributed 
lock manager </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer 
group">Rabbit MQ consumer group </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file 
store">Rsync replicated file store </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/service_discovery.html" title="Service discovery">Service 
discovery </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/task_dag_execution.html" title="Distributed task DAG 
execution">Distributed task DAG execution </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                       </div>
+               </div>
+       </footer>
+               
+       <div class="container subfooter">
+               <div class="row">
+                       <div class="span12">
+                               <p class="pull-right"><a href="#">Back to 
top</a></p>
+                               <p class="copyright">Copyright &copy;2021 <a 
href="http://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
+                               <p><a 
href="http://github.com/andriusvelykis/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="http://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</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="http://helix.apache.org/1.0.2-docs/privacy-policy.html";>Privacy 
Policy</a>
+</div>                 </div>
+               </div>
+       </div>
+
+       <!-- Le javascript
+       ================================================== -->
+       <!-- Placed at the end of the document so the pages load faster -->
+
+       <!-- Fallback jQuery loading from Google CDN:
+            
http://stackoverflow.com/questions/1014203/best-way-to-use-googles-hosted-jquery-but-fall-back-to-my-hosted-library-on-go
 -->
+       <script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js";></script>
+       <script type="text/javascript">
+               if (typeof jQuery == 'undefined')
+               {
+                       document.write(unescape("%3Cscript 
src='./js/jquery-1.8.3.min.js' type='text/javascript'%3E%3C/script%3E"));
+               }
+       </script>
+       
+       <script src="./js/bootstrap.min.js"></script>
+       <script src="./js/lightbox.js"></script>
+       <script src="./js/jquery.smooth-scroll.min.js"></script>
+       <!-- back button support for smooth scroll -->
+       <script src="./js/jquery.ba-bbq.min.js"></script>
+
+       <script src="./js/reflow-skin.js"></script>
+       
+       </body>
+</html>
\ No newline at end of file

Added: helix/site-content/1.0.2-docs/tutorial_controller.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/tutorial_controller.html?rev=1890233&view=auto
==============================================================================
--- helix/site-content/1.0.2-docs/tutorial_controller.html (added)
+++ helix/site-content/1.0.2-docs/tutorial_controller.html Wed May 26 21:09:44 
2021
@@ -0,0 +1,374 @@
+
+<!DOCTYPE html>
+<!--
+ Generated by Apache Maven Doxia at 2021-05-26
+ Rendered using Maven Reflow Skin 1.0.0 
(http://andriusvelykis.github.com/reflow-maven-skin)
+-->
+<html  xml:lang="en" lang="en">
+
+       <head>
+               <meta charset="UTF-8" />
+               <title>Apache Helix -   Tutorial - Controller</title>
+               <meta name="viewport" content="width=device-width, 
initial-scale=1.0" />
+               <meta name="description" content="" />
+               <meta http-equiv="content-language" content="en" />
+
+               <link href="./css/bootstrap.min.css" rel="stylesheet" />
+               <link href="./css/bootstrap-responsive.min.css" 
rel="stylesheet" />
+               <link href="./css/docs.css" rel="stylesheet" />
+               <link href="./css/reflow-skin.css" rel="stylesheet" />
+               
+               
+               <link href="./css/lightbox.css" rel="stylesheet" />
+               
+               <link href="./css/site.css" rel="stylesheet" />
+               <link href="./css/print.css" rel="stylesheet" media="print" />
+               
+               <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+               <!--[if lt IE 9]>
+                       <script 
src="http://html5shim.googlecode.com/svn/trunk/html5.js";></script>
+               <![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>
+
+       <body class="page-tutorial_controller project-102-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">
+                                       <a class="btn btn-navbar" 
data-toggle="collapse" data-target=".nav-collapse">
+                                               <span class="icon-bar"></span>
+                                               <span class="icon-bar"></span>
+                                               <span class="icon-bar"></span>
+                                       </a>
+                                       <a class="brand" href="..">Apache 
Helix</a>
+                                       <div class="nav-collapse">
+                                               <ul class="nav pull-right">
+                                                       <li><a 
href="index.html" title="Helix 1.0.2">Helix 1.0.2 </a></li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Get Helix <b 
class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="download.html" title="Download">Download </a></li>
+                                                                       <li><a 
href="Building.html" title="Building">Building </a></li>
+                                                                       <li><a 
href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes 
</a></li>
+                                                               </ul>
+                                                       </li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Hands-On <b 
class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="Quickstart.html" title="Quick Start">Quick Start </a></li>
+                                                                       <li><a 
href="Tutorial.html" title="Tutorial">Tutorial </a></li>
+                                                                       <li><a 
href="../javadocs/1.0.2" title="Javadocs">Javadocs </a></li>
+                                                               </ul>
+                                                       </li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Recipes <b class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="recipes/lock_manager.html" title="Distributed lock manager">Distributed 
lock manager </a></li>
+                                                                       <li><a 
href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer 
group">Rabbit MQ consumer group </a></li>
+                                                                       <li><a 
href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file 
store">Rsync replicated file store </a></li>
+                                                                       <li><a 
href="recipes/service_discovery.html" title="Service discovery">Service 
discovery </a></li>
+                                                                       <li><a 
href="recipes/task_dag_execution.html" title="Distributed task DAG 
execution">Distributed task DAG execution </a></li>
+                                                               </ul>
+                                                       </li>
+                                               </ul>
+                                       </div><!--/.nav-collapse -->
+                               </div>
+                       </div>
+               </div>
+               
+       <div class="container">
+       
+       <!-- Masthead
+       ================================================== -->
+       <header class="jumbotron subhead">
+               <div class="row" id="banner">
+                       <div class="span12">
+                               <div class="pull-left">
+                                       <a href="../" id="bannerLeft"><img 
src="../images/helix-logo.jpg" alt='"''"' /></a>
+                                       <p class="lead">A cluster management 
framework for partitioned and replicated distributed resources</p>
+                               </div>
+                               <div class="pull-right">
+                                       <a href="http://www.apache.org/"; 
id="bannerRight"><img src="../images/feather_small.gif" alt='"''"' /></a>
+                               </div>
+                       </div>
+               </div>
+               <div>
+                       <ul class="breadcrumb">
+                               <li><a href="../" title="Apache Helix">Apache 
Helix </a></li>
+                               <li class="divider">/</li>
+                               <li><a href="./" title="Release 1.0.2">Release 
1.0.2 </a></li>
+                               <li class="divider">/</li>
+                               <li>  Tutorial - Controller</li>
+                               <li class="publishDate version-date 
pull-right">Last Published: 2021-05-26</li>
+                       </ul>
+               </div>
+       </header>
+
+       <div class="main-body">
+       <div class="row">
+               <div class="span12">
+                       <div class="body-content">
+<!-- -
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License. --> 
+<p></p> 
+<div class="section"> 
+ <div class="page-header">
+  <h2 id="Helix_Tutorial:_Controller"><a href="./Tutorial.html">Helix 
Tutorial</a>: Controller</h2>
+ </div> 
+ <p>Next, let's implement the controller. This is the brain of the cluster. 
Helix makes sure there is exactly one active controller running the 
cluster.</p> 
+ <div class="section"> 
+  <h3 id="Start_a_Connection">Start a Connection</h3> 
+  <p>The Helix manager requires the following parameters:</p> 
+  <ul> 
+   <li>clusterName: A logical name to represent the group of nodes</li> 
+   <li>instanceName: A logical name of the process creating the manager 
instance. Generally this is host:port</li> 
+   <li>instanceType: Type of the process. This can be one of the following 
types, in this case use CONTROLLER: 
+    <ul> 
+     <li>CONTROLLER: Process that controls the cluster, any number of 
controllers can be started but only one will be active at any given time</li> 
+     <li>PARTICIPANT: Process that performs the actual task in the distributed 
system</li> 
+     <li>SPECTATOR: Process that observes the changes in the cluster</li> 
+     <li>ADMIN: To carry out system admin actions</li> 
+    </ul></li> 
+   <li>zkConnectString: Connection string to ZooKeeper. This is of the form 
host1:port1,host2:port2,host3:port3</li> 
+  </ul> 
+  <div class="source"> 
+   <pre>manager = HelixManagerFactory.getZKHelixManager(clusterName,
+                                                instanceName,
+                                                instanceType,
+                                                zkConnectString);
+</pre> 
+  </div> 
+ </div> 
+ <div class="section"> 
+  <h3 id="Controller_Code">Controller Code</h3> 
+  <p>The Controller needs to know about all changes in the cluster. Helix 
takes care of this with the default implementation. If you need additional 
functionality, see GenericHelixController on how to configure the pipeline.</p> 
+  <div class="source"> 
+   <pre>manager = HelixManagerFactory.getZKHelixManager(clusterName,
+                                                instanceName,
+                                                InstanceType.CONTROLLER,
+                                                zkConnectString);
+manager.connect();
+</pre> 
+  </div> 
+  <p>The snippet above shows how the controller is started. You can also start 
the controller using command line interface.</p> 
+  <div class="source"> 
+   <pre>cd helix/helix-core/target/helix-core-pkg/bin
+./run-helix-controller.sh --zkSvr &lt;Zookeeper ServerAddress (Required)&gt;  
--cluster &lt;Cluster name (Required)&gt;
+</pre> 
+  </div> 
+ </div> 
+ <div class="section"> 
+  <h3 id="Controller_Deployment_Modes">Controller Deployment Modes</h3> 
+  <p>Helix provides multiple options to deploy the controller.</p> 
+  <div class="section"> 
+   <h4 id="STANDALONE">STANDALONE</h4> 
+   <p>The Controller can be started as a separate process to manage a cluster. 
This is the recommended approach. However, since one controller can be a single 
point of failure, multiple controller processes are required for reliability. 
Even if multiple controllers are running, only one will be actively managing 
the cluster at any time and is decided by a leader-election process. If the 
leader fails, another leader will take over managing the cluster.</p> 
+   <p>Even though we recommend this method of deployment, it has the drawback 
of having to manage an additional service for each cluster. See the Controller 
as a Service option.</p> 
+  </div> 
+  <div class="section"> 
+   <h4 id="EMBEDDED">EMBEDDED</h4> 
+   <p>If setting up a separate controller process is not viable, then it is 
possible to embed the controller as a library in each of the participants.</p> 
+  </div> 
+  <div class="section"> 
+   <h4 id="CONTROLLER_AS_A_SERVICE">CONTROLLER AS A SERVICE</h4> 
+   <p>One of the cool features we added in Helix was to use a set of 
controllers to manage a large number of clusters.</p> 
+   <p>For example if you have X clusters to be managed, instead of deploying 
X*3 (3 controllers for fault tolerance) controllers for each cluster, one can 
deploy just 3 controllers. Each controller can manage X/3 clusters. If any 
controller fails, the remaining two will manage X/2 clusters.</p> 
+   <p>Next, let's implement the controller. This is the brain of the cluster. 
Helix makes sure there is exactly one active controller running the 
cluster.</p> 
+  </div> 
+ </div> 
+ <div class="section"> 
+  <h3 id="Start_the_Helix_agent">Start the Helix agent</h3> 
+  <p>It requires the following parameters:</p> 
+  <ul> 
+   <li>clusterName: A logical name to represent the group of nodes</li> 
+   <li>instanceName: A logical name of the process creating the manager 
instance. Generally this is host:port.</li> 
+   <li>instanceType: Type of the process. This can be one of the following 
types, in this case use CONTROLLER: 
+    <ul> 
+     <li>CONTROLLER: Process that controls the cluster, any number of 
controllers can be started but only one will be active at any given time.</li> 
+     <li>PARTICIPANT: Process that performs the actual task in the distributed 
system.</li> 
+     <li>SPECTATOR: Process that observes the changes in the cluster.</li> 
+     <li>ADMIN: To carry out system admin actions.</li> 
+    </ul></li> 
+   <li>zkConnectString: Connection string to Zookeeper. This is of the form 
host1:port1,host2:port2,host3:port3.</li> 
+  </ul> 
+  <div class="source"> 
+   <pre>      manager = HelixManagerFactory.getZKHelixManager(clusterName,
+                                                      instanceName,
+                                                      instanceType,
+                                                      zkConnectString);
+</pre> 
+  </div> 
+ </div> 
+ <div class="section"> 
+  <h3 id="Controller_Code">Controller Code</h3> 
+  <p>The Controller needs to know about all changes in the cluster. Helix 
takes care of this with the default implementation. If you need additional 
functionality, see GenericHelixController on how to configure the pipeline.</p> 
+  <div class="source"> 
+   <pre>      manager = HelixManagerFactory.getZKHelixManager(clusterName,
+                                                          instanceName,
+                                                          
InstanceType.CONTROLLER,
+                                                          zkConnectString);
+     manager.connect();
+     GenericHelixController controller = new GenericHelixController();
+     manager.addControllerListener(controller);
+     manager.addInstanceConfigChangeListener(controller);
+     manager.addResourceConfigChangeListener(controller);
+     manager.addClusterfigChangeListener(controller);
+     manager.addCustomizedStateConfigChangeListener(controller);
+     manager.addLiveInstanceChangeListener(controller);
+     manager.addIdealStateChangeListener(controller);
+</pre> 
+  </div> 
+  <p>The snippet above shows how the controller is started. You can also start 
the controller using command line interface.</p> 
+  <div class="source"> 
+   <pre>cd helix/helix-core/target/helix-core-pkg/bin
+./run-helix-controller.sh --zkSvr &lt;Zookeeper ServerAddress (Required)&gt;  
--cluster &lt;Cluster name (Required)&gt;
+</pre> 
+  </div> 
+ </div> 
+ <div class="section"> 
+  <h3 id="Controller_Deployment_Modes">Controller Deployment Modes</h3> 
+  <p>Helix provides multiple options to deploy the controller.</p> 
+  <div class="section"> 
+   <h4 id="STANDALONE">STANDALONE</h4> 
+   <p>The Controller can be started as a separate process to manage a cluster. 
This is the recommended approach. However, since one controller can be a single 
point of failure, multiple controller processes are required for reliability. 
Even if multiple controllers are running, only one will be actively managing 
the cluster at any time and is decided by a leader-election process. If the 
leader fails, another leader will take over managing the cluster.</p> 
+   <p>Even though we recommend this method of deployment, it has the drawback 
of having to manage an additional service for each cluster. See Controller As a 
Service option.</p> 
+  </div> 
+  <div class="section"> 
+   <h4 id="EMBEDDED">EMBEDDED</h4> 
+   <p>If setting up a separate controller process is not viable, then it is 
possible to embed the controller as a library in each of the participants.</p> 
+  </div> 
+  <div class="section"> 
+   <h4 id="CONTROLLER_AS_A_SERVICE">CONTROLLER AS A SERVICE</h4> 
+   <p>One of the cool features we added in Helix is to use a set of 
controllers to manage a large number of clusters.</p> 
+   <p>For example if you have X clusters to be managed, instead of deploying 
X*3 (3 controllers for fault tolerance) controllers for each cluster, one can 
deploy just 3 controllers. Each controller can manage X/3 clusters. If any 
controller fails, the remaining two will manage X/2 clusters.</p> 
+  </div> 
+ </div> 
+</div>
+                       </div>
+               </div>
+       </div>
+       </div>
+
+       </div><!-- /container -->
+       
+       <!-- Footer
+       ================================================== -->
+       <footer class="well">
+               <div class="container">
+                       <div class="row">
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li class="nav-header">Get 
Helix</li>
+                                               <li>
+                                                       <a href="download.html" 
title="Download">Download </a>
+                                               </li>
+                                               <li>
+                                                       <a href="Building.html" 
title="Building">Building </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li 
class="nav-header">Hands-On</li>
+                                               <li>
+                                                       <a 
href="Quickstart.html" title="Quick Start">Quick Start </a>
+                                               </li>
+                                               <li>
+                                                       <a href="Tutorial.html" 
title="Tutorial">Tutorial </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="../javadocs/1.0.2" title="Javadocs">Javadocs </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li 
class="nav-header">Recipes</li>
+                                               <li>
+                                                       <a 
href="recipes/lock_manager.html" title="Distributed lock manager">Distributed 
lock manager </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer 
group">Rabbit MQ consumer group </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file 
store">Rsync replicated file store </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/service_discovery.html" title="Service discovery">Service 
discovery </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/task_dag_execution.html" title="Distributed task DAG 
execution">Distributed task DAG execution </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                       </div>
+               </div>
+       </footer>
+               
+       <div class="container subfooter">
+               <div class="row">
+                       <div class="span12">
+                               <p class="pull-right"><a href="#">Back to 
top</a></p>
+                               <p class="copyright">Copyright &copy;2021 <a 
href="http://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
+                               <p><a 
href="http://github.com/andriusvelykis/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="http://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</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="http://helix.apache.org/1.0.2-docs/privacy-policy.html";>Privacy 
Policy</a>
+</div>                 </div>
+               </div>
+       </div>
+
+       <!-- Le javascript
+       ================================================== -->
+       <!-- Placed at the end of the document so the pages load faster -->
+
+       <!-- Fallback jQuery loading from Google CDN:
+            
http://stackoverflow.com/questions/1014203/best-way-to-use-googles-hosted-jquery-but-fall-back-to-my-hosted-library-on-go
 -->
+       <script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js";></script>
+       <script type="text/javascript">
+               if (typeof jQuery == 'undefined')
+               {
+                       document.write(unescape("%3Cscript 
src='./js/jquery-1.8.3.min.js' type='text/javascript'%3E%3C/script%3E"));
+               }
+       </script>
+       
+       <script src="./js/bootstrap.min.js"></script>
+       <script src="./js/lightbox.js"></script>
+       <script src="./js/jquery.smooth-scroll.min.js"></script>
+       <!-- back button support for smooth scroll -->
+       <script src="./js/jquery.ba-bbq.min.js"></script>
+
+       <script src="./js/reflow-skin.js"></script>
+       
+       </body>
+</html>
\ No newline at end of file

Added: helix/site-content/1.0.2-docs/tutorial_customized_view.html
URL: 
http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/tutorial_customized_view.html?rev=1890233&view=auto
==============================================================================
--- helix/site-content/1.0.2-docs/tutorial_customized_view.html (added)
+++ helix/site-content/1.0.2-docs/tutorial_customized_view.html Wed May 26 
21:09:44 2021
@@ -0,0 +1,427 @@
+
+<!DOCTYPE html>
+<!--
+ Generated by Apache Maven Doxia at 2021-05-26
+ Rendered using Maven Reflow Skin 1.0.0 
(http://andriusvelykis.github.com/reflow-maven-skin)
+-->
+<html  xml:lang="en" lang="en">
+
+       <head>
+               <meta charset="UTF-8" />
+               <title>Apache Helix -   Tutorial - Customized View</title>
+               <meta name="viewport" content="width=device-width, 
initial-scale=1.0" />
+               <meta name="description" content="" />
+               <meta http-equiv="content-language" content="en" />
+
+               <link href="./css/bootstrap.min.css" rel="stylesheet" />
+               <link href="./css/bootstrap-responsive.min.css" 
rel="stylesheet" />
+               <link href="./css/docs.css" rel="stylesheet" />
+               <link href="./css/reflow-skin.css" rel="stylesheet" />
+               
+               
+               <link href="./css/lightbox.css" rel="stylesheet" />
+               
+               <link href="./css/site.css" rel="stylesheet" />
+               <link href="./css/print.css" rel="stylesheet" media="print" />
+               
+               <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+               <!--[if lt IE 9]>
+                       <script 
src="http://html5shim.googlecode.com/svn/trunk/html5.js";></script>
+               <![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>
+
+       <body class="page-tutorial_customized_view project-102-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">
+                                       <a class="btn btn-navbar" 
data-toggle="collapse" data-target=".nav-collapse">
+                                               <span class="icon-bar"></span>
+                                               <span class="icon-bar"></span>
+                                               <span class="icon-bar"></span>
+                                       </a>
+                                       <a class="brand" href="..">Apache 
Helix</a>
+                                       <div class="nav-collapse">
+                                               <ul class="nav pull-right">
+                                                       <li><a 
href="index.html" title="Helix 1.0.2">Helix 1.0.2 </a></li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Get Helix <b 
class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="download.html" title="Download">Download </a></li>
+                                                                       <li><a 
href="Building.html" title="Building">Building </a></li>
+                                                                       <li><a 
href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes 
</a></li>
+                                                               </ul>
+                                                       </li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Hands-On <b 
class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="Quickstart.html" title="Quick Start">Quick Start </a></li>
+                                                                       <li><a 
href="Tutorial.html" title="Tutorial">Tutorial </a></li>
+                                                                       <li><a 
href="../javadocs/1.0.2" title="Javadocs">Javadocs </a></li>
+                                                               </ul>
+                                                       </li>
+                                                       <li class="dropdown">
+                                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Recipes <b class="caret"></b></a>
+                                                               <ul 
class="dropdown-menu">
+                                                                       <li><a 
href="recipes/lock_manager.html" title="Distributed lock manager">Distributed 
lock manager </a></li>
+                                                                       <li><a 
href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer 
group">Rabbit MQ consumer group </a></li>
+                                                                       <li><a 
href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file 
store">Rsync replicated file store </a></li>
+                                                                       <li><a 
href="recipes/service_discovery.html" title="Service discovery">Service 
discovery </a></li>
+                                                                       <li><a 
href="recipes/task_dag_execution.html" title="Distributed task DAG 
execution">Distributed task DAG execution </a></li>
+                                                               </ul>
+                                                       </li>
+                                               </ul>
+                                       </div><!--/.nav-collapse -->
+                               </div>
+                       </div>
+               </div>
+               
+       <div class="container">
+       
+       <!-- Masthead
+       ================================================== -->
+       <header class="jumbotron subhead">
+               <div class="row" id="banner">
+                       <div class="span12">
+                               <div class="pull-left">
+                                       <a href="../" id="bannerLeft"><img 
src="../images/helix-logo.jpg" alt='"''"' /></a>
+                                       <p class="lead">A cluster management 
framework for partitioned and replicated distributed resources</p>
+                               </div>
+                               <div class="pull-right">
+                                       <a href="http://www.apache.org/"; 
id="bannerRight"><img src="../images/feather_small.gif" alt='"''"' /></a>
+                               </div>
+                       </div>
+               </div>
+               <div>
+                       <ul class="breadcrumb">
+                               <li><a href="../" title="Apache Helix">Apache 
Helix </a></li>
+                               <li class="divider">/</li>
+                               <li><a href="./" title="Release 1.0.2">Release 
1.0.2 </a></li>
+                               <li class="divider">/</li>
+                               <li>  Tutorial - Customized View</li>
+                               <li class="publishDate version-date 
pull-right">Last Published: 2021-05-26</li>
+                       </ul>
+               </div>
+       </header>
+
+       <div class="main-body">
+       <div class="row">
+               <div class="span12">
+                       <div class="body-content">
+<!-- -
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License. --> 
+<p></p> 
+<div class="section"> 
+ <div class="page-header">
+  <h2 id="Helix_Tutorial:_Customized_View"><a href="./Tutorial.html">Helix 
Tutorial</a>: Customized View</h2>
+ </div> 
+ <p>Helix supports users to define their own per partition states that are 
different from the states appeared in the state model. These states are called 
customized states. Helix also provides aggregation function for these per 
partition states across all participants to facilitate the use of them. The 
aggregated customized state result is called customized view. Usually users 
would only need to listen on the customized view change to capture customized 
state updates. </p> 
+ <p>The relationship between customized states and customized view is very 
similar to that between current states and external view. Helix controller uses 
similar logic to aggregate external view and customized view. But the two views 
are designed for different purposes. External view is mainly used to represent 
Helix state transition status, while customized view is to record users’ own 
state status. This tutorial provides information for users to get started with 
using customized view, which needs more user input than external view.</p> 
+ <p>The following figure shows the high level architecture of customized view 
aggregation. <img src="./images/CustomizedViewSystemArchitecture.jpeg" 
alt="CustomizedViewSystemArchitecture" /></p> 
+ <div class="section"> 
+  <h3 id="Terminologies">Terminologies</h3> 
+  <ul> 
+   <li>Customized state: A per partition state defined by users in a string 
format. Customized state exists under each participant. It may include 
different types of states. Each type of state is represented as a Znode itself 
and has different resources as its child Znode.</li> 
+   <li>Customized state config: A cluster level config specifically used for 
customized state related config. For example, it can include a list of 
customized states that should be aggregated.</li> 
+   <li>Customized view: An aggregation result for customized states across all 
participants. It exists under the cluster and can also have a few different 
types of states depending on users’ input. Each type of state is represented 
as a Znode itself and has different resources as its child Znode.</li> 
+  </ul> 
+ </div> 
+ <div class="section"> 
+  <h3 id="How_to_Use_Customized_View">How to Use Customized View</h3> 
+  <div class="section"> 
+   <h4 id="Define_Your_Own_Customized_State">Define Your Own Customized 
State</h4> 
+   <p>Users are responsible for updating customized states in their 
application code. Helix provides a singleton factory called <a 
class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProviderFactory.java";>Customized
 State Provider Factory</a>, and users should instantiate it if they want to 
use customized state. </p> 
+   <p>After instantiation, users should call the function in the factory with 
user defined parameters to build a <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java";>Customized
 State Provider</a> object. </p> 
+   <p>There are two ways to build <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java";>Customized
 State Provider</a>, and the difference is what kind of <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/HelixManager.java";>HelixManager</a>
 is passed in. As the following code shows, the first one relies on a Helix 
provided manager, while the second one needs a user-created Helix manager. </p> 
+   <div class="source"> 
+    <pre>  public CustomizedStateProvider buildCustomizedStateProvider(String 
instanceName,
+      String clusterName, String zkAddress) {
+    HelixManager helixManager = HelixManagerFactory
+        .getZKHelixManager(clusterName, instanceName, 
InstanceType.ADMINISTRATOR, zkAddress);
+    return new CustomizedStateProvider(helixManager, instanceName);
+  }
+
+  public CustomizedStateProvider buildCustomizedStateProvider(HelixManager 
helixManager,
+      String instanceName) {
+    return new CustomizedStateProvider(helixManager, instanceName);
+  }
+</pre> 
+   </div> 
+   <p>Helix provides a a couple of functions in <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java";>Customized
 State Provider</a> that handle operations such as update, get, delete, etc. 
The underlying logic is already written in an efficient and thread safe way. 
Users only need to call these functions to update customized states to 
Zookeeper whenever they want.</p> 
+   <div class="source"> 
+    <pre>  public void updateCustomizedState(String customizedStateName, 
String resourceName,
+      String partitionName, String customizedState);
+
+  public void updateCustomizedState(String customizedStateName, String 
resourceName,
+      String partitionName, Map&lt;String, String&gt; customizedStateMap);
+
+  public CustomizedState getCustomizedState(String customizedStateName, String 
resourceName);
+
+  public Map&lt;String, String&gt; getPerPartitionCustomizedState(String 
customizedStateName,
+      String resourceName, String partitionName);
+
+  public void deletePerPartitionCustomizedState(String customizedStateName, 
String resourceName,
+      String partitionName);
+</pre> 
+   </div> 
+   <p>Here are some additional guidelines about how to use <a 
class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java";>Customized
 State Provider</a>:</p> 
+   <ul> 
+    <li> <p>When a user would like to drop a certain instance by calling Helix 
delete instance API, Helix will delete the instance as well as all sub-paths 
under it with recursive deletion. Therefore, the customized state will also be 
deleted, and customized view will be updated when the instance is 
gone.</p></li> 
+    <li> <p>When a user would like to drop a certain resource by calling Helix 
delete resource API, he/she will be responsible for deleting customized state 
of all partitions for that resource across all instances. This operation can be 
implemented in users’ state transition logic.</p></li> 
+    <li> <p>When Helix rebalance happens, and a certain partition on a certain 
instance is moved to another instance, customers will need to handle the 
cleanup in the callback function currently provided by Helix in the state 
transition logic. </p></li> 
+    <li> <p>When an unexpected disconnection happens in client side from 
Zookeeper, but does not trigger rebalance, Helix will still keep the customized 
state as it is and wait for the connection to be reset. </p></li> 
+   </ul> 
+  </div> 
+  <div class="section"> 
+   <h4 id="Enable_Customized_State_Aggregation_in_Config">Enable Customized 
State Aggregation in Config</h4> 
+   <p>To use Helix customized state and aggregated view, users should firstly 
call a Helix REST API or a Helix java API to set a cluster level config, called 
<a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/model/CustomizedStateConfig.java";>Customized
 State Config</a>. If users do not config this field properly, they can still 
use Helix to record their customized states, but Helix will by default skip the 
aggregation process, as the aggregation will take a fair amount of computing 
and storage resources. Only when users correctly notify Helix that they want 
the aggregation by adding the state type in the aggregation config list field, 
Helix will do the aggregation and output the results to Zookeeper.</p> 
+   <p>There are two ways to update customized state config. One is through 
JAVA API inside <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java";>ZK
 Helix Admin</a>, and the other is through REST API in <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java";>Cluster
 Accessor</a>.</p> 
+   <p>The JAVA API provides four different functions as follows.</p> 
+   <div class="source"> 
+    <pre>  public void addCustomizedStateConfig(String clusterName, 
CustomizedStateConfig customizedStateConfig);
+
+  public void removeCustomizedStateConfig(String clusterName);
+
+  public void addTypeToCustomizedStateConfig(String clusterName, String type);
+
+  public void removeTypeFromCustomizedStateConfig(String clusterName, String 
type);
+</pre> 
+   </div> 
+   <p>Every JAVA API has a corresponding REST API. For example, the function 
<tt>addCustomizedStateConfig</tt> can be performed by the following REST 
call.</p> 
+   <div class="source"> 
+    <pre>  $curl -X PUT -H &quot;Content-Type: application/json&quot; 
http://localhost:1234/admin/v2/clusters/myCluster/customized-state-config -d '
+    {
+     &quot;id&quot; : &quot;CustomizedStateConfig&quot;,
+      &quot;listFields&quot; : {
+        &quot;AGGREGATION_ENABLED_TYPES&quot; : 
[&quot;CUSTOMIZED_STATE_TYPE_0&quot;, &quot;CUSTOMIZED_STATE_TYPE_1&quot;&quot;]
+      },
+      &quot;simpleFields&quot; : {
+      },
+      &quot;mapFields&quot; : {
+      }
+    }'
+</pre> 
+   </div> 
+  </div> 
+  <div class="section"> 
+   <h4 id="Update_Consuming_Logic_to_Listen_on_Customized_View_Change">Update 
Consuming Logic to Listen on Customized View Change</h4> 
+   <p>The aggregated results is updated in <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/spectator/RoutingTableProvider.java";>RoutingTableProvider</a>.
 Users need to properly construct the routing table provider in their consuming 
logic to use the snapshot that contains customized view. <a 
class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/spectator/RoutingTableProvider.java";>RoutingTableProvider</a>
 has three different constructors for backward compatibility.</p> 
+   <div class="source"> 
+    <pre>  public RoutingTableProvider(HelixManager helixManager) throws 
HelixException {
+    this(helixManager, ImmutableMap.of(PropertyType.EXTERNALVIEW, 
Collections.emptyList()), true,
+        DEFAULT_PERIODIC_REFRESH_INTERVAL);
+  }
+
+  public RoutingTableProvider(HelixManager helixManager, PropertyType 
sourceDataType)
+      throws HelixException {
+    this(helixManager, ImmutableMap.of(sourceDataType, 
Collections.emptyList()), true,
+        DEFAULT_PERIODIC_REFRESH_INTERVAL);
+  }
+
+  public RoutingTableProvider(HelixManager helixManager, Map&lt;PropertyType, 
List&lt;String&gt;&gt; sourceDataTypeMap) {
+    this(helixManager, sourceDataTypeMap, true, 
DEFAULT_PERIODIC_REFRESH_INTERVAL);
+  }
+</pre> 
+   </div> 
+   <p>If users would like to use customized states and customized view, they 
need to initialize <a class="externalLink" 
href="https://github.com/apache/helix/blob/master/helix-core/src/main/java/org/apache/helix/spectator/RoutingTableProvider.java";>RoutingTableProvider</a>
 with the last constructor. They also need to define the 
<tt>sourceDataMap</tt>. For example, if users would like to listen to both 
external view and customized view, they can do </p> 
+   <div class="source"> 
+    <pre>Map&lt;PropertyType, List&lt;String&gt;&gt; sourceDataTypeMap = new 
Hashmap&lt;&gt;();
+sourceDataTypeMap.put(PropertyType.CUSTOMIZEDVIEW, 
Arrays.asList(CUSTOMIZED_STATE_0, CUSTOMIZED_STATE_1))
+sourceDataTypeMap.put(PropertyType.EXTERNALVIEW, Collections.emptyList());
+
+routingTableProvider = new RoutingTableProvider(helixManager, 
sourceDataTypeMap);
+</pre> 
+   </div> 
+  </div> 
+  <div class="section"> 
+   <h4 id="Verify_Customized_View_Generated_Properly">Verify Customized View 
Generated Properly</h4> 
+   <p>After finishing all the steps above, users could verify whether the 
customized view is generated probably based on customized states. For example, 
if you have two instances: P0 and P1, one resource: MyResource, with two 
partitions: MyResource_0 and MyResource_1, and each partition has one state in 
CUSTOMIZED_STATE_TYPE_1, which includes STATE_NAME_0, STATE_NAME_1 and 
STATE_NAME_2. At a certain time, the customized states may look like something 
similar to the following.</p> 
+   <div class="source"> 
+    <pre>P0: 
+{
+ &quot;id&quot;: &quot;MyResource&quot;,
+    &quot;listFields&quot;: {},
+     &quot;mapFields&quot;: {
+          &quot;MyResource_0&quot;: {
+              &quot;CURRENT_STATE&quot;: &quot;STATE_NAME_1&quot;,
+              &quot;PREVIOUS_STATE&quot;: &quot;STATE_NAME_0&quot;,
+              &quot;START_TIME&quot;: &quot;1580221789100&quot;,
+              &quot;END_TIME&quot;: &quot;1580221835197&quot;,
+          },
+          &quot;MyResource_1&quot;: {
+              &quot;CURRENT_STATE&quot;: &quot;STATE_NAME_2&quot;,
+              &quot;PREVIOUS_STATE&quot;: &quot;STATE_NAME1&quot;,
+              &quot;START_TIME&quot;: &quot;1580221789880&quot;,
+              &quot;END_TIME&quot;: &quot;1580221835117&quot;
+          }   
+     }
+}                          
+
+P1: 
+{
+ &quot;id&quot;: &quot;MyResource&quot;,
+    &quot;listFields&quot;: {},
+     &quot;mapFields&quot;: {
+          &quot;MyResource_0&quot;: {
+              &quot;CURRENT_STATE&quot;: &quot;STATE_NAME_2&quot;,
+              &quot;PREVIOUS_STATE&quot;: &quot;STATE_NAME_0&quot;,
+              &quot;START_TIME&quot;: &quot;1570221125566&quot;,
+              &quot;END_TIME&quot;: &quot;15744432835197&quot;,
+          },
+          &quot;MyResource_1&quot;: {
+              &quot;CURRENT_STATE&quot;: &quot;STATE_NAME_0&quot;,
+              &quot;PREVIOUS_STATE&quot;: &quot;STATE_NAME1&quot;,
+              &quot;START_TIME&quot;: &quot;1570221723440&quot;,
+              &quot;END_TIME&quot;: &quot;1570321835117&quot;
+          }   
+     }
+}   
+</pre> 
+   </div> 
+   <p>After Helix controller aggregation, the customized view should look like 
the following:</p> 
+   <div class="source"> 
+    <pre>{ &quot;id&quot;: &quot;MyResource&quot;,
+  &quot;listFields&quot;: {},
+  &quot;mapFields&quot;: {
+     &quot;MyResource_0&quot;: {
+      &quot;P0&quot;: &quot;STATE_NAME_1&quot;,
+      &quot;P1&quot;: &quot;STATE_NAME_2&quot;
+    },
+    &quot;MyResource_1&quot;: {
+      &quot;P0&quot;: &quot;STATE_NAME_2&quot;,
+      &quot;P1&quot;: &quot;STATE_NAME_0&quot;
+    }
+}
+</pre> 
+   </div> 
+  </div> 
+ </div> 
+</div>
+                       </div>
+               </div>
+       </div>
+       </div>
+
+       </div><!-- /container -->
+       
+       <!-- Footer
+       ================================================== -->
+       <footer class="well">
+               <div class="container">
+                       <div class="row">
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li class="nav-header">Get 
Helix</li>
+                                               <li>
+                                                       <a href="download.html" 
title="Download">Download </a>
+                                               </li>
+                                               <li>
+                                                       <a href="Building.html" 
title="Building">Building </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="releasenotes/release-1.0.2.html" title="Release Notes">Release Notes </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li 
class="nav-header">Hands-On</li>
+                                               <li>
+                                                       <a 
href="Quickstart.html" title="Quick Start">Quick Start </a>
+                                               </li>
+                                               <li>
+                                                       <a href="Tutorial.html" 
title="Tutorial">Tutorial </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="../javadocs/1.0.2" title="Javadocs">Javadocs </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                               <div class="span3 bottom-nav">
+                                       <ul class="nav nav-list">
+                                               <li 
class="nav-header">Recipes</li>
+                                               <li>
+                                                       <a 
href="recipes/lock_manager.html" title="Distributed lock manager">Distributed 
lock manager </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/rabbitmq_consumer_group.html" title="Rabbit MQ consumer 
group">Rabbit MQ consumer group </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/rsync_replicated_file_store.html" title="Rsync replicated file 
store">Rsync replicated file store </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/service_discovery.html" title="Service discovery">Service 
discovery </a>
+                                               </li>
+                                               <li>
+                                                       <a 
href="recipes/task_dag_execution.html" title="Distributed task DAG 
execution">Distributed task DAG execution </a>
+                                               </li>
+                                       </ul>
+                               </div>
+                       </div>
+               </div>
+       </footer>
+               
+       <div class="container subfooter">
+               <div class="row">
+                       <div class="span12">
+                               <p class="pull-right"><a href="#">Back to 
top</a></p>
+                               <p class="copyright">Copyright &copy;2021 <a 
href="http://www.apache.org/";>The Apache Software Foundation</a>. All Rights 
Reserved.</p>
+                               <p><a 
href="http://github.com/andriusvelykis/reflow-maven-skin"; title="Reflow Maven 
skin">Reflow Maven skin</a> by <a href="http://andrius.velykis.lt"; 
target="_blank" title="Andrius Velykis">Andrius Velykis</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="http://helix.apache.org/1.0.2-docs/privacy-policy.html";>Privacy 
Policy</a>
+</div>                 </div>
+               </div>
+       </div>
+
+       <!-- Le javascript
+       ================================================== -->
+       <!-- Placed at the end of the document so the pages load faster -->
+
+       <!-- Fallback jQuery loading from Google CDN:
+            
http://stackoverflow.com/questions/1014203/best-way-to-use-googles-hosted-jquery-but-fall-back-to-my-hosted-library-on-go
 -->
+       <script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js";></script>
+       <script type="text/javascript">
+               if (typeof jQuery == 'undefined')
+               {
+                       document.write(unescape("%3Cscript 
src='./js/jquery-1.8.3.min.js' type='text/javascript'%3E%3C/script%3E"));
+               }
+       </script>
+       
+       <script src="./js/bootstrap.min.js"></script>
+       <script src="./js/lightbox.js"></script>
+       <script src="./js/jquery.smooth-scroll.min.js"></script>
+       <!-- back button support for smooth scroll -->
+       <script src="./js/jquery.ba-bbq.min.js"></script>
+
+       <script src="./js/reflow-skin.js"></script>
+       
+       </body>
+</html>
\ No newline at end of file


Reply via email to