incubator-s4-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mmo...@apache.org
Subject svn commit: r1488543 [2/5] - in /incubator/s4/site: ./ contrib/ doc/0.6.0/ doc/0.6.0/application_dependencies/ doc/0.6.0/configuration/ doc/0.6.0/dev_tips/ doc/0.6.0/event_dispatch/ doc/0.6.0/event_injection/ doc/0.6.0/fault_tolerance/ doc/0.6.0/metric...
Date Sat, 01 Jun 2013 16:37:45 GMT
Modified: incubator/s4/site/doc/0.6.0/event_injection/index.html
URL: http://svn.apache.org/viewvc/incubator/s4/site/doc/0.6.0/event_injection/index.html?rev=1488543&r1=1488542&r2=1488543&view=diff
==============================================================================
--- incubator/s4/site/doc/0.6.0/event_injection/index.html (original)
+++ incubator/s4/site/doc/0.6.0/event_injection/index.html Sat Jun  1 16:37:44 2013
@@ -1,16 +1,17 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html>
 <html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>S4: Inject events into S4</title>
-<meta content="A general-purpose distributed stream computing platform" name="description">
-<link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
-<link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
-<!--[if lt IE 9]>
+  <head>
+    <title>S4: Inject events into S4</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+    <meta content="A general-purpose distributed stream computing platform" name="description">
+    <link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
+    <link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
+    <!--[if lt IE 9]>
       <link href="../../../style/ie.css" media="screen" rel="stylesheet" type="text/css">
-    <![endif]--><link href="../../../style/style.css" rel="stylesheet" type="text/css">
-<link href="../../../style/nav.css" rel="stylesheet" type="text/css">
-<script type="text/javascript">
+    <![endif]-->
+    <link href="../../../style/style.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/nav.css" rel="stylesheet" type="text/css">
+    <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-19490961-1']);
         _gaq.push(['_setDomainName', 'incubator.apache.org']);
@@ -20,70 +21,86 @@
           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><link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
-<link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
-</head>
-<body>
+      </script>
+    <link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
+  </head>
+  <body>
     <div id="header">
       <div class="container">
         <div id="logo">
           <a href="../../../">
-            <img src="../../../images/s4_test.png"></a>
+            <img src="../../../images/s4_test.png">
+          </a>
+        </div>
+        <div id="navbar">
+          <ul id="nav">
+            <li>
+              <a href="../../../">home</a>
+            </li>
+            <li>
+              <a href="..">doc</a>
+            </li>
+            <li>
+              <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
+            </li>
+            <li>
+              <a href="http://people.apache.org/~mmorel/apache-s4-0.6.0-incubating-doc/javadoc/">API</a>
+            </li>
+            <li>
+              <a href="../../../contrib">get involved</a>
+            </li>
+            <li>
+              <a href="../../../team">team</a>
+            </li>
+            <li>
+              <a href="../../../download">download</a>
+            </li>
+          </ul>
         </div>
-        <div id="navbar"><ul id="nav">
-<li>
-    <a href="../../../">home</a>
-  </li>
-  <li>
-    <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">doc [0.5]</a>
-  </li>
-  <li>
-    <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
-  </li>
-  <li>
-    <a href="http://people.apache.org/~mmorel/apache-s4-0.5.0-incubating-doc/javadoc/">API</a>
-  </li>
-  <li>
-    <a href="../../../contrib">get involved</a>
-  </li>
-  <li>
-    <a href="../../../team">team</a>
-  </li>
-  <li>
-    <a href="../../../download">download</a>
-  </li>
-</ul></div>
       </div>
     </div>
     <div id="wrapper">
       <div class="container" id="container">
-<blockquote>
-  <p>How do we inject events into S4?</p>
-</blockquote>
-
-<h1 id="problem-statement">Problem statement</h1>
-<p>There is a data stream somewhere. We want to inject that data into our S4 stream processing application.</p>
-
-<p>The data stream can be almost anything: user clicks in a web application, alarms in a monitoring system, stock trade operations, even static data from a database or a file server.</p>
-
-<h1 id="requirements">Requirements</h1>
-<ul>
-<li>We must be able to connect to that stream of data</li>
-  <li>We must be able to chunk the data and isolate events out of it</li>
-</ul>
-<h1 id="solutions">Solutions</h1>
-<p>Currently S4 does not provide a specific abstraction for a source of event or an external data stream. This means that the connection to an external data source can be implemented arbitrarily. Typically, connections to external data sources are initiated in the App object itself, in the <code>start()</code> method. </p>
-
-<h2 id="in-a-single-application">In a single application</h2>
-<p>Let us consider a single S4 application. The App class is instantiated on each node (for instantiating the local topology), and this has to be taken in consideration.
-For instance, if we get the information from the twitter sprinker stream, given that the stream is provided through a single socket connection, we should connect only from one node. To ensure that, leader election through ZooKeeper is an option, but a much simpler one is simply to base this decision on the id of the partition, provided in the <code>App</code> class by <code>getReceiver().getPartitionId()</code>. In our example, we would initiate the connection only if we are in partition 0.</p>
-
-<pre><code class="language-java"></code></pre>
-
-<h2 id="using-an-adapter-application">Using an adapter application</h2>
-
-<p>In some cases the above solution is not practical: it introduces some load imbalance between the partitions, and the extraction of the</p>
-</div>
+        <blockquote>
+          <p>How do we inject events into S4?</p>
+        </blockquote>
+        
+        <h1 id="problem-statement">Problem statement</h1>
+        <p>There is a data stream somewhere. We want to inject that data into our S4 stream processing application.</p>
+        
+        <p>The data stream can be almost anything: user clicks in a web application, alarms in a monitoring system, stock trade operations, or data from a database or a file system.</p>
+        
+        <h1 id="requirements">Requirements</h1>
+        <ul>
+          <li>We must be able to connect to that stream of data</li>
+          <li>We must be able to chunk the data and isolate events out of it</li>
+        </ul>
+        
+        <h1 id="solutions">Solutions</h1>
+        <p>Currently S4 does not provide a specific abstraction for a source of event or an external data stream. This means that the connection to an external data source can be implemented arbitrarily. Typically, connections to external data sources are initiated in the App object itself, in the <code>start()</code> method. </p>
+        
+        <h2 id="in-a-single-application">In a single application</h2>
+        <p>Let us consider a single S4 application. Remember, the App class is instantiated on each node (for instantiating the local topology). This has some implications. For instance, if we get the information from the twitter sprinker stream, given that the stream is provided through a single socket connection, we should connect only from one node. To ensure that, leader election through ZooKeeper could be an option, but a much simpler one is simply to base this decision on the id of the partition, provided in the <code>App</code> class by <code>getReceiver().getPartitionId()</code>. In our example, we would initiate the connection only if we are in partition 0.</p>
+        
+        <blockquote>
+          <p>The code from the twitter adapter app example could actually be factored into the twitter-counter example App class itself, by listening to the sprinkler stream from partition 0 (for instance)</p>
+        </blockquote>
+        
+        <h2 id="using-an-adapter-application">Using an adapter application</h2>
+        
+        <p>In some cases the above solution is not practical: it may introduce some load imbalance between the partitions, the extraction of the events out of an external source may be complex, and we might want to enrich the events with other information. In that case, it could be useful to delegate these tasks to a separate application: the adapter application.</p>
+        
+        <p>Adapter apps can take advantage of the AdapterApp class that automatically creates an output stream. One can define an arbitrary complex graph of PEs and simply use the output stream (<code>getOutputStream</code>) to pass events to downstream S4 apps.</p>
+        
+        <p>S4 applications communicate by matching names of input and output streams. The current mechanism is very simple : when an application creates an output stream, it is exposed in ZooKeeper and other applications that define input streams with the same name are automatically connected, through that matching stream.</p>
+        
+        <p>By default, events are dispatched in a round-robin fashion between S4 apps.</p>
+        
+        <p>The <a href="../twitter_trending_example">twitter example</a> uses an adapter application (though a very basic one).</p>
+        
+        <p>More info on event dispatch is also available <a href="../event_dispatch">here</a></p>
+      </div>
     </div>
     <div id="footer">
       <div class="container">

Modified: incubator/s4/site/doc/0.6.0/fault_tolerance/index.html
URL: http://svn.apache.org/viewvc/incubator/s4/site/doc/0.6.0/fault_tolerance/index.html?rev=1488543&r1=1488542&r2=1488543&view=diff
==============================================================================
--- incubator/s4/site/doc/0.6.0/fault_tolerance/index.html (original)
+++ incubator/s4/site/doc/0.6.0/fault_tolerance/index.html Sat Jun  1 16:37:44 2013
@@ -1,16 +1,17 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html>
 <html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>S4: Fault tolerance</title>
