What I meant in the previous reply is the following scenario. For eg:
p1, p2 , p3 If the iteration goes as below: selectedIndex = -1 since all the partitions has 0 instances, choose the first partition as the selectedIndex = 1 p1 - 1 selectedIndex = 1 p2 - 1 selectedIndex = 2 p3 - 1 selectedIndex = 3 p1 - 2 selectedIndex = 1 scale down happens, instance will be removed from p1 p1 = 1, p2 = 1, p3 = 1 stratos restart selectedIndex = -1 p1 = 2, p2=1, p3=1 choose the first lower instances partition which will be p1. selectedIndex=1 now, hence not a pure RR. I guess, it is impossible to implement a pure RR without persisting current partition index. Thanks. On Wed, Mar 4, 2015 at 12:29 AM, Rajkumar Rajaratnam <rajkum...@wso2.com> wrote: > Hi Reka, > > There is small issue in the way you suggested above. If you consider scale > down scenario, you can't actually say p2 will have min number instances. It > can be p1, if scale down happened from p1. So if we restart the stratos, RR > will select p1 as next partition right? This is not a pure RR right? > > Thanks. > > On Wed, Mar 4, 2015 at 12:24 AM, Reka Thirunavukkarasu <r...@wso2.com> > wrote: > >> Hi Raj, >> >> I don't think that we will need another algorithm. If we implement RR in >> the way that i explained, then it will even make sure to distribute the >> members equally. >> >> For eg: >> >> p1, p2 , p3 >> >> If the iteration goes as below: >> selectedIndex = -1 >> >> since all the partitions has 0 instances, choose the first partition as >> the selectedIndex = 1 >> >> p1 - 1 selectedIndex = 1 >> p2 - 1 selectedIndex = 2 >> p3 - 1 selectedIndex = 3 >> p1 - 2 selectedIndex = 1 >> >> stratos restart >> selectedIndex = -1 >> >> p1 = 2, p2=1, p3=1 choose the first lower instances partition which will >> be p2. (sorry i missed this point earlier) >> selectedIndex=2 now >> >> then iteration can start from where it stops before the restart. >> >> p2 - 2 selectedIndex = 2 >> p3 - 2 selectedIndex = 3 >> p1 - 3 selectedIndex = 1 >> p2 - 3 selectedIndex = 2 >> p3 - 3 selectedIndex = 3 >> >> If we implement RR in this way, the instances will be equally >> distributed as well. >> >> Thanks, >> Reka >> >> >> Thanks, >> Reka >> >> On Tue, Mar 3, 2015 at 11:43 AM, Rajkumar Rajaratnam <rajkum...@wso2.com> >> wrote: >> >>> So I guess we have three algorithms :) >>> >>> 1. one-after-another (It will go to next partition only if the current >>> partition is full) >>> 2. round-robin (if we implement as Reka explained above. It will always >>> select the next partition) >>> 3. name-should-be-decided (this will work as Lahiru explained above. It >>> will always distribute the members in the partitions equally) >>> >>> WDYT? >>> >>> Thanks. >>> >>> On Wed, Mar 4, 2015 at 12:01 AM, Reka Thirunavukkarasu <r...@wso2.com> >>> wrote: >>> >>>> I think that if the selectedIndex is initial value as -1, then RR >>>> should traverse through all the partitions and find out who has the minimum >>>> instances and choose that partition as the selectedIndex in the first >>>> iteration(may be we can exc). Then from the second iteration onwards, it >>>> can increase the selectedIndex by 1 to choose the next adjacent partition. >>>> This will help in the stratos restart as we don't persist the >>>> selectedIndex. WDYT? >>>> >>>> On Tue, Mar 3, 2015 at 10:53 AM, Lahiru Sandaruwan <lahi...@wso2.com> >>>> wrote: >>>> >>>>> >>>>> >>>>> On Tue, Mar 3, 2015 at 11:15 PM, Rajkumar Rajaratnam < >>>>> rajkum...@wso2.com> wrote: >>>>> >>>>>> Problem is lowestInstanceCount is initially taking 0. Instead it >>>>>> should take the non terminated member count of 1st partition. >>>>>> >>>>>> To Fix, >>>>>> >>>>>> int selectedIndex = 0; >>>>>> int lowestInstanceCount = >>>>>> partitionContexts[0].getNonTerminatedMemberCount(); >>>>>> >>>>>> >>>>> +1. I was thinking the same. We can start with first partition count. >>>>> >>>>> Thanks. >>>>> >>>>>> wdyt? >>>>>> >>>>>> Thanks. >>>>>> >>>>>> On Tue, Mar 3, 2015 at 10:57 PM, Rajkumar Rajaratnam < >>>>>> rajkum...@wso2.com> wrote: >>>>>> >>>>>>> Hi Lahiru, >>>>>>> >>>>>>> Actually, current logic is not working as your example. This logic >>>>>>> only uses the first partition. This will never use any other partitions. >>>>>>> See my comments within the following code. >>>>>>> >>>>>>> public PartitionContext >>>>>>> getNextScaleUpPartitionContext(PartitionContext[] partitionContexts) { >>>>>>> >>>>>>> int selectedIndex = 0; >>>>>>> int lowestInstanceCount = 0; >>>>>>> >>>>>>> for(int partitionIndex = 0; partitionIndex < >>>>>>> partitionContexts.length - 1; partitionIndex++) { >>>>>>> >>>>>>> >>>>>>> if(partitionContexts[partitionIndex].getNonTerminatedMemberCount() < >>>>>>> lowestInstanceCount) { >>>>>>> >>>>>>> *// this if condition is always false, because non terminated count >>>>>>> is always >=0* >>>>>>> >>>>>>> lowestInstanceCount = >>>>>>> partitionContexts[partitionIndex].getNonTerminatedMemberCount(); >>>>>>> selectedIndex = partitionIndex; >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> *// selected index is 0 always, so round-robin will always use >>>>>>> first partition* >>>>>>> >>>>>>> if(partitionContexts[selectedIndex].getNonTerminatedMemberCount() < >>>>>>> partitionContexts[selectedIndex].getMax()) { >>>>>>> >>>>>>> if(log.isDebugEnabled()){ >>>>>>> log.debug(String.format("[round-robin algorithm] >>>>>>> [scale-up] [partition] %s has space to create members. " + >>>>>>> "[non terminated count] %s [max] %s" >>>>>>> , >>>>>>> partitionContexts[selectedIndex].getPartitionId(), >>>>>>> >>>>>>> partitionContexts[selectedIndex].getNonTerminatedMemberCount(), >>>>>>> partitionContexts[selectedIndex].getMax())); >>>>>>> } >>>>>>> return partitionContexts[selectedIndex]; >>>>>>> } else { >>>>>>> >>>>>>> return null; >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> May be I am missing something here. >>>>>>> >>>>>>> Thanks. >>>>>>> >>>>>>> On Tue, Mar 3, 2015 at 10:42 PM, Lahiru Sandaruwan <lahi...@wso2.com >>>>>>> > wrote: >>>>>>> >>>>>>>> Hi Raj, >>>>>>>> >>>>>>>> Earlier in 4.0.0 release, we have been using the partition index. >>>>>>>> If that to be worked correctly we should persist the index for each >>>>>>>> cluster. >>>>>>>> >>>>>>>> IMO there is a better way to execute the round-robin method as >>>>>>>> follows, >>>>>>>> >>>>>>>> The intention of round robin algorithm is to distribute the members >>>>>>>> in the partitions equally. Current method works as per the following >>>>>>>> example. >>>>>>>> >>>>>>>> Say we have 3 partitions, p1, p2, and p3 and max of each partition >>>>>>>> is 2. >>>>>>>> >>>>>>>> So according to the algorithm, it will select the first partition >>>>>>>> who has the lowest member count. >>>>>>>> >>>>>>>> Iteration1: It will select p1. >>>>>>>> Iteration2: It will select p2. >>>>>>>> Iteration3: It will select p3. >>>>>>>> Iteration4: It will select p1. >>>>>>>> Iteration5: It will select p2. >>>>>>>> .... >>>>>>>> >>>>>>>> Thanks. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Tue, Mar 3, 2015 at 10:22 PM, Rajkumar Rajaratnam < >>>>>>>> rajkum...@wso2.com> wrote: >>>>>>>> >>>>>>>>> Hi Devs, >>>>>>>>> >>>>>>>>> It seems to me that there is a bug in round-robin implementation >>>>>>>>> of partition algorithm. >>>>>>>>> >>>>>>>>> >>>>>>>>> https://github.com/apache/stratos/blob/0b7734f4c9f1444d064fec93bf9ac59a5883faf2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java#L43-L64 >>>>>>>>> >>>>>>>>> Shouldn't it work based on current partition index? For example, >>>>>>>>> if the most recent instance was spin up in partition-1, the next >>>>>>>>> instance >>>>>>>>> should be spin up in partition-2 and so on. According to current >>>>>>>>> logic what >>>>>>>>> is happening is, all the instance are spin up in partition-1. >>>>>>>>> >>>>>>>>> Please correct me If I am wrong. >>>>>>>>> >>>>>>>>> Thanks. >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Rajkumar Rajaratnam >>>>>>>>> Committer & PMC Member, Apache Stratos >>>>>>>>> Software Engineer, WSO2 >>>>>>>>> >>>>>>>>> Mobile : +94777568639 >>>>>>>>> Blog : rajkumarr.com >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> -- >>>>>>>> Lahiru Sandaruwan >>>>>>>> Committer and PMC member, Apache Stratos, >>>>>>>> Senior Software Engineer, >>>>>>>> WSO2 Inc., http://wso2.com >>>>>>>> lean.enterprise.middleware >>>>>>>> >>>>>>>> email: lahi...@wso2.com blog: http://lahiruwrites.blogspot.com/ >>>>>>>> linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146 >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Rajkumar Rajaratnam >>>>>>> Committer & PMC Member, Apache Stratos >>>>>>> Software Engineer, WSO2 >>>>>>> >>>>>>> Mobile : +94777568639 >>>>>>> Blog : rajkumarr.com >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Rajkumar Rajaratnam >>>>>> Committer & PMC Member, Apache Stratos >>>>>> Software Engineer, WSO2 >>>>>> >>>>>> Mobile : +94777568639 >>>>>> Blog : rajkumarr.com >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> -- >>>>> Lahiru Sandaruwan >>>>> Committer and PMC member, Apache Stratos, >>>>> Senior Software Engineer, >>>>> WSO2 Inc., http://wso2.com >>>>> lean.enterprise.middleware >>>>> >>>>> email: lahi...@wso2.com blog: http://lahiruwrites.blogspot.com/ >>>>> linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146 >>>>> >>>>> >>>> >>>> >>>> -- >>>> Reka Thirunavukkarasu >>>> Senior Software Engineer, >>>> WSO2, Inc.:http://wso2.com, >>>> Mobile: +94776442007 >>>> >>>> >>>> >>> >>> >>> -- >>> Rajkumar Rajaratnam >>> Committer & PMC Member, Apache Stratos >>> Software Engineer, WSO2 >>> >>> Mobile : +94777568639 >>> Blog : rajkumarr.com >>> >> >> >> >> -- >> Reka Thirunavukkarasu >> Senior Software Engineer, >> WSO2, Inc.:http://wso2.com, >> Mobile: +94776442007 >> >> >> > > > -- > Rajkumar Rajaratnam > Committer & PMC Member, Apache Stratos > Software Engineer, WSO2 > > Mobile : +94777568639 > Blog : rajkumarr.com > -- Rajkumar Rajaratnam Committer & PMC Member, Apache Stratos Software Engineer, WSO2 Mobile : +94777568639 Blog : rajkumarr.com