[infinispan-commits] Infinispan SVN: r2668 - in trunk/server/memcached/src: test/scala/org/infinispan/server/memcached and 1 other directory.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Thu Nov 4 07:02:04 EDT 2010


Author: galder.zamarreno at jboss.com
Date: 2010-11-04 07:02:04 -0400 (Thu, 04 Nov 2010)
New Revision: 2668

Modified:
   trunk/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala
   trunk/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala
Log:
ISPN-743 - memcached server incr/decr doesn't work in unsigned 64bit integer mode - Merged from 4.2.x (rev 2628)

Modified: trunk/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala
===================================================================
--- trunk/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala	2010-11-04 11:00:07 UTC (rev 2667)
+++ trunk/server/memcached/src/main/scala/org/infinispan/server/memcached/MemcachedDecoder.scala	2010-11-04 11:02:04 UTC (rev 2668)
@@ -196,12 +196,15 @@
             val params = readParameters(h, b)
             val prev = cache.get(k)
             if (prev != null) {
-               val prevCounter = new String(prev.data)
+               val prevCounter = BigInt(new String(prev.data))
                val newCounter =
                   h.op match {
-                     case IncrementRequest => prevCounter.toLong + params.get.delta.toLong
+                     case IncrementRequest => {
+                        val candidateCounter = prevCounter + BigInt(params.get.delta)
+                        if (candidateCounter > BigInt("18446744073709551615")) 0 else candidateCounter
+                     }
                      case DecrementRequest => {
-                        val candidateCounter = prevCounter.toLong - params.get.delta.toLong
+                        val candidateCounter = prevCounter - BigInt(params.get.delta)
                         if (candidateCounter < 0) 0 else candidateCounter
                      }
                   }

Modified: trunk/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala
===================================================================
--- trunk/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala	2010-11-04 11:00:07 UTC (rev 2667)
+++ trunk/server/memcached/src/test/scala/org/infinispan/server/memcached/MemcachedFunctionalTest.scala	2010-11-04 11:02:04 UTC (rev 2668)
@@ -7,6 +7,7 @@
 import net.spy.memcached.CASResponse
 import org.infinispan.test.TestingUtil
 import org.infinispan.Version
+import java.net.Socket
 
 /**
  * Tests Memcached protocol functionality against Infinispan Memcached server.
@@ -234,6 +235,42 @@
       assertEquals(newValue, Int.MaxValue.asInstanceOf[Long] + 1)
    }
 
+   def testIncrementBeyondLongMax(m: Method) {
+      val f = client.set(k(m), 0, "9223372036854775808")
+      assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
+      val newValue = incr(m, 1, 19)
+      assertEquals(BigInt(newValue), BigInt("9223372036854775809"))
+   }
+
+   def testIncrementSurpassLongMax(m: Method) {
+      val f = client.set(k(m), 0, "9223372036854775807")
+      assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
+      val newValue = incr(m, 1, 19)
+      assertEquals(BigInt(newValue), BigInt("9223372036854775808"))
+   }
+
+   def testIncrementSurpassBigIntMax(m: Method) {
+      val f = client.set(k(m), 0, "18446744073709551615")
+      assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
+      val newValue = incr(m, 1, 1)
+      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)



More information about the infinispan-commits mailing list