This is an automated email from the ASF dual-hosted git repository. samt pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push: new 80971709b9 Properly set lastModifiedEpoch on multistep operations 80971709b9 is described below commit 80971709b983566a3f2dbfc189dfa1c5367d69bb Author: Marcus Eriksson <marc...@apache.org> AuthorDate: Mon Apr 15 11:06:57 2024 +0200 Properly set lastModifiedEpoch on multistep operations Patch by Marcus Eriksson; reviewed by Sam Tunnicliffe for CASSANDRA-19538 --- src/java/org/apache/cassandra/tcm/MultiStepOperation.java | 4 ++-- .../org/apache/cassandra/tcm/ownership/DataPlacement.java | 6 ++++++ .../org/apache/cassandra/tcm/ownership/DataPlacements.java | 10 +++++++++- .../apache/cassandra/tcm/ownership/PlacementForRange.java | 14 ++++++++++++++ .../apache/cassandra/tcm/ownership/VersionedEndpoints.java | 6 ++---- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/java/org/apache/cassandra/tcm/MultiStepOperation.java b/src/java/org/apache/cassandra/tcm/MultiStepOperation.java index 9e8f21c6ec..5fffbd2c84 100644 --- a/src/java/org/apache/cassandra/tcm/MultiStepOperation.java +++ b/src/java/org/apache/cassandra/tcm/MultiStepOperation.java @@ -155,7 +155,7 @@ public abstract class MultiStepOperation<CONTEXT> public static Transformation.Result applyMultipleTransformations(ClusterMetadata metadata, Transformation.Kind next, List<Transformation> transformations) { ImmutableSet.Builder<MetadataKey> modifiedKeys = ImmutableSet.builder(); - Epoch lastModifiedEpoch = metadata.epoch; + Epoch lastModifiedEpoch = metadata.epoch.nextEpoch(); boolean foundStart = false; for (Transformation nextTransformation : transformations) { @@ -169,7 +169,7 @@ public abstract class MultiStepOperation<CONTEXT> modifiedKeys.addAll(result.success().affectedMetadata); } } - return new Transformation.Success(metadata.forceEpoch(lastModifiedEpoch.nextEpoch()), LockedRanges.AffectedRanges.EMPTY, modifiedKeys.build()); + return new Transformation.Success(metadata, LockedRanges.AffectedRanges.EMPTY, modifiedKeys.build()); } /** diff --git a/src/java/org/apache/cassandra/tcm/ownership/DataPlacement.java b/src/java/org/apache/cassandra/tcm/ownership/DataPlacement.java index 521084ffe5..c37137b357 100644 --- a/src/java/org/apache/cassandra/tcm/ownership/DataPlacement.java +++ b/src/java/org/apache/cassandra/tcm/ownership/DataPlacement.java @@ -155,6 +155,12 @@ public class DataPlacement } } + public DataPlacement withCappedLastModified(Epoch lastModified) + { + return new DataPlacement(reads.withCappedLastModified(lastModified), + writes.withCappedLastModified(lastModified)); + } + @Override public String toString() { diff --git a/src/java/org/apache/cassandra/tcm/ownership/DataPlacements.java b/src/java/org/apache/cassandra/tcm/ownership/DataPlacements.java index 73c83fb5fd..5d598a8191 100644 --- a/src/java/org/apache/cassandra/tcm/ownership/DataPlacements.java +++ b/src/java/org/apache/cassandra/tcm/ownership/DataPlacements.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Objects; import java.util.function.BiConsumer; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -122,7 +123,7 @@ public class DataPlacements extends ReplicationMap<DataPlacement> implements Met @Override public DataPlacements withLastModified(Epoch epoch) { - return new DataPlacements(epoch, asMap()); + return new DataPlacements(epoch, capLastModified(epoch, map)); } @Override @@ -255,6 +256,13 @@ public class DataPlacements extends ReplicationMap<DataPlacement> implements Met } } + public static ImmutableMap<ReplicationParams, DataPlacement> capLastModified(Epoch lastModified, Map<ReplicationParams, DataPlacement> placements) + { + ImmutableMap.Builder<ReplicationParams, DataPlacement> builder = ImmutableMap.builder(); + placements.forEach((params, placement) -> builder.put(params, placement.withCappedLastModified(lastModified))); + return builder.build(); + } + public void dumpDiff(DataPlacements other) { if (!map.equals(other.map)) diff --git a/src/java/org/apache/cassandra/tcm/ownership/PlacementForRange.java b/src/java/org/apache/cassandra/tcm/ownership/PlacementForRange.java index c72bd2a0d5..baa7719d13 100644 --- a/src/java/org/apache/cassandra/tcm/ownership/PlacementForRange.java +++ b/src/java/org/apache/cassandra/tcm/ownership/PlacementForRange.java @@ -152,6 +152,20 @@ public class PlacementForRange return builder.build(); } + public PlacementForRange withCappedLastModified(Epoch lastModified) + { + SortedMap<Range<Token>, VersionedEndpoints.ForRange> copy = new TreeMap<>(); + for (Map.Entry<Range<Token>, VersionedEndpoints.ForRange> entry : replicaGroups.entrySet()) + { + Range<Token> range = entry.getKey(); + VersionedEndpoints.ForRange forRange = entry.getValue(); + if (forRange.lastModified().isAfter(lastModified)) + forRange = forRange.withLastModified(lastModified); + copy.put(range, forRange); + } + return new PlacementForRange(copy); + } + @Override public String toString() { diff --git a/src/java/org/apache/cassandra/tcm/ownership/VersionedEndpoints.java b/src/java/org/apache/cassandra/tcm/ownership/VersionedEndpoints.java index c867b33f86..90148f2c83 100644 --- a/src/java/org/apache/cassandra/tcm/ownership/VersionedEndpoints.java +++ b/src/java/org/apache/cassandra/tcm/ownership/VersionedEndpoints.java @@ -63,7 +63,7 @@ public interface VersionedEndpoints<E extends Endpoints<E>> extends MetadataValu public ForRange withLastModified(Epoch epoch) { - return new ForRange(lastModified, endpointsForRange); + return new ForRange(epoch, endpointsForRange); } public Epoch lastModified() @@ -151,7 +151,7 @@ public interface VersionedEndpoints<E extends Endpoints<E>> extends MetadataValu public ForToken withLastModified(Epoch epoch) { - return new ForToken(lastModified, endpointsForToken); + return new ForToken(epoch, endpointsForToken); } public ForToken map(Function<EndpointsForToken, EndpointsForToken> fn) @@ -159,13 +159,11 @@ public interface VersionedEndpoints<E extends Endpoints<E>> extends MetadataValu return new ForToken(lastModified, fn.apply(endpointsForToken)); } - public ForToken without(Set<InetAddressAndPort> remove) { return map(e -> e.without(remove)); } - public Epoch lastModified() { return lastModified; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org