Fixed in 5c63e93026c580b373dbb513c1ae1c

On Fri, Nov 13, 2015 at 10:53 AM, Isuru Haththotuwa <isu...@apache.org>
wrote:

>
>
> On Fri, Nov 13, 2015 at 10:46 AM, Akila Ravihansa Perera <
> raviha...@wso2.com> wrote:
>
>> Nice catch Raj!
>>
>> I think better to wait until contexts/policies are loaded from registry
>> before starting AutoscalerTopologyReceiver. We're seeing this issue now
>> because topology is initialized immediately after starting the receiver
>> with topology initializing optimization.
>>
> +1. Lets start the TopologyRecvr thread after we load the information from
> the registry. Otherwise there is no way to be sure what will happen since
> the two processes are happening simultaneously.
>
>>
>> Thanks.
>>
>> On Fri, Nov 13, 2015 at 10:23 AM, Rajkumar Rajaratnam <rajkum...@wso2.com
>> > wrote:
>>
>>> Hi Devs,
>>>
>>> Experiencing $Subject.
>>>
>>> Root cause is, AS received the complete-topology-event before loading
>>> application-contexts from registry to in-memory model. So the
>>> complete-topology-event is ignored by AS, but the topology is initialized.
>>> This also means that all the upcoming periodic complete-topology-events
>>> will be ignored by AS. Refer the following code block in
>>> AutoscalerTopologyEventReceiver.
>>>
>>> private void addEventListeners() {
>>>     // Listen to topology events that affect clusters
>>>     topologyEventReceiver.addEventListener(new 
>>> CompleteTopologyEventListener() {
>>>         @Override
>>>         protected void onEvent(Event event) {
>>>             if (!topologyInitialized) {
>>>                 log.info("[CompleteTopologyEvent] Received: " + 
>>> event.getClass());
>>>                 try {
>>>                     ApplicationHolder.acquireReadLock();
>>>                     Applications applications = 
>>> ApplicationHolder.getApplications();
>>>                     if (applications != null) {
>>>                         for (Application application : applications.
>>>                                 getApplications().values()) {
>>>                             ApplicationContext applicationContext =
>>>                                     AutoscalerContext.getInstance().
>>>                                             
>>> getApplicationContext(application.getUniqueIdentifier());
>>>                             if (applicationContext != null && 
>>> applicationContext.getStatus().
>>>                                     
>>> equals(ApplicationContext.STATUS_DEPLOYED)) {
>>>                                 if 
>>> (AutoscalerUtil.allClustersInitialized(application)) {
>>>                                     
>>> AutoscalerUtil.getInstance().startApplicationMonitor(
>>>                                             
>>> application.getUniqueIdentifier());
>>>                                 } else {
>>>                                     log.error("Complete Topology is not 
>>> consistent with " +
>>>                                             "the applications which got 
>>> persisted");
>>>                                 }
>>>                             } else {
>>>                                 log.info("The application is not yet " +
>>>                                         "deployed for this [application] " +
>>>                                         application.getUniqueIdentifier());
>>>                             }
>>>
>>>                         }
>>>                         topologyInitialized = true;
>>>                     } else {
>>>                         log.info("No applications found in the complete 
>>> topology");
>>>                     }
>>>                 } catch (Exception e) {
>>>                     log.error("Error processing event", e);
>>>                 } finally {
>>>                     ApplicationHolder.releaseReadLock();
>>>                 }
>>>             }
>>>         }
>>>     });
>>>
>>>
>>> This code block should ensure that the monitors should be created for
>>> all the persisted applications. Currently, it is not ensuring this - I am
>>> fixing it.
>>>
>>> I guess, there are two ways to fix it.
>>>
>>> a) Topology should be not initialized in the above code block
>>> (topologyInitialized = true) until application contexts are loaded from
>>> registry.
>>> b) Complete topology request event should be not be sent until
>>> application contexts are loaded from registry.
>>>
>>> Thanks,
>>> Raj.
>>>
>>> --
>>> Rajkumar Rajaratnam
>>> Committer & PMC Member, Apache Stratos
>>> Software Engineer, WSO2
>>>
>>> Mobile : +94777568639
>>> Blog : rajkumarr.com
>>>
>>
>>
>>
>> --
>> Akila Ravihansa Perera
>> WSO2 Inc.;  http://wso2.com/
>>
>> Blog:
>> http://ravihansa3000.blogspot.com
>>
>> --
>> <http://ravihansa3000.blogspot.com>
>> <http://ravihansa3000.blogspot.com>
>> Thanks and Regards,
>>
>> Isuru H.
>> <http://ravihansa3000.blogspot.com>
>> +94 716 358 048 <http://ravihansa3000.blogspot.com>* <http://wso2.com/>*
>>
>>
>> * <http://wso2.com/>*
>>
>>
>>


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

Mobile : +94777568639
Blog : rajkumarr.com

Reply via email to