<div dir="ltr">Adding part of your email from REST refactoring thread:<div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Looking into the code, without considering performance at all, I think<br>that you&#39;ve become too ecstatic about Optionals. These should be used as<br>return types for methods, not a) parameters to methods nor b) fields.<br>This is a misuse of the API, according to the authors of Optionals in<br>JDK. Most of the time, you&#39;re not using optionals to have fluent chain<br>of method invocations, so -100 to that.<br></blockquote><div><br></div><div>I&#39;m sorry I&#39;m not picking up the discussion about REST refactoring PR since it has been already merged. Plus I&#39;m not planning to do any Optionals refactoring as long I don&#39;t have a clear vision how we&#39;d like to approach it.</div><div><br></div><div>But I&#39;m actually very happy you touched the use case topic. So far we were discussing advantages and disadvantages of Optionals and we didn&#39;t say much about potential use cases (Katia, Dan, Galder and Sanne also touched a little this topic). </div><div><br></div><div>Indeed, Stephen Colebourne [1] mentions that it should be used as method return types:<br></div><div>&quot;My only fear is that Optional will be overused. Please focus on using it as a return type (from methods that perform some useful piece of functionality) Please don&#39;t use it as the field of a Java-Bean.&quot;</div><div><br></div><div>Brian Goetz also said a few words on Stack Overflow about this [2]:</div><div>&quot;For example, you probably should never use it for something that returns an array of results, or a list of results; instead return an empty array or list. You should almost never use it as a field of something or a method parameter.</div><div>I think routinely using it as a return value for getters would definitely be over-use.&quot;<br></div><div><br></div><div>So if we want to be really dogmatic here, we wouldn&#39;t be able to use Optionals in fields, method parameters, and getters. Please note that I&#39;m blindly putting recommendations mentioned above into code. As it turns out we can use Optionals anywhere, except method returning some objects which are not getters.</div><div><br></div><div>It is also worth to say that both gentlemen are worried that Optionals might be overused in the libraries.</div><div><br></div><div>On the other hand we have Oracle&#39;s tutorials which use Optionals as a fields [3]:</div><div>&quot;public class Soundcard {</div><div>  private Optional&lt;USB&gt; usb;</div><div>  public Optional&lt;USB&gt; getUSB() { ... }</div><div>}&quot;</div><div>and say no word about recommendations mentioned in [1] and [2].</div><div><br></div><div>Also many libraries (like Jackson, Hibernate validator) support Optionals as fields [5]. So it must be somewhat popular use case right?</div><div><br></div><div>I think my favorit reading about Optional use cases is this [6]. So the author suggests to use Optionals as a return types in API boundaries but use nulls inside classes. This has two major advantages:</div><div><ul><li>It makes the library caller aware that the value might not be there</li><li>The returned Optional object will probably die very soon (a called will probably do something with it right away)</li></ul><div>An example based on Oracle&#39;s tutorial would look like this (following this recommendation):</div><div>&quot;public class Soundcard {</div><div>  private USB usb;</div><div>  public Optional&lt;USB&gt; getUSB() { return Optional.ofNullable(usb); }</div><div>}&quot;</div><div><br></div><div>I think it hits exactly into Katia&#39;s, Sanne&#39;s, Dan&#39;s and Galder&#39;s points.</div></div><div><br></div><div>What do you think?</div><div><br></div><div>[1] <a href="http://blog.joda.org/2014/11/optional-in-java-se-8.html">http://blog.joda.org/2014/11/optional-in-java-se-8.html</a></div><div>[2]<span class="inbox-inbox-Apple-converted-space"> </span><a href="https://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555">https://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555</a></div><div>[3] <a href="http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html">http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html</a></div><div>[4] <a href="http://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html">http://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html</a></div><div>[5] <a href="http://dolszewski.com/java/java-8-optional-use-cases/">http://dolszewski.com/java/java-8-optional-use-cases/</a></div><div>[6] <a href="http://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html">http://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html</a></div><br><div class="gmail_quote"><div dir="ltr">On Wed, May 24, 2017 at 4:56 PM Radim Vansa &lt;<a href="mailto:rvansa@redhat.com">rvansa@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I haven&#39;t checked Sebastian&#39;s refactored code, but does it use Optionals<br>
as a *field* type? That&#39;s misuse (same as using it as an arg), it&#39;s<br>
intended solely as method return type.<br>
<br>
Radim<br>
<br>
On 05/23/2017 05:45 PM, Katia Aresti wrote:<br>
&gt; Dan, I disagree with point 2 where you say &quot;You now have a field that<br>
&gt; could be null, Optional.empty(), or Optional.of(something)&quot;<br>
&gt;<br>
&gt; This is the point of optional. You shouldn&#39;t have a field that has<br>
&gt; these 3 possible values, just two of them = Some or None. If the field<br>
&gt; is mutable, it should be initialised to Optional.empty(). In the case<br>
&gt; of an API, Optional implicitly says that the return value can be<br>
&gt; empty, but when you return a &quot;normal&quot; object, either the user reads<br>
&gt; the doc, either will have bugs or boilerplate code defending from the<br>
&gt; possible null value (even if never ever this API will return null)<br>
&gt;<br>
&gt; :o)<br>
&gt;<br>
&gt; Cheers<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Tue, May 23, 2017 at 3:58 PM, Dan Berindei &lt;<a href="mailto:dan.berindei@gmail.com" target="_blank">dan.berindei@gmail.com</a><br>
&gt; &lt;mailto:<a href="mailto:dan.berindei@gmail.com" target="_blank">dan.berindei@gmail.com</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;     I wouldn&#39;t say I&#39;m an extreme naysayer, but I do have 2 issues<br>
&gt;     with Optional:<br>
&gt;<br>
&gt;     1. Performance becomes harder to quantify: the allocations may or<br>
&gt;     may not be eliminated, and a change in one part of the code may<br>
&gt;     change how allocations are eliminated in a completely different<br>
&gt;     part of the code.<br>
&gt;     2. My personal opinion is it&#39;s just ugly... instead of having one<br>
&gt;     field that could be null or non-null, you now have a field that<br>
&gt;     could be null, Optional.empty(), or Optional.of(something).<br>
&gt;<br>
&gt;     Cheers<br>
&gt;     Dan<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;     On Tue, May 23, 2017 at 1:54 PM, Sebastian Laskawiec<br>
&gt;     &lt;<a href="mailto:slaskawi@redhat.com" target="_blank">slaskawi@redhat.com</a> &lt;mailto:<a href="mailto:slaskawi@redhat.com" target="_blank">slaskawi@redhat.com</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;         Hey!<br>
&gt;<br>
&gt;         So I think we have no extreme naysayers to Optional. So let me<br>
&gt;         try to sum up what we have achieved so:<br>
&gt;<br>
&gt;           * In macroscale benchmark based on REST interface using<br>
&gt;             Optionals didn&#39;t lower the performance.<br>
&gt;           * +1 for using it in public APIs, especially for those using<br>
&gt;             functional style.<br>
&gt;           * Creating lots of Optional instances might add some<br>
&gt;             pressure on GC, so we need to be careful when using them<br>
&gt;             in hot code paths. In such cases it is required to run a<br>
&gt;             micro scale benchamark to make sure the performance didn&#39;t<br>
&gt;             drop. The microbenchmark should also be followed by macro<br>
&gt;             scale benchamrk - PerfJobAck. Also, keep an eye on Eden<br>
&gt;             space in such cases.<br>
&gt;<br>
&gt;         If you agree with me, and there are no hard evidence that<br>
&gt;         using Optional degrade performance significantly, I would like<br>
&gt;         to issue a pull request and put those findings into<br>
&gt;         contributing guide [1].<br>
&gt;<br>
&gt;         Thanks,<br>
&gt;         Sebastian<br>
&gt;<br>
&gt;         [1]<br>
&gt;         <a href="https://github.com/infinispan/infinispan/tree/master/documentation/src/main/asciidoc/contributing" rel="noreferrer" target="_blank">https://github.com/infinispan/infinispan/tree/master/documentation/src/main/asciidoc/contributing</a><br>
&gt;         &lt;<a href="https://github.com/infinispan/infinispan/tree/master/documentation/src/main/asciidoc/contributing" rel="noreferrer" target="_blank">https://github.com/infinispan/infinispan/tree/master/documentation/src/main/asciidoc/contributing</a>&gt;<br>
&gt;<br>
&gt;         On Mon, May 22, 2017 at 6:36 PM Galder Zamarreño<br>
&gt;         &lt;<a href="mailto:galder@redhat.com" target="_blank">galder@redhat.com</a> &lt;mailto:<a href="mailto:galder@redhat.com" target="_blank">galder@redhat.com</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;             I think Sanne&#39;s right here, any differences in such large<br>
&gt;             scale test are hard to decipher.<br>
&gt;<br>
&gt;             Also, as mentioned in a previous email, my view on its<br>
&gt;             usage is same as Sanne&#39;s:<br>
&gt;<br>
&gt;             * Definitely in APIs/SPIs.<br>
&gt;             * Be gentle with it internals.<br>
&gt;<br>
&gt;             Cheers,<br>
&gt;             --<br>
&gt;             Galder Zamarreño<br>
&gt;             Infinispan, Red Hat<br>
&gt;<br>
&gt;             &gt; On 18 May 2017, at 14:35, Sanne Grinovero<br>
&gt;             &lt;<a href="mailto:sanne@infinispan.org" target="_blank">sanne@infinispan.org</a> &lt;mailto:<a href="mailto:sanne@infinispan.org" target="_blank">sanne@infinispan.org</a>&gt;&gt; wrote:<br>
&gt;             &gt;<br>
&gt;             &gt; Hi Sebastian,<br>
&gt;             &gt;<br>
&gt;             &gt; sorry but I think you&#39;ve been wasting time, I hope it<br>
&gt;             was fun :) This is not the right methodology to &quot;settle&quot;<br>
&gt;             the matter (unless you want Radim&#39;s eyes to get bloody..).<br>
&gt;             &gt;<br>
&gt;             &gt; Any change in such a complex system will only affect the<br>
&gt;             performance metrics if you&#39;re actually addressing the<br>
&gt;             dominant bottleneck. In some cases it might be CPU, like<br>
&gt;             if your system is at 90%+ CPU then it&#39;s likely that<br>
&gt;             reviewing the code to use less CPU would be beneficial;<br>
&gt;             but even that can be counter-productive, for example if<br>
&gt;             you&#39;re having contention caused by optimistic locking and<br>
&gt;             you fail to address that while making something else<br>
&gt;             &quot;faster&quot; the performance loss on the optimistic lock might<br>
&gt;             become asymptotic.<br>
&gt;             &gt;<br>
&gt;             &gt; A good reason to avoid excessive usage of Optional (and<br>
&gt;             *excessive* doesn&#39;t mean a couple dozen in a millions<br>
&gt;             lines of code..) is to not run out of eden space,<br>
&gt;             especially for all the code running in interpreted mode.<br>
&gt;             &gt;<br>
&gt;             &gt; In your case you&#39;ve been benchmarking a hugely complex<br>
&gt;             beast, not least over REST! When running the REST Server I<br>
&gt;             doubt that allocation in eden is your main problem. You<br>
&gt;             just happened to have a couple Optionals on your path;<br>
&gt;             sure performance changed but there&#39;s no enough data in<br>
&gt;             this way to figure out what exactly happened:<br>
&gt;             &gt;  - did it change at all or was it just because of a<br>
&gt;             lucky optimisation? (The JIT will always optimise stuff<br>
&gt;             differently even when re-running the same code)<br>
&gt;             &gt;  - did the overall picture improve because this code<br>
&gt;             became much *less* slower?<br>
&gt;             &gt;<br>
&gt;             &gt; The real complexity in benchmarking is to accurately<br>
&gt;             understand why it changed; this should also tell you why<br>
&gt;             it didn&#39;t change more, or less..<br>
&gt;             &gt;<br>
&gt;             &gt; To be fair I actually agree that it&#39;s very likely that<br>
&gt;             C2 can make any performance penalty disappear.. that&#39;s<br>
&gt;             totally possible, although it&#39;s unlikely to be faster than<br>
&gt;             just reading the field (assuming we don&#39;t need to do<br>
&gt;             branching because of null-checks but C2 can optimise that<br>
&gt;             as well).<br>
&gt;             &gt; Still this requires the code to be optimised by JIT<br>
&gt;             first, so it won&#39;t prevent us from creating a gazillion of<br>
&gt;             instances if we abuse its usage irresponsibly. Fighting<br>
&gt;             internal NPEs is a matter of writing better code; I&#39;m not<br>
&gt;             against some &quot;Optional&quot; being strategically placed but I<br>
&gt;             believe it&#39;s much nicer for most internal code to just<br>
&gt;             avoid null, use &quot;final&quot;, and initialize things aggressively.<br>
&gt;             &gt;<br>
&gt;             &gt; Sure use Optional where it makes sense, probably most on<br>
&gt;             APIs and SPIs, but please don&#39;t go overboard with it in<br>
&gt;             internals. That&#39;s all I said in the original debate.<br>
&gt;             &gt;<br>
&gt;             &gt; In case you want to benchmark the impact of Optional<br>
&gt;             make a JMH based microbenchmark - that&#39;s interesting to<br>
&gt;             see what C2 is capable of - but even so that&#39;s not going<br>
&gt;             to tell you much on the impact it would have to patch<br>
&gt;             thousands of code all around Infinispan. And it will need<br>
&gt;             some peer review before it can tell you anything at all ;)<br>
&gt;             &gt;<br>
&gt;             &gt; It&#39;s actually a very challenging topic, as we produce<br>
&gt;             libraries meant for &quot;anyone to use&quot; and don&#39;t get to set<br>
&gt;             the hardware specification requirements it&#39;s hard to<br>
&gt;             predict if we should optimise the system for this/that<br>
&gt;             resource consumption. Some people will have plenty of CPU<br>
&gt;             and have problems with us needing too much memory, some<br>
&gt;             others will have the opposite.. the real challenge is in<br>
&gt;             making internals &quot;elastic&quot; to such factors and adaptable<br>
&gt;             without making it too hard to tune.<br>
&gt;             &gt;<br>
&gt;             &gt; Thanks,<br>
&gt;             &gt; Sanne<br>
&gt;             &gt;<br>
&gt;             &gt;<br>
&gt;             &gt;<br>
&gt;             &gt; On 18 May 2017 at 12:30, Sebastian Laskawiec<br>
&gt;             &lt;<a href="mailto:slaskawi@redhat.com" target="_blank">slaskawi@redhat.com</a> &lt;mailto:<a href="mailto:slaskawi@redhat.com" target="_blank">slaskawi@redhat.com</a>&gt;&gt; wrote:<br>
&gt;             &gt; Hey!<br>
&gt;             &gt;<br>
&gt;             &gt; In our past we had a couple of discussions about whether<br>
&gt;             we should or should not use Optionals [1][2]. The main<br>
&gt;             argument against it was performance.<br>
&gt;             &gt;<br>
&gt;             &gt; On one hand we risk additional object allocation (the<br>
&gt;             Optional itself) and wrong inlining decisions taken by C2<br>
&gt;             compiler [3]. On the other hand we all probably &quot;feel&quot;<br>
&gt;             that both of those things shouldn&#39;t be a problem and<br>
&gt;             should be optimized by C2. Another argument was the<br>
&gt;             Optional&#39;s doesn&#39;t give us anything but as I checked, we<br>
&gt;             introduced nearly 80 NullPointerException bugs in two<br>
&gt;             years [4]. So we might consider Optional as a way of<br>
&gt;             fighting those things. The final argument that I&#39;ve seen<br>
&gt;             was about lack of higher order functions which is simply<br>
&gt;             not true since we have #map, #filter and #flatmap<br>
&gt;             functions. You can do pretty amazing things with this.<br>
&gt;             &gt;<br>
&gt;             &gt; I decided to check the performance when refactoring REST<br>
&gt;             interface. I created a PR with Optionals [5], ran<br>
&gt;             performance tests, removed all Optionals and reran tests.<br>
&gt;             You will be surprised by the results [6]:<br>
&gt;             &gt;<br>
&gt;             &gt; Test case<br>
&gt;             &gt; With Optionals [%]    Without Optionals<br>
&gt;             &gt; Run 1 Run 2   Avg     Run 1   Run 2   Avg<br>
&gt;             &gt; Non-TX reads 10 threads<br>
&gt;             &gt; Throughput    32.54   32.87  32.71   31.74   34.04   32.89<br>
&gt;             &gt; Response time -24.12  -24.63 -24.38  -24.37  -25.69  -25.03<br>
&gt;             &gt; Non-TX reads 100 threads<br>
&gt;             &gt; Throughput    6.48    -12.79 -3.16   -7.06   -6.14   -6.60<br>
&gt;             &gt; Response time -6.15   14.93   4.39   7.88    6.49    7.19<br>
&gt;             &gt; Non-TX writes 10 threads<br>
&gt;             &gt; Throughput    9.21    7.60    8.41   4.66    7.15    5.91<br>
&gt;             &gt; Response time -8.92   -7.11  -8.02   -5.29   -6.93   -6.11<br>
&gt;             &gt; Non-TX writes 100 threads<br>
&gt;             &gt; Throughput    2.53    1.65    2.09   -1.16   4.67    1.76<br>
&gt;             &gt; Response time -2.13   -1.79  -1.96   0.91    -4.67   -1.88<br>
&gt;             &gt;<br>
&gt;             &gt; I also created JMH + Flight Recorder tests and again,<br>
&gt;             the results showed no evidence of slow down caused by<br>
&gt;             Optionals [7].<br>
&gt;             &gt;<br>
&gt;             &gt; Now please take those results with a grain of salt since<br>
&gt;             they tend to drift by a factor of +/-5% (sometimes even<br>
&gt;             more). But it&#39;s very clear the performance results are<br>
&gt;             very similar if not the same.<br>
&gt;             &gt;<br>
&gt;             &gt; Having those numbers at hand, do we want to have<br>
&gt;             Optionals in Infinispan codebase or not? And if not, let&#39;s<br>
&gt;             state it very clearly (and write it into contributing<br>
&gt;             guide), it&#39;s because we don&#39;t like them. Not because of<br>
&gt;             performance.<br>
&gt;             &gt;<br>
&gt;             &gt; Thanks,<br>
&gt;             &gt; Sebastian<br>
&gt;             &gt;<br>
&gt;             &gt; [1]<br>
&gt;             <a href="http://lists.jboss.org/pipermail/infinispan-dev/2017-March/017370.html" rel="noreferrer" target="_blank">http://lists.jboss.org/pipermail/infinispan-dev/2017-March/017370.html</a><br>
&gt;             &lt;<a href="http://lists.jboss.org/pipermail/infinispan-dev/2017-March/017370.html" rel="noreferrer" target="_blank">http://lists.jboss.org/pipermail/infinispan-dev/2017-March/017370.html</a>&gt;<br>
&gt;             &gt; [2]<br>
&gt;             <a href="http://lists.jboss.org/pipermail/infinispan-dev/2016-August/016796.html" rel="noreferrer" target="_blank">http://lists.jboss.org/pipermail/infinispan-dev/2016-August/016796.html</a><br>
&gt;             &lt;<a href="http://lists.jboss.org/pipermail/infinispan-dev/2016-August/016796.html" rel="noreferrer" target="_blank">http://lists.jboss.org/pipermail/infinispan-dev/2016-August/016796.html</a>&gt;<br>
&gt;             &gt; [3]<br>
&gt;             <a href="http://vanillajava.blogspot.ro/2015/01/java-lambdas-and-low-latency.html" rel="noreferrer" target="_blank">http://vanillajava.blogspot.ro/2015/01/java-lambdas-and-low-latency.html</a><br>
&gt;             &lt;<a href="http://vanillajava.blogspot.ro/2015/01/java-lambdas-and-low-latency.html" rel="noreferrer" target="_blank">http://vanillajava.blogspot.ro/2015/01/java-lambdas-and-low-latency.html</a>&gt;<br>
&gt;             &gt; [4]<br>
&gt;             <a href="https://issues.jboss.org/issues/?jql=project%20%3D%20ISPN%20AND%20issuetype%20%3D%20Bug%20AND%20text%20%7E%20%22NullPointerException%22%20AND%20created%20%3E%3D%202015-04-27%20AND%20created%20%3C%3D%202017-04-27" rel="noreferrer" target="_blank">https://issues.jboss.org/issues/?jql=project%20%3D%20ISPN%20AND%20issuetype%20%3D%20Bug%20AND%20text%20%7E%20%22NullPointerException%22%20AND%20created%20%3E%3D%202015-04-27%20AND%20created%20%3C%3D%202017-04-27</a><br>
&gt;             &lt;<a href="https://issues.jboss.org/issues/?jql=project%20%3D%20ISPN%20AND%20issuetype%20%3D%20Bug%20AND%20text%20%7E%20%22NullPointerException%22%20AND%20created%20%3E%3D%202015-04-27%20AND%20created%20%3C%3D%202017-04-27" rel="noreferrer" target="_blank">https://issues.jboss.org/issues/?jql=project%20%3D%20ISPN%20AND%20issuetype%20%3D%20Bug%20AND%20text%20%7E%20%22NullPointerException%22%20AND%20created%20%3E%3D%202015-04-27%20AND%20created%20%3C%3D%202017-04-27</a>&gt;<br>
&gt;             &gt; [5] <a href="https://github.com/infinispan/infinispan/pull/5094" rel="noreferrer" target="_blank">https://github.com/infinispan/infinispan/pull/5094</a><br>
&gt;             &lt;<a href="https://github.com/infinispan/infinispan/pull/5094" rel="noreferrer" target="_blank">https://github.com/infinispan/infinispan/pull/5094</a>&gt;<br>
&gt;             &gt; [6]<br>
&gt;             <a href="https://docs.google.com/a/redhat.com/spreadsheets/d/1oep6Was0FfvHdqBCwpCFIqcPfJZ5-5_YYUqlRtUxEkM/edit?usp=sharing" rel="noreferrer" target="_blank">https://docs.google.com/a/redhat.com/spreadsheets/d/1oep6Was0FfvHdqBCwpCFIqcPfJZ5-5_YYUqlRtUxEkM/edit?usp=sharing</a><br>
&gt;             &lt;<a href="https://docs.google.com/a/redhat.com/spreadsheets/d/1oep6Was0FfvHdqBCwpCFIqcPfJZ5-5_YYUqlRtUxEkM/edit?usp=sharing" rel="noreferrer" target="_blank">https://docs.google.com/a/redhat.com/spreadsheets/d/1oep6Was0FfvHdqBCwpCFIqcPfJZ5-5_YYUqlRtUxEkM/edit?usp=sharing</a>&gt;<br>
&gt;             &gt; [7]<br>
&gt;             <a href="https://github.com/infinispan/infinispan/pull/5094#issuecomment-296970673" rel="noreferrer" target="_blank">https://github.com/infinispan/infinispan/pull/5094#issuecomment-296970673</a><br>
&gt;             &lt;<a href="https://github.com/infinispan/infinispan/pull/5094#issuecomment-296970673" rel="noreferrer" target="_blank">https://github.com/infinispan/infinispan/pull/5094#issuecomment-296970673</a>&gt;<br>
&gt;             &gt; --<br>
&gt;             &gt; SEBASTIAN ŁASKAWIEC<br>
&gt;             &gt; INFINISPAN DEVELOPER<br>
&gt;             &gt; Red Hat EMEA<br>
&gt;             &gt;<br>
&gt;             &gt;<br>
&gt;             &gt; _______________________________________________<br>
&gt;             &gt; infinispan-dev mailing list<br>
&gt;             &gt; <a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a><br>
&gt;             &lt;mailto:<a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a>&gt;<br>
&gt;             &gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;             &lt;<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a>&gt;<br>
&gt;             &gt;<br>
&gt;             &gt; _______________________________________________<br>
&gt;             &gt; infinispan-dev mailing list<br>
&gt;             &gt; <a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a><br>
&gt;             &lt;mailto:<a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a>&gt;<br>
&gt;             &gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;             &lt;<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a>&gt;<br>
&gt;<br>
&gt;<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;             &lt;mailto:<a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a>&gt;<br>
&gt;             <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;             &lt;<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a>&gt;<br>
&gt;<br>
&gt;         --<br>
&gt;<br>
&gt;         SEBASTIANŁASKAWIEC<br>
&gt;<br>
&gt;         INFINISPAN DEVELOPER<br>
&gt;<br>
&gt;         Red HatEMEA &lt;<a href="https://www.redhat.com/" rel="noreferrer" target="_blank">https://www.redhat.com/</a>&gt;<br>
&gt;<br>
&gt;         &lt;<a href="https://red.ht/sig" rel="noreferrer" target="_blank">https://red.ht/sig</a>&gt;<br>
&gt;<br>
&gt;<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;         &lt;mailto:<a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a>&gt;<br>
&gt;         <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;         &lt;<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a>&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" target="_blank">infinispan-dev@lists.jboss.org</a> &lt;mailto:<a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a>&gt;<br>
&gt;     <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;     &lt;<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a>&gt;<br>
&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" target="_blank">infinispan-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
<br>
<br>
--<br>
Radim Vansa &lt;<a href="mailto:rvansa@redhat.com" target="_blank">rvansa@redhat.com</a>&gt;<br>
JBoss Performance Team<br>
<br>
_______________________________________________<br>
infinispan-dev mailing list<br>
<a href="mailto:infinispan-dev@lists.jboss.org" target="_blank">infinispan-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a></blockquote></div></div></div><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr"><p class="inbox-inbox-fullname-container" style="box-sizing:border-box;color:rgb(0,0,0);font-family:overpass,sans-serif;font-weight:bold;margin:0px;padding:0px;font-size:14px;text-transform:uppercase"><span class="inbox-inbox-firstname-container" style="box-sizing:border-box">SEBASTIAN</span><span class="inbox-inbox-Apple-converted-space"> </span><span class="inbox-inbox-lastname-container" style="box-sizing:border-box">ŁASKAWIEC</span></p><p class="inbox-inbox-position-container" style="box-sizing:border-box;color:rgb(0,0,0);font-family:overpass,sans-serif;font-size:10px;margin:0px 0px 4px;text-transform:uppercase"><span class="inbox-inbox-position" style="box-sizing:border-box">INFINISPAN DEVELOPER</span></p><p class="inbox-inbox-legal-container" style="box-sizing:border-box;font-family:overpass,sans-serif;margin:0px;font-size:10px;color:rgb(153,153,153)"><a class="inbox-inbox-redhat-anchor" href="https://www.redhat.com/" target="_blank" style="box-sizing:border-box;color:rgb(0,136,206);margin:0px;text-decoration:none">Red Hat<span class="inbox-inbox-Apple-converted-space"> </span><span style="box-sizing:border-box">EMEA</span></a></p><table border="0" style="box-sizing:border-box;color:rgb(0,0,0);font-family:overpass,sans-serif;font-size:medium"><tbody style="box-sizing:border-box"><tr style="box-sizing:border-box"><td width="100px" style="box-sizing:border-box"><a href="https://red.ht/sig" style="box-sizing:border-box"><img width="90" height="auto" style="box-sizing: border-box;" src="https://www.redhat.com/files/brand/email/sig-redhat.png"></a></td></tr></tbody></table></div></div>