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

kturner pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/2.1 by this push:
     new 9c19662d9d adds constraint class name to error message (#5926)
9c19662d9d is described below

commit 9c19662d9da85982a743b4178a47af8cbfccdeda
Author: Keith Turner <[email protected]>
AuthorDate: Wed Sep 24 13:52:50 2025 -0400

    adds constraint class name to error message (#5926)
    
    fixes #5914
---
 .../core/client/MutationsRejectedException.java    | 31 +++++++++++-----------
 .../accumulo/test/functional/ConstraintIT.java     | 16 ++++++++---
 2 files changed, 28 insertions(+), 19 deletions(-)

diff --git 
a/core/src/main/java/org/apache/accumulo/core/client/MutationsRejectedException.java
 
b/core/src/main/java/org/apache/accumulo/core/client/MutationsRejectedException.java
index 30e6fbd183..f34761576b 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/client/MutationsRejectedException.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/client/MutationsRejectedException.java
@@ -18,6 +18,10 @@
  */
 package org.apache.accumulo.core.client;
 
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.toSet;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -26,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import org.apache.accumulo.core.client.security.SecurityErrorCode;
 import org.apache.accumulo.core.clientImpl.ClientContext;
@@ -59,13 +62,12 @@ public class MutationsRejectedException extends 
AccumuloException {
   public MutationsRejectedException(Instance instance, 
List<ConstraintViolationSummary> cvsList,
       Map<TabletId,Set<SecurityErrorCode>> hashMap, Collection<String> 
serverSideErrors,
       int unknownErrors, Throwable cause) {
-    super(
-        "constraint violation codes : "
-            + 
cvsList.stream().map(ConstraintViolationSummary::getViolationCode)
-                .collect(Collectors.toSet())
-            + "  security codes: " + hashMap.toString() + "  # server errors "
-            + serverSideErrors.size() + " # exceptions " + unknownErrors,
-        cause);
+    super("constraint violation codes : "
+        + cvsList.stream()
+            .collect(groupingBy(ConstraintViolationSummary::getConstrainClass,
+                mapping(ConstraintViolationSummary::getViolationCode, 
toSet())))
+        + "  security codes: " + hashMap.toString() + "  # server errors " + 
serverSideErrors.size()
+        + " # exceptions " + unknownErrors, cause);
     this.cvsl.addAll(cvsList);
     this.af.putAll(hashMap);
     this.es.addAll(serverSideErrors);
@@ -86,13 +88,12 @@ public class MutationsRejectedException extends 
AccumuloException {
   public MutationsRejectedException(AccumuloClient client, 
List<ConstraintViolationSummary> cvsList,
       Map<TabletId,Set<SecurityErrorCode>> hashMap, Collection<String> 
serverSideErrors,
       int unknownErrors, Throwable cause) {
-    super(
-        "constraint violation codes : "
-            + 
cvsList.stream().map(ConstraintViolationSummary::getViolationCode).collect(
-                Collectors.toSet())
-            + "  security codes: " + format(hashMap, (ClientContext) client) + 
"  # server errors "
-            + serverSideErrors.size() + " # exceptions " + unknownErrors,
-        cause);
+    super("constraint violation codes : "
+        + cvsList.stream()
+            .collect(groupingBy(ConstraintViolationSummary::getConstrainClass,
+                mapping(ConstraintViolationSummary::getViolationCode, 
toSet())))
+        + "  security codes: " + format(hashMap, (ClientContext) client) + "  
# server errors "
+        + serverSideErrors.size() + " # exceptions " + unknownErrors, cause);
     this.cvsl.addAll(cvsList);
     this.af.putAll(hashMap);
     this.es.addAll(serverSideErrors);
diff --git 
a/test/src/main/java/org/apache/accumulo/test/functional/ConstraintIT.java 
b/test/src/main/java/org/apache/accumulo/test/functional/ConstraintIT.java
index 9f99d7e390..dd30465067 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/ConstraintIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/ConstraintIT.java
@@ -19,6 +19,7 @@
 package org.apache.accumulo.test.functional;
 
 import static 
org.apache.accumulo.core.util.UtilWaitThread.sleepUninterruptibly;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.time.Duration;
 import java.util.HashMap;
@@ -135,6 +136,9 @@ public class ConstraintIT extends AccumuloClusterHarness {
           throw new Exception("Unexpected # violating mutations " + 
cvs.numberOfViolatingMutations);
         }
       }
+
+      assertTrue(mre.getMessage().contains(
+          "constraint violation codes : 
{org.apache.accumulo.test.constraints.NumericValueConstraint=[1]}"));
     }
 
     if (!sawMRE) {
@@ -290,7 +294,7 @@ public class ConstraintIT extends AccumuloClusterHarness {
       }
     }
     bw.addMutation(newMut("r1", "cf1", "cq3", "I'm a naughty value"));
-    bw.addMutation(newMut("@bad row@", "cf1", "cq2", "456"));
+    bw.addMutation(newMut("r1", "@bad fam@", "@bad qual@", "456"));
     bw.addMutation(newMut("r1", "cf1", "cq4", "789"));
 
     boolean sawMRE = false;
@@ -300,14 +304,12 @@ public class ConstraintIT extends AccumuloClusterHarness {
       // should not get here
       throw new Exception("Test failed, constraint did not catch bad 
mutation");
     } catch (MutationsRejectedException mre) {
-      System.out.println(mre);
-
       sawMRE = true;
 
       // verify constraint violation summary
       List<ConstraintViolationSummary> cvsl = 
mre.getConstraintViolationSummaries();
 
-      if (cvsl.size() != 2) {
+      if (cvsl.size() != 3) {
         throw new Exception("Unexpected constraints");
       }
 
@@ -322,6 +324,12 @@ public class ConstraintIT extends AccumuloClusterHarness {
               "Unexpected " + cvs.constrainClass + " " + 
cvs.numberOfViolatingMutations);
         }
       }
+
+      assertTrue(mre.getMessage().contains(
+          "constraint violation codes : 
{org.apache.accumulo.test.constraints.NumericValueConstraint=[1], 
org.apache.accumulo.test.constraints.AlphaNumKeyConstraint=[2, 3]}")
+          || mre.getMessage().contains(
+              "constraint violation codes : 
{org.apache.accumulo.test.constraints.AlphaNumKeyConstraint=[2, 3], 
org.apache.accumulo.test.constraints.NumericValueConstraint=[1]}"),
+          mre::getMessage);
     }
 
     if (!sawMRE) {

Reply via email to