package org.radargun.stages.cache; import java.util.ArrayList; import java.util.List; import org.radargun.DistStageAck; import org.radargun.config.Property; import org.radargun.config.Stage; import org.radargun.stages.cache.generators.ValueGenerator; import org.radargun.traits.BasicOperations; import org.radargun.traits.Debugable; /** * Checks loaded data for their validity. * * @author Radim Vansa <rvansa@redhat.com> */ @Stage(doc = "Checks loaded data for validity. Useful for testing cross-site replication.") public class XSReplCheckStage extends CheckCacheDataStage { @Property(doc = "Backup value generator. By default, only main (default) cache is checked. " + "If specified, backup caches will be checked too.", complexConverter = ValueGenerator.ComplexConverter.class) public ValueGenerator backupValueGenerator = null; @Property(doc = "Comma-separated list of all backup caches to be checked. Ignored if backup-value-generator is not specified.") public List<String> backupCaches = new ArrayList<>(); private BasicOperations.Cache[] backupCacheInstances; private Debugable.Cache[] backupDebugable; @Override public DistStageAck executeOnSlave() { if (!isServiceRunning()) { return successfulResponse(); } if (backupValueGenerator != null) { int numBackups = backupCaches.size(); backupCacheInstances = new BasicOperations.Cache[numBackups]; if (debugable != null) { backupDebugable = new Debugable.Cache[numBackups]; } for (int i = 0; i < backupCaches.size(); i++) { String cacheName = backupCaches.get(i); backupCacheInstances[i] = basicOperations.getCache(cacheName); if (debugable != null) { backupDebugable[i] = debugable.getCache(cacheName); } } } if (valueGenerator == null) { valueGenerator = (ValueGenerator) slaveState.get(ValueGenerator.VALUE_GENERATOR); if (valueGenerator == null) { throw new IllegalStateException("Value generator was not specified and no key generator was used before."); } } return super.executeOnSlave(); } @Override protected boolean checkKey(BasicOperations.Cache basicCache, Debugable.Cache debugableCache, long keyIndex, CheckResult result, ValueGenerator valueGenerator) { boolean retval = super.checkKey(basicCache, debugableCache, keyIndex, result, valueGenerator); for (int i = 0; i < backupCaches.size(); ++i) { retval = retval && super.checkKey(backupCacheInstances[i], backupDebugable[i], keyIndex, result, backupValueGenerator); } return retval; } @Override protected long getExpectedNumEntries() { return getNumEntries() * (backupCacheInstances != null ? backupCacheInstances.length + 1 : 1); } }