[infinispan-commits] Infinispan SVN: r2665 - in branches/4.2.x: server/memcached/src/main/scala/org/infinispan/server/memcached and 1 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Thu Nov 4 06:36:24 EDT 2010


Author: galder.zamarreno at jboss.com
Date: 2010-11-04 06:36:24 -0400 (Thu, 04 Nov 2010)
New Revision: 2665

Modified:
   branches/4.2.x/core/src/test/java/org/infinispan/test/TestingUtil.java
   branches/4.2.x/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala
   branches/4.2.x/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala
Log:
ISPN-746 - In Memcached, implement 250 character key check - Added check and fixed server side client error reporting

Modified: branches/4.2.x/core/src/test/java/org/infinispan/test/TestingUtil.java
===================================================================
--- branches/4.2.x/core/src/test/java/org/infinispan/test/TestingUtil.java	2010-11-03 16:56:10 UTC (rev 2664)
+++ branches/4.2.x/core/src/test/java/org/infinispan/test/TestingUtil.java	2010-11-04 10:36:24 UTC (rev 2665)
@@ -906,4 +906,11 @@
             + ",name=" + ObjectName.quote(cacheName) + ",component=" + component);
    }
 
+   public static String generateRandomString(int numberOfChars) {
+      Random r = new Random(System.currentTimeMillis());
+      StringBuilder sb = new StringBuilder();
+      for (int i = 0; i < numberOfChars; i++) sb.append((char) (64 + r.nextInt(26)));
+      return sb.toString();
+   }
+
 }

Modified: branches/4.2.x/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala
===================================================================
--- branches/4.2.x/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala	2010-11-03 16:56:10 UTC (rev 2664)
+++ branches/4.2.x/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala	2010-11-04 10:36:24 UTC (rev 2665)
@@ -49,7 +49,10 @@
       new RequestHeader(op.get)
    }
 
