[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