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

Reply via email to