-<meta content="A general-purpose distributed stream computing platform" name="description">
-<link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
-<link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
-<!--[if lt IE 9]>
+  <head>
+    <title>S4: Fault tolerance</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+    <meta content="A general-purpose distributed stream computing platform" name="description">
+    <link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
+    <link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
+    <!--[if lt IE 9]>
       <link href="../../../style/ie.css" media="screen" rel="stylesheet" type="text/css">
-    <![endif]--><link href="../../../style/style.css" rel="stylesheet" type="text/css">
-<link href="../../../style/nav.css" rel="stylesheet" type="text/css">
-<script type="text/javascript">
+    <![endif]-->
+    <link href="../../../style/style.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/nav.css" rel="stylesheet" type="text/css">
+    <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-19490961-1']);
         _gaq.push(['_setDomainName', 'incubator.apache.org']);
@@ -20,217 +21,226 @@
           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><link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
-<link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
-</head>
-<body>
+      </script>
+    <link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
+  </head>
+  <body>
     <div id="header">
       <div class="container">
         <div id="logo">
           <a href="../../../">
-            <img src="../../../images/s4_test.png"></a>
+            <img src="../../../images/s4_test.png">
+          </a>
+        </div>
+        <div id="navbar">
+          <ul id="nav">
+            <li>
+              <a href="../../../">home</a>
+            </li>
+            <li>
+              <a href="..">doc</a>
+            </li>
+            <li>
+              <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
+            </li>
+            <li>
+              <a href="http://people.apache.org/~mmorel/apache-s4-0.6.0-incubating-doc/javadoc/">API</a>
+            </li>
+            <li>
+              <a href="../../../contrib">get involved</a>
+            </li>
+            <li>
+              <a href="../../../team">team</a>
+            </li>
+            <li>
+              <a href="../../../download">download</a>
+            </li>
+          </ul>
         </div>
-        <div id="navbar"><ul id="nav">
-<li>
-    <a href="../../../">home</a>
-  </li>
-  <li>
-    <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">doc [0.5]</a>
-  </li>
-  <li>
-    <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
-  </li>
-  <li>
-    <a href="http://people.apache.org/~mmorel/apache-s4-0.5.0-incubating-doc/javadoc/">API</a>
-  </li>
-  <li>
-    <a href="../../../contrib">get involved</a>
-  </li>
-  <li>
-    <a href="../../../team">team</a>
-  </li>
-  <li>
-    <a href="../../../download">download</a>
-  </li>
-</ul></div>
       </div>
     </div>
     <div id="wrapper">
       <div class="container" id="container">
