On Tue, Feb 21, 2017 at 10:33 AM Vladimir Blagojevic <vblag...@redhat.com> wrote:
> Will, > > I like the API proposal but one thing that jumps out for me is to combine > or rather overload singleNodeSubmission with singleNodeSubmission(int > failOverCount) and remove failoverRetries method. The first > singleNodeSubmission does not failover while the second one does with the > specified failOverCount. That way we don't have to keep state and throw > IllegalStateException when someone erroneously calls failOverRetries. > Sounds good to me. Not sure why I didn't think of that before. It felt awkward to me as well. Guess I was stuck on having the method have the name failover in it :) > > Vladimir > > > > On 2017-02-21 10:11 AM, William Burns wrote: > > As many of you are may or may not be aware the ClusterExecutor interface > and implementation were introduced into Infinispan 8.2 [1]. This class is > a new API that can be used to submit commands to other nodes in a way > similar to DistributedExecutor does while also not being tied to a cache. > > The first implementation of ClusterExecutor did not include a couple > features that DistributedExecutor has. For this post I will concentrate on > failover and execution policies. My plan is to introduce some API to > Infinispan 9 to allow for ClusterExecutor to also offer these capabilities. > > The first change is that I wanted to add additional options to Execution > Policies. The execution policy is used to limit sending messages to nodes > based on their topology (site, rack & machine id). The old execution > policy allowed for SAME_MACHINE, SAME_RACK, SAME_SITE and ALL. I plan on > adding the opposite of the SAME and also supporting DIFFERENT_MACHINE, > DIFFERENT_RACK and DIFFERENT_SITE in case if the user wants to ensure that > data is processed elsewhere. Unless you think this is unneeded? > > The API changes I am thinking of are as below (included in email to allow > for responses inline). Note that existing methods would be unchanged and > thus submit and execute methods would be used to send commands still. One > big difference is that I have not allowed for the user to control the > failover node or the target node when doing a single submission with > multiple available targets. In my mind if a user wants this they should do > it themselves manually, but this is open for discussion as well. > > /** * When a command is submitted it will only be submitted to one node of > the available nodes, there is no strict * requirements as to which node is > chosen and is implementation specific. Fail over can be used with > configuration, * please see {@link ClusterExecutor#failOverRetries(int)} for > more information. * @return this executor again with commands submitted to a > single node */ClusterExecutor singleNodeSubmission(); > /** * When a command is submitted it will submit this command to all of the > available nodes. Fail over is not supported * with this configuration. This > is the default submission method. * @return this executor again with commands > submitted to all nodes */ClusterExecutor allNodeSubmission(); > /** * Enables fail over to occur when using {@link > ClusterExecutor#singleNodeSubmission()}. If the executor * is not currently > in the single node submission mode, this method will throw {@link > IllegalStateException}. * When fail over count is applied, a submitted > command will be retried up to that many times on the available * command up > to desired amount of times until an exception is not met. The one exception > that is not retried is a * TimeoutException since this could be related to > {@link ClusterExecutor#timeout(long, TimeUnit)}. Each time the * fail over > occurs a random node in the available nodes will be used (trying not to reuse > the same node). * @param failOverCount how many times this executor will > attempt a failover * @return this executor again with fail over retries > applied * @throws IllegalStateException if this cluster executor is not > currently configured for single node submission */ClusterExecutor > failOverRetries(int failOverCount) throws IllegalStateException; > /** * Allows for filtering of address nodes by only allowing addresses that > match the given execution policy to be used. * Note this method overrides any > previous filtering that was done (ie. calling * {@link > ClusterExecutor#filterTargets(Collection)}). * @param policy the policy to > determine which nodes can be used * @return this executor again with the > execution policy applied to determine which nodes are contacted > */ClusterExecutor filterTargets(ClusterExecutionPolicy policy); > /** * Allows for filtering of address nodes dynamically per invocation. The > predicate is applied to each member that * is part of the execution policy. > Note that this method overrides any previous * filtering that was done (ie. > calling {@link ClusterExecutor#filterTargets(Collection)}). * @param policy > the execution policy applied before predicate to allow only nodes in that > group * @param predicate the dynamic predicate applied each time an > invocation is done * @return */ClusterExecutor > filterTargets(ClusterExecutionPolicy policy, Predicate<? super Address> > predicate); > > > Thanks for any input, > > - Will > > [1] > https://github.com/infinispan/infinispan/blob/master/core/src/main/java/org/infinispan/manager/ClusterExecutor.java > > > > > > > _______________________________________________ > infinispan-dev mailing > listinfinispan-dev@lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/infinispan-dev > > > _______________________________________________ > infinispan-dev mailing list > infinispan-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/infinispan-dev
_______________________________________________ infinispan-dev mailing list infinispan-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/infinispan-dev