<p>
On Mar 9, 2012 4:19 PM, &quot;Bela Ban&quot; &lt;<a href="mailto:bban@redhat.com" target="_blank">bban@redhat.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Wow !<br>
&gt;<br>
&gt; Does this need to be so complex ? I&#39;ve spent a hour trying to understand<br>
&gt; it, and am still overwhelmed... :-)<br>
&gt;</p><p><br></p><p>Sorry about that Bela, it is quite complex indeed.<br></p><p><br>
</p><p>&gt; My understanding (based on my changed in 4.2) is that state transfer<br>
&gt; moves/deletes keys based on the diff between 2 subsequent views:<br>
&gt; - Each node checks all of the affected keys<br>
&gt; - If a key should be stored in additional nodes, the key is pushed there<br>
&gt; - If a key shouldn&#39;t be stored locally anymore, it is removed<br>
&gt;</p><p><br></p><p>That&#39;s fine if we block all writes during state transfer, but once we start allowing writes during state transfer we need to log all changes and send them to the new owners at the end (the approach in 4.2 without your changes) or redirect all commands to the new owners.</p>
<p>In addition to that, we have to either block all commands on the new owners until they receive the entire state or to forward get commands to the old owners as well. The two options apply for lock commands as well.<br>
</p><p><br>
</p><p>&gt; IMO, there&#39;s no need to handle a merge differently from a regular view,<br>
&gt; and we might end up with inconsistent state, but that&#39;s unavoidable<br>
&gt; until we have eventual consistency. Fine...<br>
&gt;</p><p><br></p><p>I&#39;m not trying to make merges more complicated on purpose :)<br></p><p>I think we need to try our best to prevent data loss, even if we there is a chance of inconsistency. We still see clusters in the test suite form via merges from time to time, so we can&#39;t just say after a merge all bets are off.<br>
</p><p>The problem is that I chose to forward get commands to the old owners AND to remove the cache view rollback (which was blocking in our Lisbon design). This means that we must keep a chain of cache views for which we haven&#39;t finished state transfer, and with merges that chain turns into a tree + it has to be broadcasted by the coordinator to all the nodes.<br>
</p><p></p><p><br>
</p><p>&gt; Also, why do we need to transfer ownership information ? Can&#39;t ownership<br>
&gt; be calculated purely on local information ?<br>
&gt;</p><p><br></p><p>The current ownership information can be calculated based solely on the members list. But the ownership in the previous cache view(s) can not be computed by joiners based only on their information, so it has to be broadcasted by the coordinator.<br>
</p><p><br>
&gt; I&#39;m afraid that the complexity will increase the state space (hard to<br>
&gt; test all possible state transitions), lead to unnecessary messages being<br>
&gt; sent and most importantly, might lead to blocks.<br>
&gt;</p><p><br></p><p>I agree the increased complexity is a concern, but I&#39;m not willing to give up on non-blocking state transfer just yet...</p><p>One particularly nasty problem with the existing, blocking, state transfer is that before iterating the data container we need to wait for all the pending commands to finish. So if we have high contention and a 60 seconds lock acquisition timeout, state transfer is almost guaranteed to take &gt; 60 seconds.<br>
</p><p><br></p><p>
&gt; The section on locking outright scares me :-) Perhaps reducing the level<br>
&gt; of details here - as Galder suggested - might help to understand the<br>
&gt; basic design.<br>
&gt;</p><p><br></p><p>I got burned pretty hard with my asymmetric clusters design, because the implementation turned out a lot more complex than the design, so I tried to investigate all the interactions between the different choices we&#39;re making this time.<br>
</p><p><br></p><p>
&gt; Sorry for being a bit negative, but I think state transfer is one of the<br>
&gt; most critical and important pieces of code in DIST mode, and this needs<br>
&gt; to work against large (say a couple of hundreds) clusters and nodes<br>
&gt; joining, leaving or crashing all the times...<br>
&gt;</p><p><br></p><p>I&#39;d argue that the blocking state transfer we have doesn&#39;t satisfy this requirement...<br></p><p><br></p><p>
&gt; I&#39;m going to re-read the design again, maybe what I said above is just<br>
&gt; BS ... :-)<br>
&gt;</p><p><br></p><p>Please do re-read it, I&#39;ll try to simplify it a bit by Monday based on your feedback.<br></p><p><br></p><p>
&gt;<br>
&gt; On 3/8/12 11:55 AM, Dan Berindei wrote:<br>
&gt; &gt; Hi guys<br>
&gt; &gt;<br>
&gt; &gt; It&#39;s been a long time coming, but I finally published the non-blocking<br>
&gt; &gt; state transfer draft on the wiki:<br>
&gt; &gt; <a href="https://community.jboss.org/wiki/Non-blockingStateTransfer" target="_blank">https://community.jboss.org/wiki/Non-blockingStateTransfer</a><br>
&gt; &gt;<br>
&gt; &gt; Unlike my previous state transfer design document, I think I&#39;ve<br>
&gt; &gt; fleshed out most of the implications. Still, there are some things I<br>
&gt; &gt; don&#39;t have a clear solution for yet. As you would expect it&#39;s mostly<br>
&gt; &gt; around merging and delayed state transfer.<br>
&gt; &gt;<br>
&gt; &gt; I&#39;m looking forward to hearing your comments/advice!<br>
&gt; &gt;<br>
&gt; &gt; Cheers<br>
&gt; &gt; Dan<br>
&gt; &gt;<br>
&gt; &gt; PS: Let&#39;s discuss this over the mailing list only.<br>
&gt; &gt;<br>
&gt; --<br>
&gt; Bela Ban, JGroups lead (<a href="http://www.jgroups.org" target="_blank">http://www.jgroups.org</a>)<br>
&gt; _______________________________________________<br>
&gt; infinispan-dev mailing list<br>
&gt; <a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
</p>