diff --git a/src/java/org/apache/cassandra/tcm/ownership/PlacementTransitionPlan.java b/src/java/org/apache/cassandra/tcm/ownership/PlacementTransitionPlan.java index 1d95df4122..c93d33f632 100644 --- a/src/java/org/apache/cassandra/tcm/ownership/PlacementTransitionPlan.java +++ b/src/java/org/apache/cassandra/tcm/ownership/PlacementTransitionPlan.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Set; import javax.annotation.Nullable; +import com.google.common.annotations.VisibleForTesting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -159,17 +160,14 @@ public class PlacementTransitionPlan * @return null if everything is good, otherwise a Transformation.Result rejection containing information about the bad replica */ @Nullable - public static void assertPreExistingWriteReplica(DataPlacements placements, PlacementTransitionPlan transitionPlan) + public void assertPreExistingWriteReplica(DataPlacements placements) { - assertPreExistingWriteReplica(placements, - transitionPlan.toSplit, - transitionPlan.addToWrites(), - transitionPlan.moveReads(), - transitionPlan.removeFromWrites()); + assertPreExistingWriteReplica(placements, toSplit, addToWrites(), moveReads(), removeFromWrites()); } @Nullable - public static void assertPreExistingWriteReplica(DataPlacements placements, PlacementDeltas ... deltasInOrder) + @VisibleForTesting + protected void assertPreExistingWriteReplica(DataPlacements placements, PlacementDeltas... deltasInOrder) { for (PlacementDeltas deltas : deltasInOrder) { diff --git a/src/java/org/apache/cassandra/tcm/transformations/PrepareJoin.java b/src/java/org/apache/cassandra/tcm/transformations/PrepareJoin.java index a684e76d50..6a518975b4 100644 --- a/src/java/org/apache/cassandra/tcm/transformations/PrepareJoin.java +++ b/src/java/org/apache/cassandra/tcm/transformations/PrepareJoin.java @@ -167,7 +167,7 @@ public class PrepareJoin implements Transformation void assertPreExistingWriteReplica(DataPlacements placements, PlacementTransitionPlan transitionPlan) { - PlacementTransitionPlan.assertPreExistingWriteReplica(placements, transitionPlan); + transitionPlan.assertPreExistingWriteReplica(placements); } public static abstract class Serializer implements AsymmetricMetadataSerializer diff --git a/src/java/org/apache/cassandra/tcm/transformations/PrepareLeave.java b/src/java/org/apache/cassandra/tcm/transformations/PrepareLeave.java index e8512b1ce9..0ad37f8bcd 100644 --- a/src/java/org/apache/cassandra/tcm/transformations/PrepareLeave.java +++ b/src/java/org/apache/cassandra/tcm/transformations/PrepareLeave.java @@ -115,7 +115,7 @@ public class PrepareLeave implements Transformation PlacementDeltas startDelta = transitionPlan.addToWrites(); PlacementDeltas midDelta = transitionPlan.moveReads(); PlacementDeltas finishDelta = transitionPlan.removeFromWrites(); - PlacementTransitionPlan.assertPreExistingWriteReplica(prev.placements, transitionPlan); + transitionPlan.assertPreExistingWriteReplica(prev.placements); LockedRanges.Key unlockKey = LockedRanges.keyFor(proposed.epoch); diff --git a/src/java/org/apache/cassandra/tcm/transformations/PrepareMove.java b/src/java/org/apache/cassandra/tcm/transformations/PrepareMove.java index 42d276b816..e7e278d0d2 100644 --- a/src/java/org/apache/cassandra/tcm/transformations/PrepareMove.java +++ b/src/java/org/apache/cassandra/tcm/transformations/PrepareMove.java @@ -109,7 +109,7 @@ public class PrepareMove implements Transformation StartMove startMove = new StartMove(nodeId, transitionPlan.addToWrites(), lockKey); MidMove midMove = new MidMove(nodeId, transitionPlan.moveReads(), lockKey); FinishMove finishMove = new FinishMove(nodeId, tokens, transitionPlan.removeFromWrites(), lockKey); - PlacementTransitionPlan.assertPreExistingWriteReplica(prev.placements, transitionPlan); + transitionPlan.assertPreExistingWriteReplica(prev.placements); Move sequence = Move.newSequence(prev.nextEpoch(), lockKey, diff --git a/src/java/org/apache/cassandra/tcm/transformations/PrepareReplace.java b/src/java/org/apache/cassandra/tcm/transformations/PrepareReplace.java index 983deb0c16..8b1577822b 100644 --- a/src/java/org/apache/cassandra/tcm/transformations/PrepareReplace.java +++ b/src/java/org/apache/cassandra/tcm/transformations/PrepareReplace.java @@ -109,7 +109,7 @@ public class PrepareReplace implements Transformation StartReplace start = new StartReplace(replaced, replacement, transitionPlan.addToWrites(), unlockKey); MidReplace mid = new MidReplace(replaced, replacement, transitionPlan.moveReads(), unlockKey); FinishReplace finish = new FinishReplace(replaced, replacement, transitionPlan.removeFromWrites(), unlockKey); - PlacementTransitionPlan.assertPreExistingWriteReplica(prev.placements, start.delta, mid.delta, finish.delta); + transitionPlan.assertPreExistingWriteReplica(prev.placements); Set tokens = new HashSet<>(prev.tokenMap.tokens(replaced)); BootstrapAndReplace plan = BootstrapAndReplace.newSequence(prev.nextEpoch(), diff --git a/test/unit/org/apache/cassandra/tcm/ownership/PlacementTransitionPlanTest.java b/test/unit/org/apache/cassandra/tcm/ownership/PlacementTransitionPlanTest.java index 4da753dcdf..74d8778afd 100644 --- a/test/unit/org/apache/cassandra/tcm/ownership/PlacementTransitionPlanTest.java +++ b/test/unit/org/apache/cassandra/tcm/ownership/PlacementTransitionPlanTest.java @@ -44,7 +44,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(newReads)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addRead); + assertPreExistingWriteReplica(startPlacements, addRead); } @Test @@ -59,7 +59,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(newReplica)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test @@ -74,7 +74,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(readReplicas)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test public void testAddSplitReadReplica() @@ -88,7 +88,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(readReplicas)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test @@ -103,7 +103,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(readReplicas)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test(expected = Transformation.RejectedTransformationException.class) @@ -118,7 +118,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(readReplicas)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test @@ -138,7 +138,7 @@ public class PlacementTransitionPlanTest .put(params, addReadDelta(readReplicas)).build(); // first delta adds (0, 20] as write, second (20, 40] - make sure both are in placements when adding the read replica; - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite1, addWrite2, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite1, addWrite2, addRead); } @Test(expected = Transformation.RejectedTransformationException.class) @@ -154,7 +154,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(fullRead)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test @@ -170,7 +170,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(transientRead)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test @@ -186,7 +186,7 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(transientRead)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWrite, addRead); + assertPreExistingWriteReplica(startPlacements, addWrite, addRead); } @Test(expected = Transformation.RejectedTransformationException.class) @@ -206,7 +206,15 @@ public class PlacementTransitionPlanTest PlacementDeltas addRead = PlacementDeltas.builder() .put(params, addReadDelta(readReplicas)).build(); - PlacementTransitionPlan.assertPreExistingWriteReplica(startPlacements, addWriteFull, addWriteTransient, addRead); + assertPreExistingWriteReplica(startPlacements, addWriteFull, addWriteTransient, addRead); + } + + private void assertPreExistingWriteReplica(DataPlacements start, PlacementDeltas ... deltasInOrder) + { + new PlacementTransitionPlan(PlacementDeltas.empty(), + PlacementDeltas.empty(), + PlacementDeltas.empty(), + PlacementDeltas.empty()).assertPreExistingWriteReplica(start, deltasInOrder); } private PlacementDeltas.PlacementDelta addReadDelta(RangesByEndpoint replica)