-<p>Stream processing applications are typically long running applications, and they may accumulate state over extended periods of time.</p>
-
-<p>When running a distributed system over a long period of time, expect:</p>
-
-<ul>
-<li>failures</li>
-  <li>infrastructure updates</li>
-  <li>scheduled restarts</li>
-  <li>application updates</li>
-</ul>
-<p>In each of these situations, some or all of S4 nodes will be shutdown. The system may therefore be partly unavailable, and in-memory state accumulated during the execution may be lost.</p>
-
-<p>In order to deal with this kind of situation, S4 provides:</p>
-
-<ul>
-<li>high availability</li>
-  <li>state recovery (based on checkpointing)</li>
-  <li>while preserving low processing latency</li>
-</ul>
-<p>In this document, we first describe the high availability mechanism implemented in S4, then we describe the checkpointing and recovery mechanism, and how to customize it, then we describe future improvements.</p>
-
-<h1 id="fail-over-mechanism">Fail-over mechanism</h1>
-
-<p>In order to guarantee availability in the presence of sudden node failures, S4 provides a mechanism to automatically detect failed nodes and redirect messages to a standby node.</p>
-
-<p>The following figure illustrates this fail-over mechanism: </p>
-
-<p><img src="../../../images/doc/0.6.0/failover.png" alt="image"></p>
-
-<p>This technique provides high availability but does not prevent state loss.</p>
-
-<h2 id="configuration">Configuration</h2>
-
-<h5 id="number-of-standby-nodes">Number of standby nodes</h5>
-
-<p>S4 clusters are defined with a fixed number of tasks (\~ partitions). If you have n partitions and start m nodes, with m&gt;n, you get m-n standby nodes.</p>
-
-<h5 id="failure-detection-timeout">Failure detection timeout</h5>
-
-<p>Zookeeper considers a node is dead when it cannot reach it after a the session timeout. The session timeout is specified by the client upon connection, and is at minimum twice the tickTime (heartbeat) specified in the Zookeeper ensemble configuration.</p>
-
-<h1 id="checkpointing-and-recovery">Checkpointing and recovery</h1>
-
-<h3 id="a-closer-look-at-the-problem">A closer look at the problem</h3>
-
-<p>Upon node crash, the fail-over mechanism brings a new and fresh node to the cluster. When this node is brought into the cluster, it has no state, no instantiated PE. Messages start arriving at this node, and trigger keyed PE instantiations.</p>
-
-<p>If there is no checkpointing and recovery mechanism, those PEs start with an empty state.</p>
-
-<h3 id="s4-strategy-for-solving-the-problem">S4 strategy for solving the problem</h3>
-
-<p>For PEs to recover a previous state, the technique we use is to:</p>
-
-<ul>
-<li>
-<em>periodically checkpoint</em> the state of PEs across the S4 cluster</li>
-  <li>
-<em>lazily recover</em> (triggered by messages)</li>
-</ul>
-<p>This means that if there is a previous state that was checkpointed, and that a new PE is instantiated because a new key is seen, the PE instance will fetch the corresponding checkpoint, recover the corresponding state, and only then start processing events. State loss is minimal!</p>
-
-<h3 id="design">Design</h3>
-
-<h5 id="checkpointing">Checkpointing</h5>
-
-<p>In order to minimize the latency, checkpointing is <em>uncoordinated</em> and <em>asynchronous</em>.
-Uncoordinated checkpointing means that each checkpoint is taken independently, without aiming at global consistency.
-Asynchronous checkpointing aims at minimizing the impact on the event processing execution path.</p>
-
-<p>Taking a checkpoint is a 2 steps operations, both handled outside of the event processing path:</p>
-
-<ul>
-<li>serialize the PE instance</li>
-  <li>save the serialized PE instance to remote storage</li>
-</ul>
-<p>The following figure shows the various components involved: the checkpointing framework handles the serialization and passes serialized state to a pluggable storage backend:</p>
-
-<p><img src="../../../images/doc/0.6.0/checkpointing-framework.png" alt="image"></p>
-
-<h5 id="recovery">Recovery</h5>
-
-<p>In order to optimize the usage of resources, recovery is <em>lazy</em>, which means it only happens when necessary.
-When a message for a new key arrives in the recovered S4 node, a new PE instance is created, and the system tries to fetch a previous checkpoint from storage. If there is a previous state, it is copied to the newly created PE instance. (This implies deserializing a previous object and copying its fields).</p>
-
-<h3 id="configuration-and-customization">Configuration and customization</h3>
-
-<h5 id="requirements">Requirements</h5>
-
-<p>A PE can be checkpointed if:</p>
-
-<ul>
-<li>
-<strong>the PE class provides an empty no-arg constructor</strong> (that restriction should be lifted in next releases)</li>
-  <li>
-<strong>it has non transient serializable fields</strong> (and by opposition, transient fields will never be checkpointed)</li>
-</ul>
-<blockquote>
-  <p>For example, one must make sure fields of type <code>Stream</code> (for sending messages downstream) are transient!</p>
-</blockquote>
-
-<h5 id="checkpointing-application-configuration">Checkpointing application configuration</h5>
-
-<p>Checkpointing intervals are defined per prototype, in time intervals or event counts (for now). This is specified in the application module, using API methods from the ProcessingElement class, and passing a CheckpointingConfiguration object. Please refer to the API documentation.</p>
-
-<p>The twitter example application shipped in the distribution is already configured for enabling checkpointing. See the <a href="https://git-wip-us.apache.org/repos/asf?p=incubator-s4.git;a=blob;f=test-apps/twitter-counter/src/main/java/org/apache/s4/example/twitter/TwitterCounterApp.java;h=5d7855fa5aee6cbe693fa47c1ebad03da316f42b">TwitterCounterApp</a> class.</p>
-
-<p>For instance, here is how to specify a checkpointing frequency of 20s on the TopNTopicPE prototype:</p>
-
-<pre><code>topNTopicPE.setCheckpointingConfig(new CheckpointingConfig.Builder(CheckpointingMode.TIME).frequency(20).timeUnit(TimeUnit.SECONDS).build());
-</code></pre>
-
-<h5 id="enabling-checkpointing">Enabling checkpointing</h5>
-
-<p>This is a node configuration. You need to inject a checkpointing module that speficies a CheckpointingFramework implementation (please use org.apache.s4.core.ft.SafeKeeper) and a backend storage implementation. The backend storage implements the StateStorage interface.</p>
-
-<p>We provide a default module (FileSystemBackendCheckpointingModule) that uses a file system backend (DefaultFileSystemStateStorage). It can be used with an NFS setup and introduces no dependency. You may use it by starting an S4 node in the following manner:</p>
-
-<pre><code>./s4 node -c=cluster1 -emc=org.apache.s4.core.ft.FileSystemBackendCheckpointingModule
-</code></pre>
-
-<h5 id="customizing-the-checkpointing-backend">Customizing the checkpointing backend</h5>
-
-<p>It is quite straightforward to implement backends for other kinds of storage (key value stores, datagrid, cache, RDBMS). Writing a checkpointing backend consists of implementing a simple interface (<code>StateStorage</code>) matching your infrastructure or system.</p>
-
-<p>Using an alternative backend is as simple as providing a new module to the S4 node. Here is an example of a module using a ‘Cool’ backend implementation:</p>
-
-<pre><code class="language-java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CoolBackendCheckpointingModule</span> <span class="kd">extends</span> <span class="n">AbstractModule</span> <span class="o">{</span>
-	<span class="nd">@Override</span>
-	<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">()</span> <span class="o">{</span>
-	    <span class="n">bind</span><span class="o">(</span><span class="n">StateStorage</span><span class="o">.</span><span class="na">class</span><span class="o">).</span><span class="na">to</span><span class="o">(</span><span class="n">CoolStateStorage</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
-	    <span class="n">bind</span><span class="o">(</span><span class="n">CheckpointingFramework</span><span class="o">.</span><span class="na">class</span><span class="o">).</span><span class="na">to</span><span class="o">(</span><span class="n">SafeKeeper</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
-	<span class="o">}</span>
-<span class="o">}</span></code></pre>
-
-<h5 id="overriding-checkpointing-and-recovery-operations">Overriding checkpointing and recovery operations</h5>
-
-<p>By default, S4 keeps all non transient fields as part of the state, and uses <a href="http://code.google.com/p/kryo">kryo</a> to serialize and deserialize checkpoints, but it is possible to use a different mechanism, by overriding the <code>checkpoint()</code>, <code>serializeState()</code> and <code>restoreState()</code> methods of the <code>ProcessingElement</code> class.</p>
-
-<p>PEs are eligible for checkpointing when their state is ‘dirty’. The dirty flag is checked through the <code>isDirty()</code> method, and cleared by calling the <code>clearDirty()</code> method. In some cases, dependent on the application code, only some of the events may actually change the state of the PE. You should override these methods in order to avoid unjustified checkpointing operations.</p>
-
-<h5 id="tuning">Tuning</h5>
-
-<p>The checkpointing framework has a number of overridable parameters, mostly for sizing thread pools:</p>
-
-<ul>
-<li>Serialization thread pool
-    <ul>
-<li>s4.checkpointing.serializationMaxThreads (default = 1)</li>
-      <li>s4.checkpointing.serializationThreadKeepAliveSeconds (default = 120)</li>
-      <li>s4.checkpointing.serializationMaxOutstandingRequests (default = 1000)</li>
-    </ul>
-</li>
-  <li>Storage backend thread pool
-    <ul>
-<li>s4.checkpointing.storageMaxThreads (default = 1)</li>
-      <li>s4.checkpointing.storageThreadKeepAliveSeconds (default = 120)</li>
-      <li>s4.checkpointing.storageMaxOutstandingRequests (default = 1000)</li>
-    </ul>
-</li>
-  <li>Fetching thread pool: fetching is a blocking operation, which can timeout:
-    <ul>
-<li>s4.checkpointing.fetchingMaxThreads (default = 1)</li>
-      <li>s4.checkpointing.fetchingThreadKeepAliveSeconds (default = 120)</li>
-      <li>s4.checkpointing.fetchingMaxWaitMs (default = 1000) (corresponds to the timeout)</li>
-    </ul>
-</li>
-  <li>In the case the backend is unresponsive, it can be bypassed:
-    <ul>
-<li>s4.checkpointing.fetchingMaxConsecutiveFailuresBeforeDisabling (default = 10)</li>
-      <li>s4.checkpointing.fetchingDisabledDurationMs (default = 600000)</li>
-    </ul>
-</li>
-</ul>
-</div>
+        <p>Stream processing applications are typically long running applications, and they may accumulate state over extended periods of time.</p>
+        
+        <p>When running a distributed system over a long period of time, expect:</p>
+        
+        <ul>
+          <li>failures</li>
+          <li>infrastructure updates</li>
+          <li>scheduled restarts</li>
+          <li>application updates</li>
+        </ul>
+        
+        <p>In each of these situations, some or all of S4 nodes will be shutdown. The system may therefore be partly unavailable, and in-memory state accumulated during the execution may be lost.</p>
+        
+        <p>In order to deal with this kind of situation, S4 provides:</p>
+        
+        <ul>
+          <li>high availability</li>
+          <li>state recovery (based on checkpointing)</li>
+          <li>while preserving low processing latency</li>
+        </ul>
+        
+        <p>In this document, we first describe the high availability mechanism implemented in S4, then we describe the checkpointing and recovery mechanism, and how to customize it, then we describe future improvements.</p>
+        
+        <h1 id="fail-over-mechanism">Fail-over mechanism</h1>
+        
+        <p>In order to guarantee availability in the presence of sudden node failures, S4 provides a mechanism to automatically detect failed nodes and redirect messages to a standby node.</p>
+        
+        <p>The following figure illustrates this fail-over mechanism: </p>
+        
+        <p><img src="../../../images/doc/0.6.0/failover.png" alt="image"></p>
+        
+        <p>This technique provides high availability but does not prevent state loss.</p>
+        
+        <h2 id="configuration">Configuration</h2>
+        
+        <h5 id="number-of-standby-nodes">Number of standby nodes</h5>
+        
+        <p>S4 clusters are defined with a fixed number of tasks (\~ partitions). If you have n partitions and start m nodes, with m&gt;n, you get m-n standby nodes.</p>
+        
+        <h5 id="failure-detection-timeout">Failure detection timeout</h5>
+        
+        <p>Zookeeper considers a node is dead when it cannot reach it after a the session timeout. The session timeout is specified by the client upon connection, and is at minimum twice the tickTime (heartbeat) specified in the Zookeeper ensemble configuration.</p>
+        
+        <h1 id="checkpointing-and-recovery">Checkpointing and recovery</h1>
+        
+        <h3 id="a-closer-look-at-the-problem">A closer look at the problem</h3>
+        
+        <p>Upon node crash, the fail-over mechanism brings a new and fresh node to the cluster. When this node is brought into the cluster, it has no state, no instantiated PE. Messages start arriving at this node, and trigger keyed PE instantiations.</p>
+        
+        <p>If there is no checkpointing and recovery mechanism, those PEs start with an empty state.</p>
+        
+        <h3 id="s4-strategy-for-solving-the-problem">S4 strategy for solving the problem</h3>
+        
+        <p>For PEs to recover a previous state, the technique we use is to:</p>
+        
+        <ul>
+          <li>
+        <em>periodically checkpoint</em> the state of PEs across the S4 cluster</li>
+          <li>
+        <em>lazily recover</em> (triggered by messages)</li>
+        </ul>
+        
+        <p>This means that if there is a previous state that was checkpointed, and that a new PE is instantiated because a new key is seen, the PE instance will fetch the corresponding checkpoint, recover the corresponding state, and only then start processing events. State loss is minimal!</p>
+        
+        <h3 id="design">Design</h3>
+        
+        <h5 id="checkpointing">Checkpointing</h5>
+        
+        <p>In order to minimize the latency, checkpointing is <em>uncoordinated</em> and <em>asynchronous</em>.
+        Uncoordinated checkpointing means that each checkpoint is taken independently, without aiming at global consistency.
+        Asynchronous checkpointing aims at minimizing the impact on the event processing execution path.</p>
+        
+        <p>Taking a checkpoint is a 2 steps operations, both handled outside of the event processing path:</p>
+        
+        <ul>
+          <li>serialize the PE instance</li>
+          <li>save the serialized PE instance to remote storage</li>
+        </ul>
+        
+        <p>The following figure shows the various components involved: the checkpointing framework handles the serialization and passes serialized state to a pluggable storage backend:</p>
+        
+        <p><img src="../../../images/doc/0.6.0/checkpointing-framework.png" alt="image"></p>
+        
+        <h5 id="recovery">Recovery</h5>
+        
+        <p>In order to optimize the usage of resources, recovery is <em>lazy</em>, which means it only happens when necessary.
+        When a message for a new key arrives in the recovered S4 node, a new PE instance is created, and the system tries to fetch a previous checkpoint from storage. If there is a previous state, it is copied to the newly created PE instance. (This implies deserializing a previous object and copying its fields).</p>
+        
+        <h3 id="configuration-and-customization">Configuration and customization</h3>
+        
+        <h5 id="requirements">Requirements</h5>
+        
+        <p>A PE can be checkpointed if:</p>
+        
+        <ul>
+          <li>
+        <strong>the PE class provides an empty no-arg constructor</strong> (that restriction should be lifted in next releases)</li>
+          <li>
+        <strong>it has non transient serializable fields</strong> (and by opposition, transient fields will never be checkpointed)</li>
+        </ul>
+        
+        <blockquote>
+          <p>For example, one must make sure fields of type <code>Stream</code> (for sending messages downstream) are transient!</p>
+        </blockquote>
+        
+        <h5 id="checkpointing-application-configuration">Checkpointing application configuration</h5>
+        
+        <p>Checkpointing intervals are defined per prototype, in time intervals or event counts (for now). This is specified in the application module, using API methods from the ProcessingElement class, and passing a CheckpointingConfiguration object. Please refer to the API documentation.</p>
+        
+        <p>The twitter example application shipped in the distribution is already configured for enabling checkpointing. See the <a href="https://git-wip-us.apache.org/repos/asf?p=incubator-s4.git;a=blob;f=test-apps/twitter-counter/src/main/java/org/apache/s4/example/twitter/TwitterCounterApp.java;h=5d7855fa5aee6cbe693fa47c1ebad03da316f42b">TwitterCounterApp</a> class.</p>
+        
+        <p>For instance, here is how to specify a checkpointing frequency of 20s on the TopNTopicPE prototype:</p>
+        
+        <pre><code>topNTopicPE.setCheckpointingConfig(new CheckpointingConfig.Builder(CheckpointingMode.TIME).frequency(20).timeUnit(TimeUnit.SECONDS).build());
+        </code></pre>
+        
+        <h5 id="enabling-checkpointing">Enabling checkpointing</h5>
+        
+        <p>This is a node configuration. You need to inject a checkpointing module that speficies a CheckpointingFramework implementation (please use org.apache.s4.core.ft.SafeKeeper) and a backend storage implementation. The backend storage implements the StateStorage interface.</p>
+        
+        <p>We provide a default module (FileSystemBackendCheckpointingModule) that uses a file system backend (DefaultFileSystemStateStorage). It can be used with an NFS setup and introduces no dependency. You may use it by starting an S4 node in the following manner:</p>
+        
+        <pre><code>./s4 node -c=cluster1 -emc=org.apache.s4.core.ft.FileSystemBackendCheckpointingModule
+        </code></pre>
+        
+        <h5 id="customizing-the-checkpointing-backend">Customizing the checkpointing backend</h5>
+        
+        <p>It is quite straightforward to implement backends for other kinds of storage (key value stores, datagrid, cache, RDBMS). Writing a checkpointing backend consists of implementing a simple interface (<code>StateStorage</code>) matching your infrastructure or system.</p>
+        
+        <p>Using an alternative backend is as simple as providing a new module to the S4 node. Here is an example of a module using a ‘Cool’ backend implementation:</p>
+        
+        <pre><code class="language-java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CoolBackendCheckpointingModule</span> <span class="kd">extends</span> <span class="n">AbstractModule</span> <span class="o">{</span>
+        	<span class="nd">@Override</span>
+        	<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">()</span> <span class="o">{</span>
+        	    <span class="n">bind</span><span class="o">(</span><span class="n">StateStorage</span><span class="o">.</span><span class="na">class</span><span class="o">).</span><span class="na">to</span><span class="o">(</span><span class="n">CoolStateStorage</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
+        	    <span class="n">bind</span><span class="o">(</span><span class="n">CheckpointingFramework</span><span class="o">.</span><span class="na">class</span><span class="o">).</span><span class="na">to</span><span class="o">(</span><span class="n">SafeKeeper</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
+        	<span class="o">}</span>
+        <span class="o">}</span></code></pre>
+        
+        <h5 id="overriding-checkpointing-and-recovery-operations">Overriding checkpointing and recovery operations</h5>
+        
+        <p>By default, S4 keeps all non transient fields as part of the state, and uses <a href="http://code.google.com/p/kryo">kryo</a> to serialize and deserialize checkpoints, but it is possible to use a different mechanism, by overriding the <code>checkpoint()</code>, <code>serializeState()</code> and <code>restoreState()</code> methods of the <code>ProcessingElement</code> class.</p>
+        
+        <p>PEs are eligible for checkpointing when their state is ‘dirty’. The dirty flag is checked through the <code>isDirty()</code> method, and cleared by calling the <code>clearDirty()</code> method. In some cases, dependent on the application code, only some of the events may actually change the state of the PE. You should override these methods in order to avoid unjustified checkpointing operations.</p>
+        
+        <h5 id="tuning">Tuning</h5>
+        
+        <p>The checkpointing framework has a number of overridable parameters, mostly for sizing thread pools:</p>
+        
+        <ul>
+          <li>Serialization thread pool
+            <ul>
+              <li>s4.checkpointing.serializationMaxThreads (default = 1)</li>
+              <li>s4.checkpointing.serializationThreadKeepAliveSeconds (default = 120)</li>
+              <li>s4.checkpointing.serializationMaxOutstandingRequests (default = 1000)</li>
+            </ul>
+          </li>
+          <li>Storage backend thread pool
+            <ul>
+              <li>s4.checkpointing.storageMaxThreads (default = 1)</li>
+              <li>s4.checkpointing.storageThreadKeepAliveSeconds (default = 120)</li>
+              <li>s4.checkpointing.storageMaxOutstandingRequests (default = 1000)</li>
+            </ul>
+          </li>
+          <li>Fetching thread pool: fetching is a blocking operation, which can timeout:
+            <ul>
+              <li>s4.checkpointing.fetchingMaxThreads (default = 1)</li>
+              <li>s4.checkpointing.fetchingThreadKeepAliveSeconds (default = 120)</li>
+              <li>s4.checkpointing.fetchingMaxWaitMs (default = 1000) (corresponds to the timeout)</li>
+            </ul>
+          </li>
+          <li>In the case the backend is unresponsive, it can be bypassed:
+            <ul>
+              <li>s4.checkpointing.fetchingMaxConsecutiveFailuresBeforeDisabling (default = 10)</li>
+              <li>s4.checkpointing.fetchingDisabledDurationMs (default = 600000)</li>
+            </ul>
+          </li>
+        </ul>
+      </div>
     </div>
     <div id="footer">
       <div class="container">

