As per the offline discussion with Imesh and Lahiru, we have decided to
have three partition selection algorithms.

   - Round-Robin : The next partition will be selected


On Wed, Mar 4, 2015 at 11:14 AM, Gayan Gunarathne <gay...@wso2.com> wrote:

> Yeah IMO also we need to keep track of the selected index no of the
> partition.I think we may need to persist the selected index to get the RR
> algorithm works correctly.
>
> IMO in the scale up we will increment the selected index up to max index
> no while in scale down it will decrease the selected index until it comes
> to min index no and continue with round robin.
>
> Thanks,
> Gayan
>
>
>
> On Wed, Mar 4, 2015 at 9:42 AM, Rajkumar Rajaratnam <rajkum...@wso2.com>
> wrote:
>
>> Hi Reka,
>>
>> On Wed, Mar 4, 2015 at 1:03 AM, Reka Thirunavukkarasu <r...@wso2.com>
>> wrote:
>>
>>> I think that there is small issue in applying the same RR logic for
>>> scale up and scale down. if it sclaes up, then
>>>
>>> p1 -1, p2-1, p3-1, p1-2, p2-2
>>>
>>> Then, if we are to continuously scale down, then which partition will we
>>> choose next? Will it be p3? In that way, it won't be equally
>>> distributed..In order to equally distributed, we should choose the
>>> partition in the reverse order in the scale down p2, p1, p3, p2, p1.
>>>
>>> Then as you mentioned, we will need another algorithm specially when
>>> scaling down. We can apply forward RR in scale up and backward RR in
>>> scaling down in order to equally distributed the instances.
>>>
>>
>> Again , if we don't persist current partition index, this logic is also
>> not a pure RR.
>>
>> Current logic is working perfectly according to "equally distribute to
>> partitions" concept in both scale up/down scenarios. But I agree its not a
>> pure RR.
>>
>> IMHO, as Lahiru mentioned, intention of having RR is to equally
>> distribute instances among partitions. So can we stick to this logic for
>> now? If we find any issues, we can improve it later.
>>
>> WDYT?
>>
>>>
>>> Thanks,
>>> Reka
>>>
>>>
>>>
>>> On Tue, Mar 3, 2015 at 12:24 PM, Rajkumar Rajaratnam <rajkum...@wso2.com
>>> > wrote:
>>>
>>>> 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
>>>>
>>>
>>>
>>>
>>> --
>>> 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
>>
>
>
>
> --
>
> Gayan Gunarathne
> Technical Lead
> WSO2 Inc. (http://wso2.com)
> email  : gay...@wso2.com  | mobile : +94 766819985
>
>



-- 
Rajkumar Rajaratnam
Committer & PMC Member, Apache Stratos
Software Engineer, WSO2

Mobile : +94777568639
Blog : rajkumarr.com

Reply via email to