<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 29, 2013 at 1:33 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class=""><div class="h5"><br>
<br>
On 10/29/2013 07:58 AM, Radim Vansa wrote:<br>
&gt; On 10/25/2013 08:17 PM, Pedro Ruivo wrote:<br>
&gt;&gt; Hi guys.<br>
&gt;&gt;<br>
&gt;&gt; I&#39;ve open a JIRA to tack this: <a href="https://issues.jboss.org/browse/ISPN-3664" target="_blank">https://issues.jboss.org/browse/ISPN-3664</a><br>
&gt;&gt;<br>
&gt;&gt; Suggestions/feedback is appreciated. This is probably be integrated in<br>
&gt;&gt; the next major (but no promises).<br>
&gt;&gt;<br>
&gt;&gt; I was not cleared just ping me.<br>
&gt;&gt;<br>
&gt;&gt; Have a nice weekend folks :)<br>
&gt;&gt;<br>
&gt;&gt; Regards,<br>
&gt;&gt; Pedro<br>
&gt;&gt;<br>
&gt;&gt; Description is the following:<br>
&gt;&gt;<br>
&gt;&gt; Major refactorization of the write command with the following goals:<br>
&gt;&gt;<br>
&gt;&gt; * Base WriteCommand: all the write command has the same workflow through<br>
&gt;&gt; the interceptor chain<br>
&gt;&gt; * Create a concrete WriteCommand for each operation (put, remove,<br>
&gt;&gt; replace, replaceIfEquals, removeIfEquals, putIfAbsent)<br>
&gt;&gt; * Extend the interceptor chain to process each one of the command and<br>
&gt;&gt; add a new &quot;visitWriteCommand&quot;, that is invoked by the default visitX<br>
&gt;&gt; methods.<br>
&gt;&gt; * (minor) change the GetKeyValueCommand to ReadCommand to make name<br>
&gt;&gt; &quot;compatible&quot; with WriteCommand.<br>
&gt;&gt;<br>
&gt;&gt; Note that most of the interceptor only needs to implement the<br>
&gt;&gt; visitWriteCommand because all the write command has the same execution<br>
&gt;&gt; flow. The basic flow of the write commands are: (non-tx) lock, fetch<br>
&gt;&gt; value (cachestore/remote), check condition and apply change. for tx<br>
&gt;&gt; mode, lock (if pessimistic), fetch value (cache loader, remote, etc),<br>
&gt;&gt; apply change and add it to the transaction (if successful)<br>
&gt; I&#39;ve been wondering for a while why the fetch part is a separate message<br>
&gt; in the write flow. Is the return value of much use when it does not<br>
&gt; return really the replaced value but only some of the previous values?<br>
&gt; And this way you double* the latency. I think that returning the value<br>
&gt; from primary owner as the response for write would make more sense.<br>
&gt; Naturally, for optimistic txs you can only do the get, and for<br>
&gt; pessimistic ones you&#39;d have to return the value together with the<br>
&gt; locking, but still, the operations would make more sense.<br>
<br>
</div></div>Actually, I think you are right. It makes no sense to fecth the value<br>
before the write operation for non-tx caches. I also like your idea of<br>
fetching the value when the key is locked :)<br>
<br>
Do you mind to create a new thread for it (I&#39;m not sure if everybody<br>
reads this thread)?<br></blockquote><div><br>I don&#39;t think we actually fetch the value before the write operation for non-tx caches, at most we do an extra lookup in the local data container (in NonTxDistributionInterceptor.remoteGetBeforeWrite).<br>

<br></div><div>We do fetch the value explicitly in transactional caches, but we don&#39;t invoke the write command remotely in that case.<br></div><div><br></div><div>There is an opportunity for optimization in pessimistic tx caches, because we invoke both a remote get and a remote lock command for the same write command. Perhaps we can make LockControlCommand return the previous value (only if needed, of course).<br>

 <br><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class=""><div class="h5"><br>
&gt;<br>
&gt; *: OK, it&#39;s not doubling as with the write the primary owner replicates<br>
&gt; the write to backups, but it&#39;s doubling the amount of communication<br>
&gt; originating from the requestor node.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; Also, another advantage is the simplification of the EntryFactory<br>
&gt;&gt; because if we think a little about it, independent of the write command<br>
&gt;&gt; we need to wrap the entry anyway.<br>
&gt;&gt;<br>
&gt;&gt; Suggested implementation<br>
&gt;&gt;<br>
&gt;&gt; class abstract WriteCommand,<br>
&gt;&gt; Object key, Object newValue<br>
&gt;&gt; boolen match(Object currentValue) //true by default<br>
&gt;&gt; boolean needsRemoteGetBeforeWrite() //true by default<br>
&gt;&gt; object perform() //common implementation like: if<br>
&gt;&gt; (match(entry.getValue()) then entry.setValue(newValue);<br>
&gt;&gt; entry.setChanged(true); entry.setRemoved(newValue == null)}<br>
&gt;&gt;<br>
&gt;&gt; * Concrete implementations *<br>
&gt;&gt;<br>
&gt;&gt; {PutCommand|RemoveCommand} extends WriteCommand<br>
&gt;&gt; ovewrite needsRemoteGetBeforeWrite() {return<br>
&gt;&gt; !flags.contains(IGNORE_RETURN_VALUE)}<br>
&gt;&gt;<br>
&gt;&gt; ReplaceIfPresentCommand extends WriteCommand<br>
&gt;&gt; ovewrite match(Object currentValue) {return currentValue != null}<br>
&gt;&gt;<br>
&gt;&gt; PutIfAbsentCommand extends WriteCommand<br>
&gt;&gt; ovewrite match(Object currentValue) {return currentValue == null}<br>
&gt;&gt;<br>
&gt;&gt; * Special base class for operation with expected value to compare *<br>
&gt;&gt;<br>
&gt;&gt; class abstract AdvancedWriteCommand extends WriteCommand<br>
&gt;&gt; Object expectedValue<br>
&gt;&gt; match(Object currentValue) {return currentValue.equals(expectedValue)}<br>
&gt; I&#39;d call that rather ConditionalWriteCommand - AdvancedWC sounds too<br>
&gt; general to me.<br></div></div></blockquote><div><br></div><div>+1 for ConditionalWriteCommand<br><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div class=""><div class="h5">
&gt;<br>
&gt; My 2c.<br>
&gt;<br>
&gt; Radim<br>
&gt;<br>
</div></div><div class=""><div class="h5">_______________________________________________<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>