helix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r1880089 - in /helix/site-content/1.0.1-docs: Tutorial.html images/CustomizedViewSystemArchitecture.jpeg releasenotes/release-1.0.1.html tutorial_customized_view.html
Date Mon, 20 Jul 2020 23:54:40 GMT
Author: jxue
Date: Mon Jul 20 23:54:40 2020
New Revision: 1880089

URL: http://svn.apache.org/viewvc?rev=1880089&view=rev
Log:
Site checkin for project Apache Helix :: Website

Added:
    helix/site-content/1.0.1-docs/images/CustomizedViewSystemArchitecture.jpeg   (with props)
    helix/site-content/1.0.1-docs/tutorial_customized_view.html
Modified:
    helix/site-content/1.0.1-docs/Tutorial.html
    helix/site-content/1.0.1-docs/releasenotes/release-1.0.1.html

Modified: helix/site-content/1.0.1-docs/Tutorial.html
URL: http://svn.apache.org/viewvc/helix/site-content/1.0.1-docs/Tutorial.html?rev=1880089&r1=1880088&r2=1880089&view=diff
==============================================================================
--- helix/site-content/1.0.1-docs/Tutorial.html (original)
+++ helix/site-content/1.0.1-docs/Tutorial.html Mon Jul 20 23:54:40 2020
@@ -176,6 +176,7 @@ under the License. -->
     </ol></li> 
    <li><a href="./tutorial_rest_service.html">Helix REST Service 2.0</a></li>

    <li><a href="./tutorial_ui.html">Helix UI Setup</a></li> 
+   <li><a href="./tutorial_customized_view.html">Helix Customized View</a></li>

   </ol> 
  </div> 
  <div class="section"> 

Added: helix/site-content/1.0.1-docs/images/CustomizedViewSystemArchitecture.jpeg
URL: http://svn.apache.org/viewvc/helix/site-content/1.0.1-docs/images/CustomizedViewSystemArchitecture.jpeg?rev=1880089&view=auto
==============================================================================
Binary file - no diff available.

Propchange: helix/site-content/1.0.1-docs/images/CustomizedViewSystemArchitecture.jpeg
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: helix/site-content/1.0.1-docs/releasenotes/release-1.0.1.html
URL: http://svn.apache.org/viewvc/helix/site-content/1.0.1-docs/releasenotes/release-1.0.1.html?rev=1880089&r1=1880088&r2=1880089&view=diff
==============================================================================
--- helix/site-content/1.0.1-docs/releasenotes/release-1.0.1.html (original)
+++ helix/site-content/1.0.1-docs/releasenotes/release-1.0.1.html Mon Jul 20 23:54:40 2020
@@ -140,7 +140,7 @@
 <!-- http://maven.apache.org/guides/mini/guide-apt-format.html --> 
 <div class="section"> 
  <div class="page-header">
-  <h2 id="Release_Notes_for_Apache_Helix_1.0.1_DEPRECATED">Release Notes for Apache
Helix 1.0.1 (DEPRECATED)</h2>
+  <h2 id="Release_Notes_for_Apache_Helix_1.0.1">Release Notes for Apache Helix 1.0.1</h2>
  </div> 
  <p>The Apache Helix team would like to announce the release of Apache Helix 1.0.1.</p>

  <p>This is the tweentieth release under the Apache umbrella, and the sixteenth as
a top-level project.</p> 

Added: helix/site-content/1.0.1-docs/tutorial_customized_view.html
URL: http://svn.apache.org/viewvc/helix/site-content/1.0.1-docs/tutorial_customized_view.html?rev=1880089&view=auto
==============================================================================
--- helix/site-content/1.0.1-docs/tutorial_customized_view.html (added)
+++ helix/site-content/1.0.1-docs/tutorial_customized_view.html Mon Jul 20 23:54:40 2020
@@ -0,0 +1,429 @@
+
+<!DOCTYPE html>
+<!--
+ Generated by Apache Maven Doxia at 2020-07-20
+ 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-101-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.1">Helix 1.0.1 </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.1.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.1" 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="http://helix.incubator.apache.org/" title="Apache Helix" class="externalLink">Apache
Helix </a></li>
+				<li class="divider">/</li>
+				<li><a href="../" title="Apache Helix">Apache Helix </a></li>
+				<li class="divider">/</li>
+				<li><a href="./" title="Release 1.0.1">Release 1.0.1 </a></li>
+				<li class="divider">/</li>
+				<li>  Tutorial - Customized View</li>
+				<li class="publishDate version-date pull-right">Last Published: 2020-07-20</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 it 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 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, customer 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 happened 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.1.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.1" 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;2020 <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.1-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



Mime
View raw message