Modified: incubator/s4/site/doc/0.6.0/index.html
URL: http://svn.apache.org/viewvc/incubator/s4/site/doc/0.6.0/index.html?rev=1488543&r1=1488542&r2=1488543&view=diff
==============================================================================
--- incubator/s4/site/doc/0.6.0/index.html (original)
+++ incubator/s4/site/doc/0.6.0/index.html Sat Jun  1 16:37:44 2013
@@ -1,16 +1,17 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html>
 <html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>S4: S4 0.6.0</title>
-<meta content="A general-purpose distributed stream computing platform" name="description">
-<link href="../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
-<link href="../../style/print.css" media="print" rel="stylesheet" type="text/css">
-<!--[if lt IE 9]>
+  <head>
+    <title>S4: S4 0.6.0</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+    <meta content="A general-purpose distributed stream computing platform" name="description">
+    <link href="../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
+    <link href="../../style/print.css" media="print" rel="stylesheet" type="text/css">
+    <!--[if lt IE 9]>
       <link href="../../style/ie.css" media="screen" rel="stylesheet" type="text/css">
-    <![endif]--><link href="../../style/style.css" rel="stylesheet" type="text/css">
-<link href="../../style/nav.css" rel="stylesheet" type="text/css">
-<script type="text/javascript">
+    <![endif]-->
+    <link href="../../style/style.css" rel="stylesheet" type="text/css">
+    <link href="../../style/nav.css" rel="stylesheet" type="text/css">
+    <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-19490961-1']);
         _gaq.push(['_setDomainName', 'incubator.apache.org']);
