package org.infinispan.xsite; import java.util.Arrays; import java.util.List; import org.infinispan.Cache; import org.infinispan.commons.CacheException; import org.infinispan.remoting.LocalInvocation; import org.infinispan.util.logging.Log; import org.infinispan.util.logging.LogFactory; import org.infinispan.xsite.statetransfer.XSiteState; import org.infinispan.xsite.statetransfer.XSiteStatePushCommand; import org.infinispan.xsite.statetransfer.XSiteStateTransferControlCommand; /** * {@link org.infinispan.xsite.BackupReceiver} implementation for local caches. * * @author Pedro Ruivo * @since 7.1 */ public class LocalCacheBackupReceiver extends BaseBackupReceiver { private static final Log log = LogFactory.getLog(LocalCacheBackupReceiver.class); private static final boolean trace = log.isTraceEnabled(); public LocalCacheBackupReceiver(Cache<Object, Object> cache) { super(cache); } @Override public void handleStateTransferControl(XSiteStateTransferControlCommand command) throws Exception { XSiteStateTransferControlCommand invokeCommand = command; if (!command.getCacheName().equals(cacheName)) { //copy if the cache name is different invokeCommand = command.copyForCache(cacheName); } invokeCommand.setSiteName(command.getOriginSite()); LocalInvocation.newInstanceFromCache(cache, invokeCommand).call(); } @Override public void handleStateTransferState(XSiteStatePushCommand cmd) throws Exception { //split the state and forward it to the primary owners... assertAllowInvocation(); final List<XSiteState> localChunks = Arrays.asList(cmd.getChunk()); if (trace) { log.tracef("Local node will apply %s", localChunks); } LocalInvocation.newInstanceFromCache(cache, newStatePushCommand(cache, localChunks)).call(); //the put operation can fail silently. check in the end and it is better to resend the chunk than to lose keys. if (!cache.getStatus().allowInvocations()) { throw new CacheException("Cache is stopping or terminated: " + cache.getStatus()); } } }