diff --git a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/AbstractVerification.java b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/AbstractVerification.java index cd94ba3be540b..1fff398f9eba6 100644 --- a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/AbstractVerification.java +++ b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/AbstractVerification.java @@ -96,6 +96,7 @@ public abstract class AbstractVerification snapshotQueries; @@ -131,6 +132,7 @@ public AbstractVerification( this.runningMode = verifierConfig.getRunningMode(); this.saveSnapshot = verifierConfig.isSaveSnapshot(); this.isExplain = verifierConfig.isExplain(); + this.isUseTestChecksumInDeterminismAnalyzer = verifierConfig.isUseTestChecksumInDeterminismAnalyzer(); } protected abstract B getQueryRewrite(ClusterType clusterType); diff --git a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataMatchResult.java b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataMatchResult.java index 6de343581713a..7733b6658d7e4 100644 --- a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataMatchResult.java +++ b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataMatchResult.java @@ -53,6 +53,7 @@ public enum MatchType private final DataType dataType; private final MatchType matchType; private final Optional controlChecksum; + private final Optional testChecksum; private final OptionalLong controlRowCount; private final OptionalLong testRowCount; private final List> mismatchedColumns; @@ -61,6 +62,7 @@ public DataMatchResult( DataType dataType, MatchType matchType, Optional controlChecksum, + Optional testChecksum, OptionalLong controlRowCount, OptionalLong testRowCount, List> mismatchedColumns) @@ -68,6 +70,7 @@ public DataMatchResult( this.dataType = requireNonNull(dataType, "data type is null"); this.matchType = requireNonNull(matchType, "match type is null"); this.controlChecksum = requireNonNull(controlChecksum, "controlChecksum is null"); + this.testChecksum = requireNonNull(testChecksum, "testChecksum is null"); this.controlRowCount = requireNonNull(controlRowCount, "controlRowCount is null"); this.testRowCount = requireNonNull(testRowCount, "testRowCount is null"); this.mismatchedColumns = ImmutableList.copyOf(mismatchedColumns); @@ -114,6 +117,12 @@ public ChecksumResult getControlChecksum() return controlChecksum.get(); } + public ChecksumResult getTestChecksum() + { + checkState(testChecksum.isPresent(), "testChecksum is missing"); + return testChecksum.get(); + } + public List> getMismatchedColumns() { return mismatchedColumns; diff --git a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerification.java b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerification.java index 73aba566d8181..faf1ec3250c00 100644 --- a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerification.java +++ b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerification.java @@ -132,6 +132,7 @@ public DataMatchResult verify( DATA, MATCH, Optional.empty(), + Optional.empty(), OptionalLong.empty(), OptionalLong.empty(), ImmutableList.of()); @@ -146,7 +147,14 @@ else if (QUERY_BANK_MODE.equals(runningMode)) { controlChecksumResult = ChecksumResult.fromJson(snapshotJson); } else { - return new DataMatchResult(DATA, SNAPSHOT_DOES_NOT_EXIST, Optional.empty(), OptionalLong.empty(), OptionalLong.empty(), Collections.emptyList()); + return new DataMatchResult( + DATA, + SNAPSHOT_DOES_NOT_EXIST, + Optional.empty(), + Optional.empty(), + OptionalLong.empty(), + OptionalLong.empty(), + Collections.emptyList()); } } @@ -161,7 +169,7 @@ else if (QUERY_BANK_MODE.equals(runningMode)) { @Override protected DeterminismAnalysisDetails analyzeDeterminism(QueryObjectBundle control, DataMatchResult matchResult) { - return determinismAnalyzer.analyze(control, matchResult.getControlChecksum()); + return determinismAnalyzer.analyze(control, isUseTestChecksumInDeterminismAnalyzer ? matchResult.getTestChecksum() : matchResult.getControlChecksum()); } @Override diff --git a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerificationUtil.java b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerificationUtil.java index 7847e9ac4a19a..6baa9a514f62a 100644 --- a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerificationUtil.java +++ b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/DataVerificationUtil.java @@ -85,6 +85,7 @@ public static DataMatchResult match( dataType, SCHEMA_MISMATCH, Optional.empty(), + Optional.empty(), OptionalLong.empty(), OptionalLong.empty(), ImmutableList.of()); @@ -107,6 +108,7 @@ public static DataMatchResult match( dataType, matchType, Optional.of(controlChecksum), + Optional.of(testChecksum), controlRowCount, testRowCount, mismatchedColumns); diff --git a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/ExtendedVerification.java b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/ExtendedVerification.java index fee119d50360f..4e74374c26564 100644 --- a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/ExtendedVerification.java +++ b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/ExtendedVerification.java @@ -163,6 +163,7 @@ private Optional verifyPartition( PARTITION_DATA, PARTITION_COUNT_MISMATCH, Optional.empty(), + Optional.empty(), OptionalLong.of(controlPartitionChecksum.size()), OptionalLong.of(testPartitionChecksum.size()), ImmutableList.of())); @@ -183,6 +184,7 @@ private Optional verifyPartition( PARTITION_DATA, MATCH, Optional.empty(), + Optional.empty(), OptionalLong.of(controlPartitionChecksum.size()), OptionalLong.of(testPartitionChecksum.size()), ImmutableList.of())); @@ -212,6 +214,7 @@ private Optional verifyBucket( BUCKET_DATA, BUCKET_COUNT_MISMATCH, Optional.empty(), + Optional.empty(), OptionalLong.of(controlBucketChecksum.size()), OptionalLong.of(testBucketChecksum.size()), ImmutableList.of())); @@ -232,6 +235,7 @@ private Optional verifyBucket( BUCKET_DATA, MATCH, Optional.empty(), + Optional.empty(), OptionalLong.of(controlBucketChecksum.size()), OptionalLong.of(testBucketChecksum.size()), ImmutableList.of())); diff --git a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/VerifierConfig.java b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/VerifierConfig.java index 91acb60b5c1ac..803c885c72e46 100644 --- a/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/VerifierConfig.java +++ b/presto-verifier/src/main/java/com/facebook/presto/verifier/framework/VerifierConfig.java @@ -61,6 +61,7 @@ public class VerifierConfig private boolean teardownOnMainClusters = true; private boolean skipControl; private boolean skipChecksum; + private boolean useTestChecksumInDeterminismAnalyzer; private boolean concurrentControlAndTest; private boolean explain; @@ -314,7 +315,7 @@ public boolean isSetupOnMainClusters() return setupOnMainClusters; } - @ConfigDescription("If true, run control/test setup queries on control/test clusters. Otherwise, run setup queries on the help cluster.") + @ConfigDescription("If true, run control/test setup queries on control/test clusters. Otherwise, run setup queries on the help cluster.X") @Config("setup-on-main-clusters") public VerifierConfig setSetupOnMainClusters(boolean setupOnMainClusters) { @@ -361,6 +362,19 @@ public boolean isSkipChecksum() return skipChecksum; } + @ConfigDescription("In Determinism Analyzer use test checksum, not control to determine determinism. Set to true when running helper queries on test cluster.") + @Config("use-test-checksum-in-determinism-analyzer") + public VerifierConfig setUseTestChecksumInDeterminismAnalyzer(boolean useTestChecksumInDeterminismAnalyzer) + { + this.useTestChecksumInDeterminismAnalyzer = useTestChecksumInDeterminismAnalyzer; + return this; + } + + public boolean isUseTestChecksumInDeterminismAnalyzer() + { + return useTestChecksumInDeterminismAnalyzer; + } + public boolean isExplain() { return explain; diff --git a/presto-verifier/src/test/java/com/facebook/presto/verifier/framework/TestVerifierConfig.java b/presto-verifier/src/test/java/com/facebook/presto/verifier/framework/TestVerifierConfig.java index 077ce3052b38d..8601498e87650 100644 --- a/presto-verifier/src/test/java/com/facebook/presto/verifier/framework/TestVerifierConfig.java +++ b/presto-verifier/src/test/java/com/facebook/presto/verifier/framework/TestVerifierConfig.java @@ -48,6 +48,7 @@ public void testDefault() .setTeardownOnMainClusters(true) .setSkipControl(false) .setSkipChecksum(false) + .setUseTestChecksumInDeterminismAnalyzer(false) .setExplain(false) .setConcurrentControlAndTest(false) .setRunningMode("control-test") @@ -81,6 +82,7 @@ public void testExplicitPropertyMappings() .put("teardown-on-main-clusters", "false") .put("skip-control", "true") .put("skip-checksum", "true") + .put("use-test-checksum-in-determinism-analyzer", "true") .put("explain", "true") .put("concurrent-control-and-test", "true") .put("running-mode", "query-bank") @@ -110,6 +112,7 @@ public void testExplicitPropertyMappings() .setTeardownOnMainClusters(false) .setSkipControl(true) .setSkipChecksum(true) + .setUseTestChecksumInDeterminismAnalyzer(true) .setExplain(true) .setConcurrentControlAndTest(true) .setRunningMode("query-bank") diff --git a/presto-verifier/src/test/java/com/facebook/presto/verifier/resolver/FailureResolverTestUtil.java b/presto-verifier/src/test/java/com/facebook/presto/verifier/resolver/FailureResolverTestUtil.java index a8c48c42b6f65..f6a77da93a382 100644 --- a/presto-verifier/src/test/java/com/facebook/presto/verifier/resolver/FailureResolverTestUtil.java +++ b/presto-verifier/src/test/java/com/facebook/presto/verifier/resolver/FailureResolverTestUtil.java @@ -40,7 +40,7 @@ public static ColumnMatchResult createMismatchedCo public static DataMatchResult createMatchResult(ColumnMatchResult... mismatchedColumns) { - return new DataMatchResult(DATA, COLUMN_MISMATCH, Optional.empty(), OptionalLong.of(1L), OptionalLong.of(1L), asList(mismatchedColumns)); + return new DataMatchResult(DATA, COLUMN_MISMATCH, Optional.empty(), Optional.empty(), OptionalLong.of(1L), OptionalLong.of(1L), asList(mismatchedColumns)); } public static SqlVarbinary binary(int data)