@@ -20,100 +21,109 @@
           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><link href="../../style/coderay.css" rel="stylesheet" type="text/css">
-<link href="../../style/pygmentize.css" rel="stylesheet" type="text/css">
-</head>
-<body>
+      </script>
+    <link href="../../style/coderay.css" rel="stylesheet" type="text/css">
+    <link href="../../style/pygmentize.css" rel="stylesheet" type="text/css">
+  </head>
+  <body>
     <div id="header">
       <div class="container">
         <div id="logo">
           <a href="../../">
-            <img src="../../images/s4_test.png"></a>
+            <img src="../../images/s4_test.png">
+          </a>
+        </div>
+        <div id="navbar">
+          <ul id="nav">
+            <li>
+              <a href="../../">home</a>
+            </li>
+            <li>
+              <a href=".">doc</a>
+            </li>
+            <li>
+              <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
+            </li>
+            <li>
+              <a href="http://people.apache.org/~mmorel/apache-s4-0.6.0-incubating-doc/javadoc/">API</a>
+            </li>
+            <li>
+              <a href="../../contrib">get involved</a>
+            </li>
+            <li>
+              <a href="../../team">team</a>
+            </li>
+            <li>
+              <a href="../../download">download</a>
+            </li>
+          </ul>
         </div>
-        <div id="navbar"><ul id="nav">
-<li>
-    <a href="../../">home</a>
-  </li>
-  <li>
-    <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">doc [0.5]</a>
-  </li>
-  <li>
-    <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
-  </li>
-  <li>
-    <a href="http://people.apache.org/~mmorel/apache-s4-0.5.0-incubating-doc/javadoc/">API</a>
-  </li>
-  <li>
-    <a href="../../contrib">get involved</a>
-  </li>
-  <li>
-    <a href="../../team">team</a>
-  </li>
-  <li>
-    <a href="../../download">download</a>
-  </li>
-</ul></div>
       </div>
     </div>
     <div id="wrapper">
       <div class="container" id="container">
-<blockquote>
-  <p>This is the documentation for S4 0.6.0. For previous versions, please refer to the <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">wiki</a></p>
-</blockquote>
-
-<p>S4 (Simple Scalable Streaming System) is a general-purpose, distributed, scalable, fault-tolerant, pluggable platform that allows programmers to easily develop applications for processing continuous, unbounded streams of data.</p>
-
-<h2 id="getting-started">Getting Started</h2>
-
-<ul>
-<li>You may start with an <a href="overview">overview</a> of the platform</li>
-  <li>Then follow a <a href="walkthrough">walkthrough</a> for an hands-on introduction</li>
-  <li>Complement with a look at a <a href="twitter_trending_example">topic trending</a> application using Twitter data  </li>
-  <li>And <a href="dev_tips">here</a> are some tips to ease the development process</li>
-</ul>
-<h2 id="configuration">Configuration</h2>
-
-<ul>
-<li><a href="configuration">Customize the platform and pass configuration parameters</a></li>
-  <li>Add <a href="application_dependencies">application dependencies</a>
-</li>
-  <li>
-<a href="event_dispatch">Dispatch events </a> within an application and between applications</li>
-  <li>
-<a href="event_injection">Inject events</a> into S4 applications</li>
-</ul>
-<h2 id="running-s4">Running S4</h2>
-<ul>
-<li>
-<a href="tools">Commands</a> for creating, running and managing applications</li>
-  <li>
-<a href="metrics">Monitor</a> the system</li>
-</ul>
-<h2 id="features">Features</h2>
-
-<ul>
-<li>Details about <a href="fault_tolerance">fault tolerance</a>
-</li>
-</ul>
-<h2 id="troubleshooting">Troubleshooting</h2>
-
-<ul>
-<li><a href="recommended_practices">Recommended practices</a></li>
-  <li>Try the <a href="https://cwiki.apache.org/confluence/display/S4/FAQ">FAQ</a>
-</li>
-  <li>Try the <a href="https://cwiki.apache.org/S4/s4-apache-mailing-lists.html">mailing lists</a>
-</li>
-</ul>
-<h2 id="resources">Resources</h2>
-<ul>
-<li>Questions can be asked through the <a href="https://cwiki.apache.org/confluence/display/S4/S4+Apache+mailing+lists">mailing lists</a>
-</li>
-  <li>The source code is available through <a href="https://git-wip-us.apache.org/repos/asf?p=incubator-s4.git">git</a>, <a href="http://incubator.apache.org/s4/contrib/">here</a> are instructions for fetching the code.</li>
-  <li>A nice set of <a href="http://www.slideshare.net/leoneu/20111104-s4-overview">slides</a> was used for a presentation at Stanford in November 2011.</li>
-  <li>The driving ideas are detailed in a <a href="http://www.4lunas.org/pub/2010-s4.pdf">conference publication</a> from KDCloud’11</li>
-  <li>You can also watch the <a href="http://vimeo.com/20489778">video</a> of a presentation given at LinkedIn.</li>
-</ul>
-</div>
+        <blockquote>
+          <p>This is the documentation for S4 0.6.0. For previous versions, please refer to the <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">wiki</a></p>
+        </blockquote>
+        
+        <p>S4 (Simple Scalable Streaming System) is a general-purpose, distributed, scalable, fault-tolerant, pluggable platform that allows programmers to easily develop applications for processing continuous, unbounded streams of data.</p>
+        
+        <h2 id="getting-started">Getting Started</h2>
+        
+        <ul>
+          <li>You may start with an <a href="overview">overview</a> of the platform</li>
+          <li>Then follow a <a href="walkthrough">walkthrough</a> for an hands-on introduction</li>
+          <li>Complement with a look at a <a href="twitter_trending_example">topic trending</a> application using Twitter data  </li>
+          <li>And <a href="dev_tips">here</a> are some tips to ease the development process</li>
+        </ul>
+        
+        <h2 id="configuration">Configuration</h2>
+        
+        <ul>
+          <li><a href="configuration">Customize the platform and pass configuration parameters</a></li>
+          <li>Add <a href="application_dependencies">application dependencies</a>
+        </li>
+          <li>
+        <a href="event_dispatch">Dispatch events </a> within an application and between applications</li>
+          <li>
+        <a href="event_injection">Inject events</a> into S4 applications</li>
+        </ul>
+        
+        <h2 id="running-s4">Running S4</h2>
+        <ul>
+          <li>
+        <a href="tools">Commands</a> for creating, running and managing applications</li>
+          <li>
+        <a href="metrics">Monitor</a> the system</li>
+        </ul>
+        
+        <h2 id="features">Features</h2>
+        
+        <ul>
+          <li>Details about <a href="fault_tolerance">fault tolerance</a>
+        </li>
+        </ul>
+        
+        <h2 id="troubleshooting">Troubleshooting</h2>
+        
+        <ul>
+          <li><a href="recommended_practices">Recommended practices</a></li>
+          <li>Try the <a href="https://cwiki.apache.org/confluence/display/S4/FAQ">FAQ</a>
+        </li>
+          <li>Try the <a href="https://cwiki.apache.org/S4/s4-apache-mailing-lists.html">mailing lists</a>
+        </li>
+        </ul>
+        
+        <h2 id="resources">Resources</h2>
+        <ul>
+          <li>Questions can be asked through the <a href="https://cwiki.apache.org/confluence/display/S4/S4+Apache+mailing+lists">mailing lists</a>
+        </li>
+          <li>The source code is available through <a href="https://git-wip-us.apache.org/repos/asf?p=incubator-s4.git">git</a>, <a href="http://incubator.apache.org/s4/contrib/">here</a> are instructions for fetching the code.</li>
+          <li>A nice set of <a href="http://www.slideshare.net/leoneu/20111104-s4-overview">slides</a> was used for a presentation at Stanford in November 2011.</li>
+          <li>The driving ideas are detailed in a <a href="http://www.4lunas.org/pub/2010-s4.pdf">conference publication</a> from KDCloud’11</li>
+          <li>You can also watch the <a href="http://vimeo.com/20489778">video</a> of a presentation given at LinkedIn.</li>
+        </ul>
+      </div>
     </div>
     <div id="footer">
       <div class="container">

Modified: incubator/s4/site/doc/0.6.0/metrics/index.html
URL: http://svn.apache.org/viewvc/incubator/s4/site/doc/0.6.0/metrics/index.html?rev=1488543&r1=1488542&r2=1488543&view=diff
==============================================================================
--- incubator/s4/site/doc/0.6.0/metrics/index.html (original)
+++ incubator/s4/site/doc/0.6.0/metrics/index.html Sat Jun  1 16:37:44 2013
@@ -1,16 +1,17 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html>
 <html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>S4: Metrics</title>
