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