Sam Corbett created BROOKLYN-167:
------------------------------------

             Summary: HighAvailabilityManagerImpl has invalid state if 
/v1/server/ha/states requested before BrooklynLauncher has fully initialised a 
server
                 Key: BROOKLYN-167
                 URL: https://issues.apache.org/jira/browse/BROOKLYN-167
             Project: Brooklyn
          Issue Type: Bug
            Reporter: Sam Corbett


If requests are made to get a server's HA state before the server is fully 
initialised the HA state ends up incorrect.

I started Brooklyn with this command: 

{{brooklyn launch --persist disabled}}

I happened to have the jsgui open in my browser from a previous session. 

The HA manager appeared to enter an invalid state:

{code}
sam@v:~/code/brooklyn.io/brooklyn (master $)
$ http :8081/v1/server/ha/state
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Content-Encoding: gzip
Content-Type: application/json
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Expires: 0
Pragma: no-cache
Server: Jetty(8.1.17.v20150415)
Set-Cookie: JSESSIONID=12nhcq9l0tmll1abkqmaorn3lp;Path=/
Transfer-Encoding: chunked
Vary: Accept-Encoding

"MASTER"


sam@v:~/code/brooklyn.io/brooklyn (master $)
$ http :8081/v1/server/ha/states
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Content-Encoding: gzip
Content-Type: application/json
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Expires: 0
Pragma: no-cache
Server: Jetty(8.1.17.v20150415)
Set-Cookie: JSESSIONID=8u4e6sv9f6h2g7xee0vsym92;Path=/
Transfer-Encoding: chunked
Vary: Accept-Encoding

{
    "links": {},
    "masterId": null,
    "nodes": {},
    "ownId": "iuIF5Nlr"
}
{code}

The debug log (attached) contains the following messages:

{code}
2015-08-24 11:14:52,433 DEBUG o.a.b.l.BrooklynLauncher [main]: Starting 
Brooklyn using security properties: BrooklynProperties[1]
2015-08-24 11:14:52,433 DEBUG o.a.b.l.BrooklynLauncher [main]: Starting 
Brooklyn web-console with bindAddress 0.0.0.0/0.0.0.0 and properties 
BrooklynProperties[480]
2015-08-24 11:14:52,829 DEBUG o.a.b.l.BrooklynWebServer [main]: Starting 
Brooklyn console at http://127.0.0.1:8081/, running classpath://brooklyn.war 
and []
2015-08-24 11:14:53,363 INFO  c.s.j.s.i.a.WebApplicationImpl [main]: Initiating 
Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
2015-08-24 11:14:54,405 INFO  o.a.b.r.s.p.DelegatingSecurityProvider 
[brooklyn-jetty-server-8081-qtp1643988252-22]: REST using security provider 
org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider
2015-08-24 11:14:54,426 WARN  o.a.b.r.f.HaHotCheckResourceFilter 
[brooklyn-jetty-server-8081-qtp1643988252-21]: Disallowing web request as 
server not in required startup-completed state: 
com.sun.jersey.spi.container.ContainerRequest@7c320b37/AbstractResourceMethod(LocationApi#list)
 (caller should set 'Brooklyn-Allow-Non-Master-Access' to force)
2015-08-24 11:14:54,426 WARN  o.a.b.r.f.HaHotCheckResourceFilter 
[brooklyn-jetty-server-8081-qtp1643988252-22]: Disallowing web request as 
server not in required startup-completed state: 
com.sun.jersey.spi.container.ContainerRequest@5595c2ac/AbstractResourceMethod(ApplicationApi#list)
 (caller should set 'Brooklyn-Allow-Non-Master-Access' to force)
2015-08-24 11:14:54,427 DEBUG o.a.b.c.m.h.HighAvailabilityManagerImpl 
[brooklyn-jetty-server-8081-qtp1643988252-23]: High availablity manager has no 
persister; returning empty record
...
2015-08-24 11:14:54,602 INFO  o.a.b.l.BrooklynLauncher [main]: Persistence 
disabled
2015-08-24 11:14:54,602 INFO  o.a.b.l.BrooklynLauncher [main]: High 
availability disabled
2015-08-24 11:14:54,602 DEBUG o.a.b.l.BrooklynLauncher [main]: Loading catalog 
as part of launch sequence (it was not loaded as part of any rebind sequence)
{code}

The message "High availablity manager has no persister" is logged by 
HighAvailabilityManagerImpl in this code:

{code:java}
    private ManagementPlaneSyncRecord 
loadManagementPlaneSyncRecordInternal(boolean useLocalKnowledgeForThisNode) {
        if (disabled) {
            // if HA is disabled, then we are the only node - no persistence; 
just load a memento to describe this node
            Builder builder = ManagementPlaneSyncRecordImpl.builder()
                .node(createManagementNodeSyncRecord(true));
            if (getTransitionTargetNodeState() == ManagementNodeState.MASTER) {
                builder.masterNodeId(ownNodeId);
            }
            return builder.build();
        }
        if (persister == null) {
            // e.g. web-console may be polling before we've started up
            LOG.debug("High availablity manager has no persister; returning 
empty record");
            return ManagementPlaneSyncRecordImpl.builder().build();
        }
        ...
    }
{code}

The first HTTP request occurs before BrooklynLauncher indicates to 
HighAvailabilityManagerImpl that persistence is disabled and Brooklyn gets 
stuck in an invalid state.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to