Hi Gayan,

On Mon, Oct 13, 2014 at 7:50 PM, Gayan Gunarathne <gay...@wso2.com> wrote:

> IMO it is based on how many siblings we have in the topology which we can
> lock independently. If we have lot of occurrences where we can able to
> lock the siblings independently it will improve the performance.But again I
> think we need to careful with the dead lock scenarios.
>
I did not understand your statement exactly. Can you please explain a bit
more?

My understanding is, if CC allows only sequential access to its own
Topology model, then that will again be a bottleneck since CC is the one
who sends out the Topology events.

>
> Thanks,
> Gayan
>
> On Mon, Oct 13, 2014 at 5:50 PM, Isuru Haththotuwa <isu...@apache.org>
> wrote:
>
>> Another improvement that we can do is to introduce the same hierarchical
>> locking to the Topology structure maintained in the Cloud Controller. Its
>> actually the CC who will be updating the local Topology and sending the
>> relevant events. In that case, if we have have only one write lock for the
>> whole Topology in the CC's TopologyBuilder, it will still be a bottleneck.
>> WDYT?
>>
>> On Thu, Oct 9, 2014 at 3:36 PM, Isuru Haththotuwa <isu...@apache.org>
>> wrote:
>>
>>> Hi,
>>>
>>>
>>> Since the Topology is updated from the messaging component only, I
>>> removed the methods to access the write locks to an internal class. Those
>>> methods will not be exposed to outside by the messaging component. Now, the
>>> following methods to obtain read-only locks are exposed from
>>> TopologyManager:
>>>
>>>     // Topology level read locks
>>>
>>>     /**
>>>      * Acquires read lock for the Complete Topology
>>>      */
>>> *    public static void acquireReadLock() ;*
>>>
>>>     /**
>>>      * Releases read lock for the Complete Topology
>>>      */
>>> *    public static void releaseReadLock();*
>>>
>>>     // Application and Service read locks
>>>
>>>     /**
>>>      * Acquires read lock for the all Applications
>>>      */
>>> *    public static void acquireReadLockForApplications() ;*
>>>
>>>     /**
>>>      * Releases read lock for the all Applications
>>>      */
>>> *    public static void releaseReadLockForApplications();*
>>>     /**
>>>      * Acquires read lock for the all Services
>>>      */
>>> *    public static void acquireReadLockForServices();*
>>>
>>>     /**
>>>      * Releases read lock for the all Services
>>>      */
>>> *    public static void releaseReadLockForServices() ;*
>>>
>>>     /**
>>>      * Acquires read lock for a Service
>>>      *
>>>      * @param serviceName service name to acquire read lock
>>>      */
>>> *    public static void acquireReadLockForService (String serviceName) ;*
>>>
>>>     /**
>>>      * Releases read lock for a Service
>>>      *
>>>      * @param serviceName service name to release read lock
>>>      */
>>> *    public static void releaseReadLockForService (String serviceName) ;*
>>>
>>>     /**
>>>      * Acquires read lock for a Cluster. This will acquire the read lock
>>> in the following order
>>>      *      1. for the Service
>>>      *      2. for the Cluster
>>>      *
>>>      * @param serviceName service name to acquire read lock
>>>      * @param clusterId cluster id to acquire read lock
>>>      */
>>> *    public static void acquireReadLockForCluster (String serviceName,
>>> String clusterId);*
>>>
>>>     /**
>>>      * Releases read lock for a Cluster. This will release the read lock
>>> in the following order
>>>      *      1. for the Cluster
>>>      *      2. for the Service
>>>      *
>>>      * @param serviceName service name to release read lock
>>>      * @param clusterId cluster id to release read lock
>>>      */
>>> *    public static void releaseReadLockForCluster (String serviceName,
>>> String clusterId);*
>>>
>>>     /**
>>>      * Acquires read lock for the Application
>>>      *
>>>      * @param appId Application id
>>>      */
>>> *    public static void acquireReadLockForApplication (String appId) ;*
>>>
>>>     /**
>>>      * Releases read lock for the Application
>>>      *
>>>      * @param appId Application id
>>>      */
>>> *    public static void releaseReadLockForApplication (String appId);*
>>>
>>>
>>>
>>>
>>>
>>> On Mon, Oct 6, 2014 at 2:51 PM, Imesh Gunaratne <im...@apache.org>
>>> wrote:
>>>
>>>> This looks great! As we discussed may be we could provide an interface
>>>> in the messaging component to acquire and release locks at different sub
>>>> tree levels. The whole idea is to avoid any possibilities of reading the
>>>> topology in an inconsistent state.
>>>>
>>>> Thanks
>>>>
>>>> On Mon, Oct 6, 2014 at 12:37 PM, Isuru Haththotuwa <isu...@apache.org>
>>>> wrote:
>>>>
>>>>> Thanks Imesh.
>>>>>
>>>>> I have shown some examples for the new hierarchical locking approach.
>>>>> Please do let me know your feedback on this.
>>>>>
>>>>>    Acquire a write lock:
>>>>>
>>>>>    From root level, acquire read lock, and acquire a write lock only
>>>>> for the
>>>>>    relevant sub tree.
>>>>>
>>>>>    Acquire a read lock:
>>>>>
>>>>>    From root level, acquire read locks till the relevant sub tree
>>>>>
>>>>>    Examples -
>>>>>
>>>>>    Example 1: Acquiring write lock for a Cluster to modify the Cluster
>>>>> object -
>>>>>             acquiring:
>>>>>             1. acquire read lock for all Services
>>>>>             2. acquire read lock for the particular Service, to which
>>>>> the cluster belongs to
>>>>>             3. acquire write lock for the Cluster
>>>>>
>>>>>             releasing:
>>>>>             1. release write lock for the Cluster
>>>>>             2. release read lock for the particular Service
>>>>>             3. release read lock for all Services
>>>>>
>>>>>    Example 2: Acquiring write lock to add a new Cluster object -
>>>>>             acquiring:
>>>>>             1. acquire read lock for all Services
>>>>>             2. acquire write lock for the particular Service, to which
>>>>> the cluster belongs to
>>>>>
>>>>>             releasing:
>>>>>             1. release write lock for the particular Service
>>>>>             2. release read lock for all Services
>>>>>
>>>>>    Example 3: Acquiring read lock to read Cluster information
>>>>>             acquiring:
>>>>>             1. acquire read lock for all Services
>>>>>             2. acquire read lock for the particular Service, to which
>>>>> the cluster belongs to
>>>>>             3. acquire read lock for the relevant Cluster
>>>>>
>>>>>             releasing:
>>>>>             1. release read lock for the relevant Cluster
>>>>>             2. release read lock for the particular Service
>>>>>             3. release read lock for all Services
>>>>>
>>>>>    Example 4: Acquiring the write lock to add a deploy a Cartridge
>>>>> (add a new Service)
>>>>>             acquire:
>>>>>             1. acquire write lock for all Services
>>>>>
>>>>>             release:
>>>>>             1. release write lock for all Services
>>>>>
>>>>> In all of these examples, the lock acquiring happens from top of the
>>>>> tree to down. This is to avoid deadlocks.
>>>>>
>>>>> On Mon, Oct 6, 2014 at 10:50 AM, Imesh Gunaratne <im...@apache.org>
>>>>> wrote:
>>>>>
>>>>>> Great! Thanks for the clarification Isuru!
>>>>>>
>>>>>> Yes I agree, I think what we can do is, identify the sub trees that
>>>>>> will not break the consistency of the data structure and manage locks at
>>>>>> those sub tree level.
>>>>>>
>>>>>> Thanks
>>>>>>
>>>>>> On Sun, Oct 5, 2014 at 8:07 PM, Isuru Haththotuwa <isu...@apache.org>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi Lahiru and Imesh,
>>>>>>>
>>>>>>> Thanks a lot for the input.
>>>>>>>
>>>>>>> What I do here is locking only the relevant sub tree of the complete
>>>>>>> Topology tree, as locking the whole tree is rather inefficient. For an
>>>>>>> example, when a MemberActivated event is received, we have the cluster 
>>>>>>> id
>>>>>>> of the cluster that particular member belongs to. IMHO, we only need to
>>>>>>> acquire the write lock for that cluster , and do not need the lock for
>>>>>>> complete Topology tree. Therefore, any other thread which needs to do
>>>>>>> another operation on a separate sub tree (for an example, deploy a new
>>>>>>> service, etc.) can do that concurrently.
>>>>>>>
>>>>>>> On Sun, Oct 5, 2014 at 12:20 AM, Lahiru Sandaruwan <lahi...@wso2.com
>>>>>>> > wrote:
>>>>>>>
>>>>>>>> Hi Isuru,
>>>>>>>>
>>>>>>>> Looks like a good move to improve the efficiency,
>>>>>>>>
>>>>>>>> On Fri, Oct 3, 2014 at 3:05 PM, Isuru Haththotuwa <
>>>>>>>> isu...@apache.org> wrote:
>>>>>>>>
>>>>>>>>> I did the initial changes, at the testing phase now. For an
>>>>>>>>> example, if we need to add a new Service, we do not need to lock 
>>>>>>>>> everything
>>>>>>>>> now. We an only acquire the write lock on Services, and add the 
>>>>>>>>> Service.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Service can be an element of a group or an app. So shouldn't we
>>>>>>>> lock complete application if we add/modify a service? Otherwise a 
>>>>>>>> different
>>>>>>>> thread might change parents/relationships otherwise.
>>>>>>>>
>>>>>>> AFAIK a Service gets created when we deploy a cartridge. An
>>>>>>> application/Group can refer a service. In the case of modifying an
>>>>>>> Application, we do need to lock the relevant clusters that belong to 
>>>>>>> that
>>>>>>> Application. I implemented that.
>>>>>>>
>>>>>>>>
>>>>>>>> So generally i think we can bring down the locking level to
>>>>>>>> Application, but not the services. Also if we need to read any part, we
>>>>>>>> have to get the read lock for the whole topology, such that the 
>>>>>>>> receiver
>>>>>>>> get a particular snapshot of the topology as Imesh also mentioned.
>>>>>>>>
>>>>>>> If we need to lock the complete Topology, we can still do that, such
>>>>>>> as in a Complete Topology event. But IMHO, if we know the exact part (a
>>>>>>> particular Cluster, etc.) that we need to read/write, we do not need to
>>>>>>> lock the whole Topology.
>>>>>>>
>>>>>>>>
>>>>>>>> Thanks.
>>>>>>>>
>>>>>>>> If we need to modify a particular Service, can read lock the
>>>>>>>>> Services and acquire the write lock on the relevant Service and do the
>>>>>>>>> modification.
>>>>>>>>>
>>>>>>>> This support is there for Services, Cluster and Applications.
>>>>>>>>>
>>>>>>>>
>>>>>>>>> On Wed, Oct 1, 2014 at 9:27 PM, Manula Chathurika Thantriwatte <
>>>>>>>>> manu...@wso2.com> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Isuru,
>>>>>>>>>>
>>>>>>>>>> +1 for the hierarchical locking approach. Using hierarchical
>>>>>>>>>> locking we can have more benefits [1].
>>>>>>>>>>
>>>>>>>>>> [1]
>>>>>>>>>> http://synapticnulship.com/blog/2013/03/08/comparison-chainlocker-vs-heirarchical-mutexes/
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Wed, Oct 1, 2014 at 7:46 PM, Isuru Haththotuwa <
>>>>>>>>>> isu...@apache.org> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi Devs,
>>>>>>>>>>>
>>>>>>>>>>> In the current Topology implementation, we acquire read/write
>>>>>>>>>>> locks on Topology from the root level itself. For an example, if we 
>>>>>>>>>>> need to
>>>>>>>>>>> modify a single Cluster object, we still need to acquire a write 
>>>>>>>>>>> lock from
>>>>>>>>>>> the Topology root level. But, this is a costly operation. 
>>>>>>>>>>> Specially, with
>>>>>>>>>>> Service Grouping changes, we would need to traverse through an 
>>>>>>>>>>> Application.
>>>>>>>>>>> Since an Application can be a recursive structure, it can be a time
>>>>>>>>>>> consuming operation. in such a scenario, if we are to lock the whole
>>>>>>>>>>> Topology, there will be many threads waiting on that lock.
>>>>>>>>>>>
>>>>>>>>>>> As a solution, I think we can use hierarchical locking [1]. For
>>>>>>>>>>> an example, when you need to obtain the write lock for a particular
>>>>>>>>>>> Application, you do not need to lock the whole tree, but can lock 
>>>>>>>>>>> only that
>>>>>>>>>>> Application itself. However, still we need to get the read locks 
>>>>>>>>>>> for the
>>>>>>>>>>> parents.
>>>>>>>>>>>
>>>>>>>>>>> A separate Lock tree will be maintained for the Topology.
>>>>>>>>>>>
>>>>>>>>>>> Please share your feedback.
>>>>>>>>>>>
>>>>>>>>>>> [1].
>>>>>>>>>>> http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/DDJ/2008/0801/071201hs01/071201hs01.html
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Thanks and Regards,
>>>>>>>>>>>
>>>>>>>>>>> Isuru H.
>>>>>>>>>>> +94 716 358 048* <http://wso2.com/>*
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Regards,
>>>>>>>>>> Manula Chathurika Thantriwatte
>>>>>>>>>> Software Engineer
>>>>>>>>>> WSO2 Inc. : http://wso2.com
>>>>>>>>>> lean . enterprise . middleware
>>>>>>>>>>
>>>>>>>>>> email : manu...@wso2.com / man...@apache.org
>>>>>>>>>> phone : +94 772492511
>>>>>>>>>> blog : http://manulachathurika.blogspot.com/
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> <http://manulachathurika.blogspot.com/>
>>>>>>>>>> Thanks and Regards,
>>>>>>>>>>
>>>>>>>>>> Isuru H.
>>>>>>>>>> <http://manulachathurika.blogspot.com/>
>>>>>>>>>> +94 716 358 048 <http://manulachathurika.blogspot.com/>*
>>>>>>>>>> <http://wso2.com/>*
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> * <http://wso2.com/>*
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> --
>>>>>>>> Lahiru Sandaruwan
>>>>>>>> Committer and PMC member, Apache Stratos,
>>>>>>>> Senior Software Engineer,
>>>>>>>> WSO2 Inc., http://wso2.com
>>>>>>>> lean.enterprise.middleware
>>>>>>>>
>>>>>>>> email: lahi...@wso2.com cell: (+94) 773 325 954
>>>>>>>> blog: http://lahiruwrites.blogspot.com/
>>>>>>>> twitter: http://twitter.com/lahirus
>>>>>>>> linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146
>>>>>>>>
>>>>>>>> --
>>>>>>>> <http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146>
>>>>>>>> Thanks and Regards,
>>>>>>>>
>>>>>>>> Isuru H.
>>>>>>>> <http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146>
>>>>>>>> +94 716 358 048
>>>>>>>> <http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146>*
>>>>>>>> <http://wso2.com/>*
>>>>>>>>
>>>>>>>>
>>>>>>>> * <http://wso2.com/>*
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Imesh Gunaratne
>>>>>>
>>>>>> Technical Lead, WSO2
>>>>>> Committer & PMC Member, Apache Stratos
>>>>>>
>>>>>> --
>>>>>> Thanks and Regards,
>>>>>>
>>>>>> Isuru H.
>>>>>> +94 716 358 048* <http://wso2.com/>*
>>>>>>
>>>>>>
>>>>>> * <http://wso2.com/>*
>>>>>>
>>>>>>
>>>>>>
>>>>
>>>>
>>>> --
>>>> Imesh Gunaratne
>>>>
>>>> Technical Lead, WSO2
>>>> Committer & PMC Member, Apache Stratos
>>>>
>>>> --
>>>> Thanks and Regards,
>>>>
>>>> Isuru H.
>>>> +94 716 358 048
>>>>
>>>> --
>>>> <%2B94%20716%20358%20048>
>>>> Thanks and Regards,
>>>>
>>>> Isuru H.
>>>> <%2B94%20716%20358%20048>
>>>> +94 716 358 048* <http://wso2.com/>*
>>>>
>>>>
>>>> * <http://wso2.com/>*
>>>>
>>>>
>>>>
>
>
> --
>
> Gayan Gunarathne
> Technical Lead
> WSO2 Inc. (http://wso2.com)
> email  : gay...@wso2.com  | mobile : +94 766819985
>
> --
> <%2B94%20766819985>
> Thanks and Regards,
>
> Isuru H.
> <%2B94%20766819985>
> +94 716 358 048 <%2B94%20766819985>* <http://wso2.com/>*
>
>
> * <http://wso2.com/>*
>
>
>

Reply via email to