[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