-<meta content="A general-purpose distributed stream computing platform" name="description">
-<link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
-<link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
-<!--[if lt IE 9]>
+  <head>
+    <title>S4: Metrics</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+    <meta content="A general-purpose distributed stream computing platform" name="description">
+    <link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
+    <link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
+    <!--[if lt IE 9]>
       <link href="../../../style/ie.css" media="screen" rel="stylesheet" type="text/css">
-    <![endif]--><link href="../../../style/style.css" rel="stylesheet" type="text/css">
-<link href="../../../style/nav.css" rel="stylesheet" type="text/css">
-<script type="text/javascript">
+    <![endif]-->
+    <link href="../../../style/style.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/nav.css" rel="stylesheet" type="text/css">
+    <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-19490961-1']);
         _gaq.push(['_setDomainName', 'incubator.apache.org']);
@@ -20,91 +21,95 @@
           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><link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
-<link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
-</head>
-<body>
+      </script>
+    <link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
+  </head>
+  <body>
     <div id="header">
       <div class="container">
         <div id="logo">
           <a href="../../../">
-            <img src="../../../images/s4_test.png"></a>
+            <img src="../../../images/s4_test.png">
+          </a>
+        </div>
+        <div id="navbar">
+          <ul id="nav">
+            <li>
+              <a href="../../../">home</a>
+            </li>
+            <li>
+              <a href="..">doc</a>
+            </li>
+            <li>
+              <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
+            </li>
+            <li>
+              <a href="http://people.apache.org/~mmorel/apache-s4-0.6.0-incubating-doc/javadoc/">API</a>
+            </li>
+            <li>
+              <a href="../../../contrib">get involved</a>
+            </li>
+            <li>
+              <a href="../../../team">team</a>
+            </li>
+            <li>
+              <a href="../../../download">download</a>
+            </li>
+          </ul>
         </div>
-        <div id="navbar"><ul id="nav">
-<li>
-    <a href="../../../">home</a>
-  </li>
-  <li>
-    <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">doc [0.5]</a>
-  </li>
-  <li>
-    <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
-  </li>
-  <li>
-    <a href="http://people.apache.org/~mmorel/apache-s4-0.5.0-incubating-doc/javadoc/">API</a>
-  </li>
-  <li>
-    <a href="../../../contrib">get involved</a>
-  </li>
-  <li>
-    <a href="../../../team">team</a>
-  </li>
-  <li>
-    <a href="../../../download">download</a>
-  </li>
-</ul></div>
       </div>
     </div>
     <div id="wrapper">
       <div class="container" id="container">
-<blockquote>
-  <p>S4 continuously collects runtime statistics. Let’s see how to access these and add custom ones.</p>
-</blockquote>
-
-<h1 id="why">Why?</h1>
-
-<p>S4 aims at processing large quantities of events with low latency. In order to achieve this goal, a key requirement is to be able to monitor system internals at runtime.</p>
-
-<h1 id="how">How?</h1>
-<p>For that purpose, we include a system for gathering statistics about various parts of the S4 platform.</p>
-
-<p>We rely on the <a href="http://metrics.codahale.com">metrics</a> library, which offers an efficient way to gather such information and relies on statistical techniques to minimize memory consumption.</p>
-
-<h1 id="what">What?</h1>
-
-<p>By default, S4 instruments queues, caches, checkpointing, event reception and emission and statistics are available for all of these components.</p>
-
-<p>You can also monitor your own PEs. Simply add new probes (<code>Meter</code>, <code>Gauge</code>, etc..) and report interesting updates to them. There is nothing else to do, these custom metrics will be reported along with the S4 metrics, as explained next.</p>
-
-<h1 id="where">Where?</h1>
-
-<p>By default, metrics are exposed by each node through JMX.</p>
-
-<p>The <code>s4.metrics.config</code> parameter enables periodic dumps of aggregated statistics to the <strong>console</strong> or to <strong>files</strong> in csv format. This parameter is specified as a node or application parameter <sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>, and must match the following regular expression: </p>
-
-<pre><code>(csv:.+|console):(\d+):(DAYS|HOURS|MICROSECONDS|MILLISECONDS|MINUTES|NANOSECONDS|SECONDS)
-</code></pre>
-
-<p>Examples:</p>
-
-<pre><code># dump metrics to csv files to /path/to/directory every 10 seconds
-# (recommendation: use a different and clean directory for each of the nodes)
-csv:/path/to/directory:10:SECONDS
-
-# dump metrics to the console every minute
-console:1:MINUTES
-</code></pre>
-
-<p>Reporting to Ganglia or Graphite is not provided out of the box with S4, but it’s quite easy to add. You simply have to add the corresponding dependencies to your project and enable reporting to these systems during the initialization of your application. See the <a href="http://metrics.codahale.com">metrics</a> documentation for more information.</p>
-
-<div class="footnotes">
-  <ol>
-<li id="fn:1">
-      <p>csv-based metrics logging are usually specified as a node configuration, and must point to a clean directory, different for each node. Otherwise the metrics logging system will try to create multiple new files with the same name, and depending on your setup, that may not be possible.<a href="#fnref:1" rel="reference">↩</a></p>
-    </li>
-  </ol>
-</div>
-</div>
+        <blockquote>
+          <p>S4 continuously collects runtime statistics. Let’s see how to access these and add custom ones.</p>
+        </blockquote>
+        
+        <h1 id="why">Why?</h1>
+        
+        <p>S4 aims at processing large quantities of events with low latency. In order to achieve this goal, a key requirement is to be able to monitor system internals at runtime.</p>
+        
+        <h1 id="how">How?</h1>
+        <p>For that purpose, we include a system for gathering statistics about various parts of the S4 platform.</p>
+        
+        <p>We rely on the <a href="http://metrics.codahale.com">metrics</a> library, which offers an efficient way to gather such information and relies on statistical techniques to minimize memory consumption.</p>
+        
+        <h1 id="what">What?</h1>
+        
+        <p>By default, S4 instruments queues, caches, checkpointing, event reception and emission and statistics are available for all of these components.</p>
+        
+        <p>You can also monitor your own PEs. Simply add new probes (<code>Meter</code>, <code>Gauge</code>, etc..) and report interesting updates to them. There is nothing else to do, these custom metrics will be reported along with the S4 metrics, as explained next.</p>
+        
+        <h1 id="where">Where?</h1>
+        
+        <p>By default, metrics are exposed by each node through JMX.</p>
+        
+        <p>The <code>s4.metrics.config</code> parameter enables periodic dumps of aggregated statistics to the <strong>console</strong> or to <strong>files</strong> in csv format. This parameter is specified as a node or application parameter <sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup>, and must match the following regular expression: </p>
+        
+        <pre><code>(csv:.+|console):(\d+):(DAYS|HOURS|MICROSECONDS|MILLISECONDS|MINUTES|NANOSECONDS|SECONDS)
+        </code></pre>
+        
+        <p>Examples:</p>
+        
+        <pre><code># dump metrics to csv files to /path/to/directory every 10 seconds
+        # (recommendation: use a different and clean directory for each of the nodes)
+        csv:/path/to/directory:10:SECONDS
+        
+        # dump metrics to the console every minute
+        console:1:MINUTES
+        </code></pre>
+        
+        <p>Reporting to Ganglia or Graphite is not provided out of the box with S4, but it’s quite easy to add. You simply have to add the corresponding dependencies to your project and enable reporting to these systems during the initialization of your application. See the <a href="http://metrics.codahale.com">metrics</a> documentation for more information.</p>
+        
+        <div class="footnotes">
+          <ol>
+            <li id="fn:1">
+              <p>csv-based metrics logging are usually specified as a node configuration, and must point to a clean directory, different for each node. Otherwise the metrics logging system will try to create multiple new files with the same name, and depending on your setup, that may not be possible.<a href="#fnref:1" class="reversefootnote">↩</a></p>
+            </li>
+          </ol>
+        </div>
+      </div>
     </div>
     <div id="footer">
       <div class="container">

Modified: incubator/s4/site/doc/0.6.0/overview/index.html
URL: http://svn.apache.org/viewvc/incubator/s4/site/doc/0.6.0/overview/index.html?rev=1488543&r1=1488542&r2=1488543&view=diff
==============================================================================
--- incubator/s4/site/doc/0.6.0/overview/index.html (original)
+++ incubator/s4/site/doc/0.6.0/overview/index.html Sat Jun  1 16:37:44 2013
@@ -1,16 +1,17 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html>
 <html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>S4: S4 0.6.0 overview</title>
