package org.radargun.service; import org.infinispan.Cache; import org.infinispan.notifications.Listener; import org.infinispan.notifications.cachelistener.annotation.DataRehashed; import org.infinispan.notifications.cachelistener.annotation.TopologyChanged; import org.infinispan.notifications.cachelistener.event.DataRehashedEvent; import org.infinispan.notifications.cachelistener.event.TopologyChangedEvent; import org.radargun.traits.TopologyHistory; /** * @author Radim Vansa <rvansa@redhat.com> */ public class InfinispanTopologyHistory extends AbstractTopologyHistory { protected final Infinispan51EmbeddedService service; public InfinispanTopologyHistory(Infinispan51EmbeddedService service) { this.service = service; } public void registerListener(Cache<?, ?> cache) { cache.addListener(new TopologyAwareListener(cache.getName())); } @Override protected String getDefaultCacheName() { return service.getCache(null).getName(); } @Listener public class TopologyAwareListener { protected final String cacheName; public TopologyAwareListener(String cacheName) { this.cacheName = cacheName; } @TopologyChanged public void onTopologyChanged(TopologyChangedEvent<?, ?> e) { log.debug("Topology change " + (e.isPre() ? "started" : "finished")); int atStart = service.membersCount(e.getConsistentHashAtStart()); int atEnd = service.membersCount(e.getConsistentHashAtEnd()); TopologyHistory.Event.EventType type = e.isPre() ? TopologyHistory.Event.EventType.START : TopologyHistory.Event.EventType.END; addEvent(topologyChanges, cacheName, type, atStart, atEnd); } @DataRehashed public void onDataRehashed(DataRehashedEvent<?, ?> e) { log.debug("Rehash " + (e.isPre() ? "started" : "finished")); int atStart = e.getMembersAtStart().size(); int atEnd = e.getMembersAtEnd().size(); TopologyHistory.Event.EventType type = e.isPre() ? TopologyHistory.Event.EventType.START : TopologyHistory.Event.EventType.END; addEvent(hashChanges, cacheName, type, atStart, atEnd); } } }