package org.radargun.stages.monitor; import org.radargun.DistStageAck; import org.radargun.config.Property; import org.radargun.config.Stage; import org.radargun.stages.AbstractDistStage; import org.radargun.traits.Clustered; import org.radargun.traits.InjectTrait; /** * This stage needs to be defined twice: * * <cluster-split-verify /> * ... other stages ... * <cluster-split-verify verify="true" /> * * First run will record the cluster size, and the second will verify that that the size didn't change * during the time. */ @Stage(doc = "Verifies that there weren't any changes to the cluster size during testing.") public class ClusterSplitVerifyStage extends AbstractDistStage { public static final String CLUSTER_SIZE_AT_START = "CLUSTER_SIZE_AT_START"; public static final String MEMBERSHIP_HISTORY_SIZE_AT_START = "MEMBERSHIP_HISTORY_SIZE_AT_START"; @Property(doc = "Set to true in 2nd definition of the stage in benchmark to verify that no splits occurred. Default is false.") private boolean verify = false; @InjectTrait private Clustered clustered; @Override public DistStageAck executeOnSlave() { if (!verify) { int clusterSizeAtTestStart = clustered.getMembers().size(); int membershipHistorySizeAtStart = clustered.getMembershipHistory().size(); slaveState.put(CLUSTER_SIZE_AT_START, clusterSizeAtTestStart); slaveState.put(MEMBERSHIP_HISTORY_SIZE_AT_START, membershipHistorySizeAtStart); } else { int clusterSizeAtTestStart = (int) slaveState.get(CLUSTER_SIZE_AT_START); int membershipHistorySizeAtStart = (int) slaveState.get(MEMBERSHIP_HISTORY_SIZE_AT_START); for (int i = membershipHistorySizeAtStart; i < clustered.getMembershipHistory().size(); i++) { int clusterSizeDuringTest = clustered.getMembershipHistory().get(i).members.size(); if (clusterSizeDuringTest != clusterSizeAtTestStart) { return errorResponse("Cluster size at the beginning of the test was " + clusterSizeAtTestStart + " but changed to " + clusterSizeDuringTest + " during the test! Perhaps a split occured, or a new node joined?"); } } } return successfulResponse(); } }