Author: jbellis
Date: Thu Aug 11 19:19:18 2011
New Revision: 1156753

URL: http://svn.apache.org/viewvc?rev=1156753&view=rev
Log:
include column name in validation failure exceptions
patch by jbellis; reviewed by David Allsopp for CASSANDRA-2849

Modified:
    cassandra/branches/cassandra-0.8/CHANGES.txt
    
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java
    
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java

Modified: cassandra/branches/cassandra-0.8/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1156753&r1=1156752&r2=1156753&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.8/CHANGES.txt Thu Aug 11 19:19:18 2011
@@ -1,5 +1,6 @@
 0.8.5
  * fix NPE when encryption_options is unspecified (CASSANDRA-3007)
+ * include column name in validation failure exceptions (CASSANDRA-2849)
 
 
 0.8.4

Modified: 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1156753&r1=1156752&r2=1156753&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java
 (original)
+++ 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java
 Thu Aug 11 19:19:18 2011
@@ -439,7 +439,7 @@ public class CassandraServer implements 
             throw new InvalidRequestException("missing mandatory super column 
name for super CF " + column_parent.column_family);
         }
         ThriftValidation.validateColumnNames(metadata, column_parent, 
Arrays.asList(column.name));
-        ThriftValidation.validateColumnData(metadata, column);
+        ThriftValidation.validateColumnData(metadata, column, 
column_parent.super_column != null);
 
         RowMutation rm = new RowMutation(state().getKeyspace(), key);
         try

Modified: 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1156753&r1=1156752&r2=1156753&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java
 (original)
+++ 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java
 Thu Aug 11 19:19:18 2011
@@ -23,6 +23,9 @@ package org.apache.cassandra.thrift;
 import java.nio.ByteBuffer;
 import java.util.*;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -51,6 +54,8 @@ import org.apache.cassandra.utils.FBUtil
  */
 public class ThriftValidation
 {
+    private static Logger logger = 
LoggerFactory.getLogger(ThriftValidation.class);
+
     public static void validateKey(CFMetaData metadata, ByteBuffer key) throws 
InvalidRequestException
     {
         if (key == null || key.remaining() == 0)
@@ -285,7 +290,7 @@ public class ThriftValidation
 
             validateTtl(cosc.column);
             validateColumnPath(metadata, new 
ColumnPath(metadata.cfName).setSuper_column((ByteBuffer)null).setColumn(cosc.column.name));
-            validateColumnData(metadata, cosc.column);
+            validateColumnData(metadata, cosc.column, false);
         }
 
         if (cosc.super_column != null)
@@ -296,7 +301,7 @@ public class ThriftValidation
             for (Column c : cosc.super_column.columns)
             {
                 validateColumnPath(metadata, new 
ColumnPath(metadata.cfName).setSuper_column(cosc.super_column.name).setColumn(c.name));
-                validateColumnData(metadata, c);
+                validateColumnData(metadata, c, true);
             }
         }
 
@@ -396,9 +401,9 @@ public class ThriftValidation
     }
 
     /**
-     * Validates the data part of the column (everything in the Column object 
but the name)
+     * Validates the data part of the column (everything in the Column object 
but the name, which is assumed to be valid)
      */
-    public static void validateColumnData(CFMetaData metadata, Column column) 
throws InvalidRequestException
+    public static void validateColumnData(CFMetaData metadata, Column column, 
boolean isSubColumn) throws InvalidRequestException
     {
         validateTtl(column);
         if (!column.isSetValue())
@@ -413,15 +418,29 @@ public class ThriftValidation
         }
         catch (MarshalException me)
         {
-            throw new InvalidRequestException(String.format("[%s][%s][%s] = 
[%s] failed validation (%s)",
+            if (logger.isDebugEnabled())
+                logger.debug("rejecting invalid value " + 
ByteBufferUtil.bytesToHex(summarize(column.value)));
+            throw new InvalidRequestException(String.format("(%s) [%s][%s][%s] 
failed validation",
+                                                            me.getMessage(),
                                                             metadata.ksName,
                                                             metadata.cfName,
-                                                            
ByteBufferUtil.bytesToHex(column.name),
-                                                            
ByteBufferUtil.bytesToHex(column.value),
-                                                            me.getMessage()));
+                                                            (isSubColumn ? 
metadata.subcolumnComparator : metadata.comparator).getString(column.name)));
         }
     }
 
+    /**
+     * Return, at most, the first 64K of the buffer. This avoids very large 
column values being
+     * logged in their entirety.
+     */
+    private static ByteBuffer summarize(ByteBuffer buffer)
+    {
+        int MAX = Short.MAX_VALUE;
+        if (buffer.remaining() <= MAX)
+            return buffer;
+        return (ByteBuffer) buffer.slice().limit(buffer.position() + MAX);
+    }
+
+
     public static void validatePredicate(CFMetaData metadata, ColumnParent 
column_parent, SlicePredicate predicate)
             throws InvalidRequestException
     {


Reply via email to