<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 18, 2014 at 3:29 PM, Pedro Ruivo <span dir="ltr">&lt;<a href="mailto:pedro@infinispan.org" target="_blank">pedro@infinispan.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
<br>
On 09/18/2014 12:03 PM, Dan Berindei wrote:<br>
&gt; Thanks Pedro, this looks great.<br>
&gt;<br>
&gt; However, I don&#39;t think it&#39;s ok to treat CommitCommands/Pessimistic<br>
&gt; PrepareCommands as RemoteLockCommands just because they may send L1<br>
&gt; invalidation commands. It&#39;s true that those commands will block, but<br>
&gt; there&#39;s no need to wait for any other command before doing the L1<br>
&gt; invalidation. In fact, the non-tx writes on backup owners, which you<br>
&gt; consider to be non-blocking, can also send L1 invalidation commands (see<br>
&gt; L1NonTxInterceptor.invalidateL1).<br>
<br>
</span>They are not treated as RemoteLockCommands. I just said that they are<br>
processed in the remote executor service (need to double check what I<br>
wrote in the wiki). Unfortunately, I haven&#39;t think about the L1 in that<br>
scenario... :(<br></blockquote><div><br></div><div>Ok, sorry I leapt to conclusions :)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class=""><br>
&gt;<br>
&gt; On the other hand, one of the good things that the remote executor did<br>
&gt; was to allow queueing lots of commands with a higher topology id, when<br>
&gt; one of the nodes receives the new topology much later than the others.<br>
&gt; We still have to consider each TopologyAffectedCommand as potentially<br>
&gt; blocking and put it through the remote executor.<br>
&gt;<br>
&gt; And InvalidateL1Commands are also TopologyAffectedCommands, so there&#39;s<br>
&gt; still a potential for deadlock when L1 is enabled and we have maxThreads<br>
&gt; write commands blocked sending L1 invalidations and those L1<br>
&gt; invalidation commands are stuck in the remote executor&#39;s queue on<br>
&gt; another node. And with (very) unlucky timing the remote executor might<br>
&gt; not even get to create maxThreads threads before the deadlock appears. I<br>
&gt; wonder if we could write a custom executor that checks what the first<br>
&gt; task in the queue is every second or so, and creates a bunch of new<br>
&gt; threads if the first task in the queue hasn&#39;t changed.<br>
<br>
</span>I need to think a little more about it.<br>
<br>
So, a single put can originate:<br>
1 RPC to the primary owner (to lock)<br>
X RPC to invalidate L1 from the primary owner<br>
R RPC for the primary owner to the backups owner<br>
Y RPC to invalidate L1 from the backup owner<br>
<br>
is this correct?<br></blockquote><div><br></div><div>That is correct when &quot;smart&quot; L1 invalidation is enabled (l1.invalidationThreshold &gt; 0). But it is disabled by default, so it&#39;s more like this:</div><div><br></div><div>1 RPC to the primary owner</div><div>0 or 1 broadcast RPC to invalidate L1 from the primary owner</div><div>numOwners - 1 from the primary owner to the backup owners</div><div>0 or 1 broadcast RPCs from each backup owners</div><div><br></div><div>In rare circumstances there might be some more L1 invalidations from the L1LastChanceInterceptor.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
any suggestions are welcome.<br>
<span class=""><br>
&gt;<br>
&gt; You&#39;re right about the remote executor getting full as well, we&#39;re<br>
&gt; lacking any feedback mechanism to tell the sender to slow down, except<br>
&gt; for blocking the OOB thread. I wonder if we could tell JGroups somehow<br>
&gt; to discard the message from inside MessageDispatcher.handle (e.g. throw<br>
&gt; a DiscardMessageException), so the sender has to retransmit it and we<br>
&gt; don&#39;t block the OOB thread. That should allow us to set a size limit on<br>
&gt; the BlockingTaskAwareExecutor&#39;s blockedTasks collection as well. Bela, WDYT?<br>
<br>
</span>Even if we have a way to tell the JGroups to resend the message, we have<br>
no idea if the executor service is full or not. We allow a user to<br>
inject their own implementation of it.<br></blockquote><div><br></div><div>We do allow a custom executor implementation, but it&#39;s our SPI. So we can require the custom executor to be configured to throw a RejectedExecutionException when the queue is full instead of blocking the caller thread, if it helps us.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class=""><br>
&gt;<br>
&gt; Cheers<br>
&gt; Dan<br>
&gt;<br>
&gt;<br>
&gt; On Wed, Sep 17, 2014 at 7:17 PM, Pedro Ruivo &lt;<a href="mailto:pedro@infinispan.org">pedro@infinispan.org</a><br>
</span><span class="">&gt; &lt;mailto:<a href="mailto:pedro@infinispan.org">pedro@infinispan.org</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;     new link:<br>
&gt;     <a href="https://github.com/infinispan/infinispan/wiki/Remote-Command-Handler" target="_blank">https://github.com/infinispan/infinispan/wiki/Remote-Command-Handler</a><br>
&gt;<br>
&gt;     On 09/17/2014 05:08 PM, Pedro Ruivo wrote:<br>
&gt;      &gt; Hi,<br>
&gt;      &gt;<br>
&gt;      &gt; I&#39;ve just wrote on the wiki a new algorithm to better handle the<br>
&gt;     remote<br>
&gt;      &gt; commands. You can find it in [1].<br>
&gt;      &gt;<br>
&gt;      &gt; If you have questions, suggestion or just want to discuss some<br>
&gt;     aspect,<br>
&gt;      &gt; please do in thread. I&#39;ll update the wiki page based on this<br>
&gt;     discussion<br>
&gt;      &gt;<br>
&gt;      &gt; Thanks.<br>
&gt;      &gt;<br>
&gt;      &gt; Cheers,<br>
&gt;      &gt; Pedro<br>
&gt;      &gt;<br>
&gt;      &gt;<br>
&gt;     [1]<a href="https://github.com/infinispan/infinispan/wiki/Remote-Command-Handler-(Work-In-Progress.." target="_blank">https://github.com/infinispan/infinispan/wiki/Remote-Command-Handler-(Work-In-Progress..</a>.)<br>
&gt;      &gt;<br>
&gt;     _______________________________________________<br>
&gt;     infinispan-dev mailing list<br>
</span>&gt;     <a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a> &lt;mailto:<a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a>&gt;<br>
&gt;     <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
<div class="HOEnZb"><div class="h5">&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; infinispan-dev mailing list<br>
&gt; <a href="mailto:infinispan-dev@lists.jboss.org">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>
&gt;<br>
_______________________________________________<br>
infinispan-dev mailing list<br>
<a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
</div></div></blockquote></div><br></div></div>