Hi Galder,

Sorry for the delay.  For server-mode, we'd need to set the
RouteStatusListener in the jgroups subsystem before the RELAY2
protocol is initialized.
e.g.
public class DefaultRouteStatusListener implements
RouteStatusListener, Supplier<Set<String>> {
    private final Set<String> view = new ConcurrentSkipListSet<>();
    @Override
    public void sitesUp(String... sites) {
        this.view.addAll(Arrays.asList(sites));
        log.receivedXSiteClusterView(view);
    }
    @Override
    public void sitesDown(String... sites) {
        this.view.removeAll(Arrays.asList(sites));
        log.receivedXSiteClusterView(view);
    }
    @Override
    public Set<String> get() {
        return Collections.unmodifiableSet(this.view);
    }
}

We would set the RouteStatusListener following this line from JChannelFactory:
https://github.com/infinispan/infinispan/blob/master/server/integration/jgroups/src/main/java/org/infinispan/server/jgroups/JChannelFactory.java#L136
e.g.
RELAY2 relay = new RELAY2().site(localSite);
relay.setRouteStatusListener(new DefaultRouteStatusListener());

JGroupsTransport can then obtain the site view via:
@Override
public Set<String> getSitesView() {
    RELAY2 relay = channel.getProtocolStack().findProtocol(RELAY2.class);
    RouteStatusListener listener = (relay != null) ?
relay.getRouteStatusListener() : null;
    return (listener instanceof Supplier) ? ((Supplier<Set<String>>)
listener).get() : null;
}

On Thu, Jan 12, 2017 at 6:10 AM, Galder Zamarreño <gal...@redhat.com> wrote:
> Hi Paul,
>
> Sorry to bother you again :)
>
> Re: https://issues.jboss.org/browse/ISPN-7230 & 
> https://issues.jboss.org/browse/ISPN-7231
>
> The aim of these JIRAs is to have a x-site view exposed as an INFO message as 
> well as JMX and DMR operation.
>
> To do that, following Bela's advice, I've extracted RELAY2 protocol of the 
> stack and on Infinispan's JGroupsTransport start() method, call 
> setRouteStatusListener() with a relay RouteStatusListener implementation that 
> allows the x-site view to be tracked [1].
>
> This works fine in library mode, but in server, on startup 
> setRouteStatusListener() sometimes gets called after the Relayer's 
> viewAccepted() method has been already called (which is the one that calls 
> into RouteStatusListener). These means that the inital x-site view might not 
> be registered.
>
> So, what would be the correct place to add the setRouteStatusListener() call 
> so that all views are captured? Or given how the server works, do I need to 
> avoid using setRouteStatusListener() and use my own, Infinispan level, 
> listener for tracking somehow?
>
> Cheers,
>
> [1] 
> https://github.com/galderz/infinispan/blob/t_7230/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java#L926
> --
> Galder Zamarreño
> Infinispan, Red Hat
>

_______________________________________________
infinispan-dev mailing list
infinispan-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/infinispan-dev

Reply via email to