-<meta content="A general-purpose distributed stream computing platform" name="description">
-<link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
-<link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
-<!--[if lt IE 9]>
+  <head>
+    <title>S4: S4 0.6.0 overview</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+    <meta content="A general-purpose distributed stream computing platform" name="description">
+    <link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
+    <link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
+    <!--[if lt IE 9]>
       <link href="../../../style/ie.css" media="screen" rel="stylesheet" type="text/css">
-    <![endif]--><link href="../../../style/style.css" rel="stylesheet" type="text/css">
-<link href="../../../style/nav.css" rel="stylesheet" type="text/css">
-<script type="text/javascript">
+    <![endif]-->
+    <link href="../../../style/style.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/nav.css" rel="stylesheet" type="text/css">
+    <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-19490961-1']);
         _gaq.push(['_setDomainName', 'incubator.apache.org']);
@@ -20,154 +21,166 @@
           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><link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
-<link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
-</head>
-<body>
+      </script>
+    <link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
+  </head>
+  <body>
     <div id="header">
       <div class="container">
         <div id="logo">
           <a href="../../../">
-            <img src="../../../images/s4_test.png"></a>
+            <img src="../../../images/s4_test.png">
+          </a>
+        </div>
+        <div id="navbar">
+          <ul id="nav">
+            <li>
+              <a href="../../../">home</a>
+            </li>
+            <li>
+              <a href="..">doc</a>
+            </li>
+            <li>
+              <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
+            </li>
+            <li>
+              <a href="http://people.apache.org/~mmorel/apache-s4-0.6.0-incubating-doc/javadoc/">API</a>
+            </li>
+            <li>
+              <a href="../../../contrib">get involved</a>
+            </li>
+            <li>
+              <a href="../../../team">team</a>
+            </li>
+            <li>
+              <a href="../../../download">download</a>
+            </li>
+          </ul>
         </div>
-        <div id="navbar"><ul id="nav">
-<li>
-    <a href="../../../">home</a>
-  </li>
-  <li>
-    <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">doc [0.5]</a>
-  </li>
-  <li>
-    <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
-  </li>
-  <li>
-    <a href="http://people.apache.org/~mmorel/apache-s4-0.5.0-incubating-doc/javadoc/">API</a>
-  </li>
-  <li>
-    <a href="../../../contrib">get involved</a>
-  </li>
-  <li>
-    <a href="../../../team">team</a>
-  </li>
-  <li>
-    <a href="../../../download">download</a>
-  </li>
-</ul></div>
       </div>
     </div>
     <div id="wrapper">
       <div class="container" id="container">
-<h1 id="what-is-s4">What is S4?</h1>
-
-<p>S4 is a general-purpose,near real-time, distributed, decentralized, scalable, event-driven, modular platform that allows programmers to easily implement applications for processing continuous unbounded streams of data.</p>
-
-<p>S4 0.5 focused on providing a functional complete refactoring.</p>
-
-<p>S4 0.6 builds on this basis and brings plenty of exciting features, in particular:</p>
-
-<ul>
-<li>
-<strong>major performance improvements</strong>: stream throughput improved by 1000 % (200k+ messages / s / stream)</li>
-  <li>major <a href="../configuration">configurability</a> and usability improvements, for both the S4 platform and deployed applications</li>
-</ul>
-<h1 id="what-are-the-cool-features">What are the cool features?</h1>
-
-<p><strong>Flexible deployment</strong>:</p>
-
-<ul>
-<li>Application packages are standard jar files (suffixed <code>.s4r</code>)</li>
-  <li>Platform modules for customizing the platform are standard jar files</li>
-  <li>By default keys are homogeneously sparsed over the cluster: helps balance the load, especially for fine grained partitioning</li>
-</ul>
-<p><strong>Modular design</strong>:</p>
-
-<ul>
-<li>both the platform and the applications are built by dependency injection, and configured through independent modules.</li>
-  <li>makes it <strong>easy to customize</strong> the system according to specific requirements</li>
-  <li>pluggable event serving policies: <strong>load shedding, throttling, blocking</strong>
-</li>
-</ul>
-<p><strong>Dynamic and loose coupling of S4 applications</strong>:</p>
-
-<ul>
-<li>through a pub-sub mechanism</li>
-  <li>makes it easy to:
-    <ul>
-<li>assemble subsystems into larger systems</li>
-      <li>reuse applications</li>
-      <li>separate pre-processing</li>
-      <li>provision, control and update subsystems independently</li>
-    </ul>
-</li>
-</ul>
-<p><strong><a href="../fault_tolerance">Fault tolerant</a></strong></p>
-
-<ul>
-<li>
-<strong>Fail-over</strong> mechanism for high availability</li>
-  <li>
-<strong>Checkpointing and recovery</strong> mechanism for minimizing state loss</li>
-</ul>
-<p><strong>Pure Java</strong>: statically typed, easy to understand, to refactor, and to extend</p>
-
-<h1 id="how-does-it-work">How does it work?</h1>
-
-<h2 id="some-definitions">Some definitions</h2>
-
-<p><strong>Platform</strong></p>
-
-<ul>
-<li>S4 provides a runtime distributed platform that handles communication, scheduling and distribution across containers.</li>
-  <li>Distributed containers are called <strong>S4 nodes</strong>
-</li>
-  <li>S4 nodes are deployed on <strong>S4 clusters</strong>
-</li>
-  <li>S4 clusters define named ensembles of S4 nodes
-    <ul>
-<li>by default, the size of the cluster is fixed</li>
-      <li>the size of an S4 cluster corresponds to the number of logical <strong>partitions</strong> (sometimes referred to as <strong>tasks</strong>)</li>
-    </ul>
-</li>
-</ul>
-<blockquote>
-  <p>an ongoing integration with <a href="http://helix.apache.org">Apache Helix</a> will remove these limitations and allow a variable number of nodes and rebalancing the partitions</p>
-</blockquote>
-
-<p><strong>Applications</strong></p>
-
-<ul>
-<li>Users develop applications and deploy them on S4 clusters</li>
-  <li>Applications are built as a graph of:
-    <ul>
-<li>
-<strong>Processing elements</strong> (PEs)</li>
-      <li>
-<strong>Streams</strong> that interconnect PEs</li>
-    </ul>
-</li>
-  <li>PEs communicate asynchronously by sending <strong>events</strong> on streams.</li>
-  <li>Events are dispatched to nodes according to their <strong>key</strong>
-</li>
-</ul>
-<p><strong>External streams</strong> are a special kind of stream that:</p>
-
-<ul>
-<li>send events outside of the application</li>
-  <li>receive events from external sources</li>
-  <li>can interconnect and assemble applications into larger systems.</li>
-</ul>
-<p><strong>Adapters</strong> are S4 applications that can convert external streams into streams of S4 events. Since adapters are also S4 applications, they can be scaled easily.</p>
-
-<h2 id="a-hierarchical-perspective-on-s4">A hierarchical perspective on S4</h2>
-
-<p>The following diagram sums-up the key concepts in a hierarchical fashion:</p>
-
-<p><img src="../../../images/doc/0.6.0/S4_hierarchical_archi.png" alt="image"></p>
-
-<h2 id="note">Note</h2>
-
-<p>S4 0.6 works exclusively with TCP</p>
-</div>
+        <h1 id="what-is-s4">What is S4?</h1>
+        
+        <p>S4 is a general-purpose,near real-time, distributed, decentralized, scalable, event-driven, modular platform that allows programmers to easily implement applications for processing continuous unbounded streams of data.</p>
+        
+        <p>S4 0.5 focused on providing a functional complete refactoring.</p>
+        
+        <p>S4 0.6 builds on this basis and brings plenty of exciting features, in particular:</p>
+        
+        <ul>
+          <li>
+        <strong>major performance improvements</strong>: stream throughput improved by 1000 % (200k+ messages / s / stream)</li>
+          <li>major <a href="../configuration">configurability</a> and usability improvements, for both the S4 platform and deployed applications</li>
+        </ul>
+        
+        <h1 id="what-are-the-cool-features">What are the cool features?</h1>
+        
+        <p><strong>Flexible deployment</strong>:</p>
+        
+        <ul>
+          <li>Application packages are standard jar files (suffixed <code>.s4r</code>)</li>
+          <li>Platform modules for customizing the platform are standard jar files</li>
+          <li>By default keys are homogeneously sparsed over the cluster: helps balance the load, especially for fine grained partitioning</li>
+        </ul>
+        
+        <p><strong>Modular design</strong>:</p>
+        
+        <ul>
+          <li>both the platform and the applications are built by dependency injection, and configured through independent modules.</li>
+          <li>makes it <strong>easy to customize</strong> the system according to specific requirements</li>
+          <li>pluggable event serving policies: <strong>load shedding, throttling, blocking</strong>
+        </li>
+        </ul>
+        
+        <p><strong>Dynamic and loose coupling of S4 applications</strong>:</p>
+        
+        <ul>
+          <li>through a pub-sub mechanism</li>
+          <li>makes it easy to:
+            <ul>
+              <li>assemble subsystems into larger systems</li>
+              <li>reuse applications</li>
+              <li>separate pre-processing</li>
+              <li>provision, control and update subsystems independently</li>
+            </ul>
+          </li>
+        </ul>
+        
+        <p><strong><a href="../fault_tolerance">Fault tolerant</a></strong></p>
+        
+        <ul>
+          <li>
+        <strong>Fail-over</strong> mechanism for high availability</li>
+          <li>
+        <strong>Checkpointing and recovery</strong> mechanism for minimizing state loss</li>
+        </ul>
+        
+        <p><strong>Pure Java</strong>: statically typed, easy to understand, to refactor, and to extend</p>
+        
+        <h1 id="how-does-it-work">How does it work?</h1>
+        
+        <h2 id="some-definitions">Some definitions</h2>
+        
+        <p><strong>Platform</strong></p>
+        
+        <ul>
+          <li>S4 provides a runtime distributed platform that handles communication, scheduling and distribution across containers.</li>
+          <li>Distributed containers are called <strong>S4 nodes</strong>
+        </li>
+          <li>S4 nodes are deployed on <strong>S4 clusters</strong>
+        </li>
+          <li>S4 clusters define named ensembles of S4 nodes
+            <ul>
+              <li>by default, the size of the cluster is fixed</li>
+              <li>the size of an S4 cluster corresponds to the number of logical <strong>partitions</strong> (sometimes referred to as <strong>tasks</strong>)</li>
+            </ul>
+          </li>
+        </ul>
+        
+        <blockquote>
+          <p>an ongoing integration with <a href="http://helix.apache.org">Apache Helix</a> will remove these limitations and allow a variable number of nodes and rebalancing the partitions</p>
+        </blockquote>
+        
+        <p><strong>Applications</strong></p>
+        
+        <ul>
+          <li>Users develop applications and deploy them on S4 clusters</li>
+          <li>Applications are built as a graph of:
+            <ul>
+              <li>
+        <strong>Processing elements</strong> (PEs)</li>
+              <li>
+        <strong>Streams</strong> that interconnect PEs</li>
+            </ul>
+          </li>
+          <li>PEs communicate asynchronously by sending <strong>events</strong> on streams.</li>
+          <li>Events are dispatched to nodes according to their <strong>key</strong>
+        </li>
+        </ul>
+        
+        <p><strong>External streams</strong> are a special kind of stream that:</p>
+        
+        <ul>
+          <li>send events outside of the application</li>
+          <li>receive events from external sources</li>
+          <li>can interconnect and assemble applications into larger systems.</li>
+        </ul>
+        
+        <p><strong>Adapters</strong> are S4 applications that can convert external streams into streams of S4 events. Since adapters are also S4 applications, they can be scaled easily.</p>
+        
+        <h2 id="a-hierarchical-perspective-on-s4">A hierarchical perspective on S4</h2>
+        
+        <p>The following diagram sums-up the key concepts in a hierarchical fashion:</p>
+        
+        <p><img src="../../../images/doc/0.6.0/S4_hierarchical_archi.png" alt="image"></p>
+        
+        <h2 id="note">Note</h2>
+        
+        <p>S4 0.6 works exclusively with TCP</p>
+      </div>
     </div>
     <div id="footer">
       <div class="container">