-   override def readKey(h: RequestHeader, b: ChannelBuffer): String = readElement(b)
+   override def readKey(h: RequestHeader, b: ChannelBuffer): String = {
+      val k = readElement(b)
+      if (k.length > 250) throw new ServerException(h, new IOException("Key length over the 250 character limit")) else k
+   }
 
    private def readKeys(h: RequestHeader, b: ChannelBuffer): Array[String] = {
       val line = readLine(b)
@@ -302,11 +305,12 @@
       val sb = new StringBuilder
       t match {
          case se: ServerException => {
-            se.getCause match {
+            val cause = se.getCause
+            cause match {
                case u: UnknownOperationException => ERROR
                case c: ClosedChannelException => null // no-op, only log
                case _ => {
-                  t match {
+                  cause match {
                      case i: IOException => sb.append("CLIENT_ERROR ")
                      case _ => sb.append("SERVER_ERROR ")
                   }

Modified: branches/4.2.x/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala
===================================================================
--- branches/4.2.x/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala	2010-11-03 16:56:10 UTC (rev 2664)
+++ branches/4.2.x/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala	2010-11-04 10:36:24 UTC (rev 2665)
@@ -5,7 +5,7 @@
 import org.testng.Assert._
 import org.testng.annotations.Test
 import net.spy.memcached.CASResponse
-import org.infinispan.test.TestingUtil
+import org.infinispan.test.TestingUtil._
 import org.infinispan.Version
 import java.net.Socket
 
@@ -27,7 +27,7 @@
    def testSetWithExpirySeconds(m: Method) {
       val f = client.set(k(m), 1, v(m))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
-      TestingUtil.sleepThread(1100)
+      sleepThread(1100)
       assertNull(client.get(k(m)))
    }
 
@@ -35,14 +35,14 @@
       val future = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis + 1000).asInstanceOf[Int]
       val f = client.set(k(m), future, v(m))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
-      TestingUtil.sleepThread(1100)
+      sleepThread(1100)
       assertNull(client.get(k(m)))
    }
 
    def testSetWithExpiryUnixTimeInPast(m: Method) {
       val f = client.set(k(m), 60*60*24*30 + 1, v(m))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
-      TestingUtil.sleepThread(1100)
+      sleepThread(1100)
       assertNull(client.get(k(m)))
    }
 
@@ -67,7 +67,7 @@
    def testAddWithExpirySeconds(m: Method) {
       var f = client.add(k(m), 1, v(m))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
-      TestingUtil.sleepThread(1100)
+      sleepThread(1100)
       assertNull(client.get(k(m)))
       f = client.add(k(m), 0, v(m, "v1-"))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
@@ -78,7 +78,7 @@
       val future = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis + 1000).asInstanceOf[Int]
       var f = client.add(k(m), future, v(m))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
-      TestingUtil.sleepThread(1100)
+      sleepThread(1100)
       assertNull(client.get(k(m)))
       f = client.add(k(m), 0, v(m, "v1-"))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
@@ -110,7 +110,7 @@
       val f = client.replace(k(m), 1, v(m, "v1-"))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
       assertEquals(client.get(k(m)), v(m, "v1-"))
-      TestingUtil.sleepThread(1100)
+      sleepThread(1100)
       assertNull(client.get(k(m)))
    }
 
@@ -120,7 +120,7 @@
       val f = client.replace(k(m), future, v(m, "v1-"))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
       assertEquals(client.get(k(m)), v(m, "v1-"))
-      TestingUtil.sleepThread(1100)
+      sleepThread(1100)
       assertNull(client.get(k(m)))
    }
 
@@ -263,21 +263,6 @@
       assertEquals(newValue, "0")
    }
 
-   private def incr(m: Method, by: Int, expectedLength: Int): String = {
-      // Spymemcached expects Long so does not support 64-bit unsigned integer. Instead, do things manually.
-      val req = "incr " + k(m) + " " + by + "\r\n"
-      val socket = new Socket(server.getHost, server.getPort)
-      try {
-         socket.getOutputStream.write(req.getBytes)
-         // Make the array big enough to read the data but ignore the trailing carriage return
-         val resp = new Array[Byte](expectedLength)
-         socket.getInputStream.read(resp)
-         return new String(resp)
-      } finally {
-         socket.close
-      }
-   }
-
    def testDecrementBasic(m: Method) {
       var f = client.set(k(m), 0, "1")
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
@@ -333,7 +318,7 @@
       val f = client.flush(2);
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
 
-      TestingUtil.sleepThread(2200);
+      sleepThread(2200);
 
       for (i <- 1 to 5) {
          val key = k(m, "k" + i + "-");
@@ -348,10 +333,43 @@
       assertEquals(version, Version.version)
    }
 
+   def testKeyLengthLimit(m: Method) {
+      val keyUnderLimit = generateRandomString(249)
+      var f = client.set(keyUnderLimit, 0, "78")
+      assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
+      assertEquals(client.get(keyUnderLimit), "78")
+
+      val keyInLimit = generateRandomString(250)
+      f = client.set(keyInLimit, 0, "89")
+      assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
+      assertEquals(client.get(keyInLimit), "89")
+
+      val keyAboveLimit = generateRandomString(251)
+      val resp = incr(keyAboveLimit, 1, 1024)
+      assertTrue(resp.contains("CLIENT_ERROR"))
+   }
+
    private def addAndGet(m: Method) {
       val f = client.add(k(m), 0, v(m))
       assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
       assertEquals(client.get(k(m)), v(m))
    }
 
+   private def incr(m: Method, by: Int, expectedLength: Int): String = incr(k(m), by, expectedLength)
+
+   private def incr(k: String, by: Int, expectedLength: Int): String = {
+      // Spymemcached expects Long so does not support 64-bit unsigned integer. Instead, do things manually.
+      val req = "incr " + k + " " + by + "\r\n"
+      val socket = new Socket(server.getHost, server.getPort)
+      try {
+         socket.getOutputStream.write(req.getBytes)
+         // Make the array big enough to read the data but ignore the trailing carriage return
+         val resp = new Array[Byte](expectedLength)
+         socket.getInputStream.read(resp)
+         return new String(resp)
+      } finally {
+         socket.close
+      }
+   }
+
 }
\ No newline at end of file



More information about the infinispan-commits mailing list