use of org.infinispan.remoting.transport.XSiteResponse in project infinispan by infinispan.
the class SiteProviderTopologyChangeTest method doTopologyChangeDuringXSiteStateTransfer.
/**
* the test node starts the x-site state transfer and sends a chunk of data. the next chunk is blocked and we trigger
* the cache topology change.
*/
private void doTopologyChangeDuringXSiteStateTransfer(TopologyEvent event) throws Exception {
log.debugf("Start topology change during x-site state transfer with %s", event);
initBeforeTest();
final TestCaches<Object, Object> testCaches = createTestCache(event, LON);
log.debugf("Controlled cache=%s, Coordinator cache=%s, Cache to remove=%s", addressOf(testCaches.controllerCache), addressOf(testCaches.coordinator), testCaches.removeIndex < 0 ? "NONE" : addressOf(cache(LON, testCaches.removeIndex)));
// the test node will start the x-site state transfer and it will block. next, it the topology will change.
// strategy: let the first push command to proceed a block the next one.
final CheckPoint checkPoint = new CheckPoint();
final AtomicBoolean firstChunk = new AtomicBoolean(false);
wrapGlobalComponent(testCaches.controllerCache.getCacheManager(), Transport.class, new WrapFactory<Transport, Transport, CacheContainer>() {
@Override
public Transport wrap(CacheContainer wrapOn, Transport current) {
return new AbstractDelegatingTransport(current) {
@Override
public void start() {
// no-op; avoid re-start the transport again...
}
@Override
public XSiteResponse backupRemotely(XSiteBackup backup, XSiteReplicateCommand rpcCommand) {
if (rpcCommand instanceof XSiteStatePushCommand) {
if (firstChunk.compareAndSet(false, true)) {
checkPoint.trigger("before-second-chunk");
try {
checkPoint.awaitStrict("second-chunk", 30, TimeUnit.SECONDS);
} catch (InterruptedException | TimeoutException e) {
XSiteResponseImpl rsp = new XSiteResponseImpl(TIME_SERVICE, backup);
rsp.completeExceptionally(e);
return rsp;
}
}
}
return super.backupRemotely(backup, rpcCommand);
}
};
}
}, true);
log.debug("Start x-site state transfer");
startStateTransfer(testCaches.coordinator, NYC);
assertOnline(LON, NYC);
checkPoint.awaitStrict("before-second-chunk", 30, TimeUnit.SECONDS);
final Future<Void> topologyEventFuture = triggerTopologyChange(LON, testCaches.removeIndex);
topologyEventFuture.get();
checkPoint.triggerForever("second-chunk");
awaitLocalStateTransfer(LON);
awaitXSiteStateSent(LON);
assertData();
}
use of org.infinispan.remoting.transport.XSiteResponse in project infinispan by infinispan.
the class DefaultIracManager method checkAndTrackExpiration.
@Override
public CompletionStage<Boolean> checkAndTrackExpiration(Object key) {
if (log.isTraceEnabled()) {
log.tracef("Checking remote backup sites to see if key %s has been touched recently", key);
}
IracTouchKeyCommand command = commandsFactory.buildIracTouchCommand(key);
AtomicBoolean expired = new AtomicBoolean(true);
// TODO: technically this waits for all backups to respond - we can optimize so
// we return early
// if at least one backup says it isn't expired
AggregateCompletionStage<AtomicBoolean> collector = CompletionStages.aggregateCompletionStage(expired);
for (XSiteBackup backup : asyncBackups) {
if (takeOfflineManager.getSiteState(backup.getSiteName()) == SiteState.OFFLINE) {
if (log.isTraceEnabled()) {
log.tracef("Skipping %s as it is offline", backup.getSiteName());
}
// backup is offline
continue;
}
if (log.isTraceEnabled()) {
log.tracef("Sending irac touch key command to %s", backup);
}
XSiteResponse<Boolean> response = sendToRemoteSite(backup, command);
collector.dependsOn(response.thenAccept(touched -> {
if (touched) {
if (log.isTraceEnabled()) {
log.tracef("Key %s was recently touched on a remote site %s", key, backup);
}
expired.set(false);
} else if (log.isTraceEnabled()) {
log.tracef("Entry %s was expired on remote site %s", key, backup);
}
}));
}
return collector.freeze().thenApply(AtomicBoolean::get);
}
Aggregations