This is an automated email from the ASF dual-hosted git repository.

marcuse pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 6a302f734a1dede4b4bdee5e5f67c5ada6f0115d
Author: Blake Eggleston <bdeggles...@gmail.com>
AuthorDate: Tue Mar 17 16:47:50 2020 +0100

    Set now in seconds in the future for validation repairs
    
    Patch by Blake Eggleston; reviewed by Ekaterina Dimitrova for 
CASSANDRA-15655
---
 CHANGES.txt                                           |  1 +
 src/java/org/apache/cassandra/config/Config.java      |  7 +++++++
 .../apache/cassandra/config/DatabaseDescriptor.java   |  7 +++++++
 src/java/org/apache/cassandra/repair/RepairJob.java   | 19 ++++++++++++++++---
 4 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 9896272..77d69ca 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0-alpha4
+ * Set now in seconds in the future for validation repairs (CASSANDRA-15655)
  * Emit metric on preview repair failure (CASSANDRA-15654)
  * Use more appropriate logging levels (CASSANDRA-15661)
  * Added production recommendations and improved compaction doc organization
diff --git a/src/java/org/apache/cassandra/config/Config.java 
b/src/java/org/apache/cassandra/config/Config.java
index 5a24410..3fc314f 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -471,6 +471,13 @@ public class Config
     public volatile boolean report_unconfirmed_repaired_data_mismatches = 
false;
 
     /**
+     * number of seconds to set nowInSec into the future when performing 
validation previews against repaired data
+     * this (attempts) to prevent a race where validations on different 
machines are started on different sides of
+     * a tombstone being compacted away
+     */
+    public volatile int validation_preview_purge_head_start_in_sec = 60 * 60;
+
+    /**
      * @deprecated migrate to {@link DatabaseDescriptor#isClientInitialized()}
      */
     @Deprecated
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java 
b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 14db023..7af310e 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -3061,4 +3061,11 @@ public class DatabaseDescriptor
             throw new ConfigurationException(String.format("%s must be 
positive value < %d, but was %d",
                                                            name, 
unit.overflowThreshold(), val), false);
     }
+
+    public static int getValidationPreviewPurgeHeadStartInSec()
+    {
+        int seconds = conf.validation_preview_purge_head_start_in_sec;
+        return Math.max(seconds, 0);
+    }
+
 }
diff --git a/src/java/org/apache/cassandra/repair/RepairJob.java 
b/src/java/org/apache/cassandra/repair/RepairJob.java
index 3740070..e609f0d 100644
--- a/src/java/org/apache/cassandra/repair/RepairJob.java
+++ b/src/java/org/apache/cassandra/repair/RepairJob.java
@@ -71,6 +71,19 @@ public class RepairJob extends AbstractFuture<RepairResult> 
implements Runnable
         this.parallelismDegree = session.parallelismDegree;
     }
 
+    public int getNowInSeconds()
+    {
+        int nowInSeconds = FBUtilities.nowInSeconds();
+        if (session.previewKind == PreviewKind.REPAIRED)
+        {
+            return nowInSeconds + 
DatabaseDescriptor.getValidationPreviewPurgeHeadStartInSec();
+        }
+        else
+        {
+            return nowInSeconds;
+        }
+    }
+
     /**
      * Runs repair job.
      *
@@ -345,7 +358,7 @@ public class RepairJob extends AbstractFuture<RepairResult> 
implements Runnable
         String message = String.format("Requesting merkle trees for %s (to 
%s)", desc.columnFamily, endpoints);
         logger.info("{} {}", session.previewKind.logPrefix(desc.sessionId), 
message);
         Tracing.traceRepair(message);
-        int nowInSec = FBUtilities.nowInSeconds();
+        int nowInSec = getNowInSeconds();
         List<ListenableFuture<TreeResponse>> tasks = new 
ArrayList<>(endpoints.size());
         for (InetAddressAndPort endpoint : endpoints)
         {
@@ -365,7 +378,7 @@ public class RepairJob extends AbstractFuture<RepairResult> 
implements Runnable
         String message = String.format("Requesting merkle trees for %s (to 
%s)", desc.columnFamily, endpoints);
         logger.info("{} {}", session.previewKind.logPrefix(desc.sessionId), 
message);
         Tracing.traceRepair(message);
-        int nowInSec = FBUtilities.nowInSeconds();
+        int nowInSec = getNowInSeconds();
         List<ListenableFuture<TreeResponse>> tasks = new 
ArrayList<>(endpoints.size());
 
         Queue<InetAddressAndPort> requests = new LinkedList<>(endpoints);
@@ -407,7 +420,7 @@ public class RepairJob extends AbstractFuture<RepairResult> 
implements Runnable
         String message = String.format("Requesting merkle trees for %s (to 
%s)", desc.columnFamily, endpoints);
         logger.info("{} {}", session.previewKind.logPrefix(desc.sessionId), 
message);
         Tracing.traceRepair(message);
-        int nowInSec = FBUtilities.nowInSeconds();
+        int nowInSec = getNowInSeconds();
         List<ListenableFuture<TreeResponse>> tasks = new 
ArrayList<>(endpoints.size());
 
         Map<String, Queue<InetAddressAndPort>> requestsByDatacenter = new 
HashMap<>();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to