Modified: incubator/s4/site/doc/0.6.0/recommended_practices/index.html
URL: http://svn.apache.org/viewvc/incubator/s4/site/doc/0.6.0/recommended_practices/index.html?rev=1488543&r1=1488542&r2=1488543&view=diff
==============================================================================
--- incubator/s4/site/doc/0.6.0/recommended_practices/index.html (original)
+++ incubator/s4/site/doc/0.6.0/recommended_practices/index.html Sat Jun  1 16:37:44 2013
@@ -1,16 +1,17 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html>
 <html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>S4: Recommended practices</title>
-<meta content="A general-purpose distributed stream computing platform" name="description">
-<link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
-<link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
-<!--[if lt IE 9]>
+  <head>
+    <title>S4: Recommended practices</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+    <meta content="A general-purpose distributed stream computing platform" name="description">
+    <link href="../../../style/screen.css" media="screen" rel="stylesheet" type="text/css">
+    <link href="../../../style/print.css" media="print" rel="stylesheet" type="text/css">
+    <!--[if lt IE 9]>
       <link href="../../../style/ie.css" media="screen" rel="stylesheet" type="text/css">
-    <![endif]--><link href="../../../style/style.css" rel="stylesheet" type="text/css">
-<link href="../../../style/nav.css" rel="stylesheet" type="text/css">
-<script type="text/javascript">
+    <![endif]-->
+    <link href="../../../style/style.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/nav.css" rel="stylesheet" type="text/css">
+    <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-19490961-1']);
         _gaq.push(['_setDomainName', 'incubator.apache.org']);
@@ -20,50 +21,54 @@
           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><link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
-<link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
-</head>
-<body>
+      </script>
+    <link href="../../../style/coderay.css" rel="stylesheet" type="text/css">
+    <link href="../../../style/pygmentize.css" rel="stylesheet" type="text/css">
+  </head>
+  <body>
     <div id="header">
       <div class="container">
         <div id="logo">
           <a href="../../../">
-            <img src="../../../images/s4_test.png"></a>
+            <img src="../../../images/s4_test.png">
+          </a>
+        </div>
+        <div id="navbar">
+          <ul id="nav">
+            <li>
+              <a href="../../../">home</a>
+            </li>
+            <li>
+              <a href="..">doc</a>
+            </li>
+            <li>
+              <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
+            </li>
+            <li>
+              <a href="http://people.apache.org/~mmorel/apache-s4-0.6.0-incubating-doc/javadoc/">API</a>
+            </li>
+            <li>
+              <a href="../../../contrib">get involved</a>
+            </li>
+            <li>
+              <a href="../../../team">team</a>
+            </li>
+            <li>
+              <a href="../../../download">download</a>
+            </li>
+          </ul>
         </div>
-        <div id="navbar"><ul id="nav">
-<li>
-    <a href="../../../">home</a>
-  </li>
-  <li>
-    <a href="https://cwiki.apache.org/confluence/display/S4/S4+Wiki">doc [0.5]</a>
-  </li>
-  <li>
-    <a href="http://git-wip-us.apache.org/repos/asf?p=incubator-s4.git" onclick="_gaq.push(['_trackEvent', 'External', 'Apache Git', 'http://github.com/s4']);">code</a>
-  </li>
-  <li>
-    <a href="http://people.apache.org/~mmorel/apache-s4-0.5.0-incubating-doc/javadoc/">API</a>
-  </li>
-  <li>
-    <a href="../../../contrib">get involved</a>
-  </li>
-  <li>
-    <a href="../../../team">team</a>
-  </li>
-  <li>
-    <a href="../../../download">download</a>
-  </li>
-</ul></div>
       </div>
     </div>
     <div id="wrapper">
       <div class="container" id="container">
-<h1 id="do-not-reuse-s4-events">Do not reuse S4 events</h1>
-
-<p><strong>S4 events are immutable, however immutability is not currently enforced.</strong>
-Make sure you do not reuse incoming events and for instance simply update a field. Instead, create a new event (you may extend the <code>Event</code> class and defined a copy constructor) with the new field value.</p>
-
-<p>More information available in this <a href="https://issues.apache.org/jira/browse/S4-104">ticket</a></p>
-</div>
+        <h1 id="do-not-reuse-s4-events">Do not reuse S4 events</h1>
+        
+        <p><strong>S4 events are immutable, however immutability is not currently enforced.</strong>
+        Make sure you do not reuse incoming events and for instance simply update a field. Instead, create a new event (you may extend the <code>Event</code> class and defined a copy constructor) with the new field value.</p>
+        
+        <p>More information available in this <a href="https://issues.apache.org/jira/browse/S4-104">ticket</a></p>
+      </div>
     </div>
     <div id="footer">
       <div class="container">



Mime
View raw message