[infinispan-commits] Infinispan SVN: r1262 - in trunk/server/memcached/src: test/java/org/infinispan/server/memcached and 1 other directory.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Mon Dec 7 13:22:16 EST 2009
Author: galder.zamarreno at jboss.com
Date: 2009-12-07 13:22:16 -0500 (Mon, 07 Dec 2009)
New Revision: 1262
Modified:
trunk/server/memcached/src/main/java/org/infinispan/server/memcached/AddCommand.java
trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CasCommand.java
trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandFactory.java
trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandType.java
trunk/server/memcached/src/main/java/org/infinispan/server/memcached/GetsCommand.java
trunk/server/memcached/src/main/java/org/infinispan/server/memcached/ReplaceCommand.java
trunk/server/memcached/src/main/java/org/infinispan/server/memcached/StorageReply.java
trunk/server/memcached/src/test/java/org/infinispan/server/memcached/FunctionalTest.java
Log:
[ISPN-173] (Build memcached server module) Implemented cas storage operation and corresponding tested EXISTS and NOT_FOUND responses.
Modified: trunk/server/memcached/src/main/java/org/infinispan/server/memcached/AddCommand.java
===================================================================
--- trunk/server/memcached/src/main/java/org/infinispan/server/memcached/AddCommand.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/main/java/org/infinispan/server/memcached/AddCommand.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -39,11 +39,6 @@
}
@Override
- protected StorageReply put(String key, int flags, byte[] data) {
- return put(key, flags, data, -1);
- }
-
- @Override
protected StorageReply put(String key, int flags, byte[] data, long expiry) {
Value value = new Value(flags, data);
Object prev = cache.putIfAbsent(key, value, expiry, TimeUnit.MILLISECONDS);
Modified: trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CasCommand.java
===================================================================
--- trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CasCommand.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CasCommand.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -22,24 +22,48 @@
*/
package org.infinispan.server.memcached;
+import java.io.IOException;
+
+import org.infinispan.Cache;
+
/**
* CasCommand.
*
* @author Galder Zamarreño
* @since 4.0
*/
-public class CasCommand /* extends StorageCommand */ {
-// final long unique;
-//
-// CasCommand(String key, int flags, long expiry, int bytes, long unique) {
-// super(CommandType.CAS, key, flags, expiry, bytes);
-// this.unique = unique;
-// }
-//
-// @Override
-// public Object perform() throws Throwable {
-// throw new org.jboss.util.NotImplementedException("FIXME NYI perform");
-// return null;
-// }
+public class CasCommand extends SetCommand {
+ final long cas;
+ CasCommand(Cache cache, StorageParameters params, long cas, byte[] data) {
+ super(cache, CommandType.CAS, params, data);
+ this.cas = cas;
+ }
+
+ @Override
+ public Command setData(byte[] data) throws IOException {
+ return newCasCommand(cache, params, cas, data);
+ }
+
+ @Override
+ protected StorageReply put(String key, int flags, byte[] data, long expiry) {
+ Value old = (Value) cache.get(key);
+ if (old != null) {
+ if (old.getCas() == cas) {
+ Value value = new Value(flags, data);
+ boolean replaced = cache.replace(key, old, value);
+ if (replaced)
+ return StorageReply.STORED;
+ else
+ return StorageReply.EXISTS;
+ } else {
+ return StorageReply.EXISTS;
+ }
+ }
+ return StorageReply.NOT_FOUND;
+ }
+
+ public static CasCommand newCasCommand(Cache cache, StorageParameters params, long cas, byte[] data) {
+ return new CasCommand(cache, params, cas, data);
+ }
}
Modified: trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandFactory.java
===================================================================
--- trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandFactory.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandFactory.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -81,13 +81,15 @@
if(tmp == null) throw new EOFException();
int bytes = Integer.parseInt(tmp);
-// if (type == CommandType.CAS) {
-// tmp = args[5]; // cas unique, 64-bit integer
-// long unique = Long.parseLong(tmp);
-// return type.buildCasCommand(key, flags, expiry, bytes, unique);
-// }
+ StorageParameters storage = new StorageParameters(key, flags, expiry, bytes);
- return StorageCommand.newStorageCommand(cache, type, new StorageParameters(key, flags, expiry, bytes), null);
+ if (type == CommandType.CAS) {
+ tmp = args[5]; // cas unique, 64-bit integer
+ long cas = Long.parseLong(tmp);
+ return CasCommand.newCasCommand(cache, storage, cas, null);
+ }
+
+ return StorageCommand.newStorageCommand(cache, type, storage, null);
case GET:
case GETS:
List<String> keys = new ArrayList<String>(5);
Modified: trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandType.java
===================================================================
--- trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandType.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/main/java/org/infinispan/server/memcached/CommandType.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -49,6 +49,7 @@
case REPLACE:
case APPEND:
case PREPEND:
+ case CAS:
return true;
default:
return false;
Modified: trunk/server/memcached/src/main/java/org/infinispan/server/memcached/GetsCommand.java
===================================================================
--- trunk/server/memcached/src/main/java/org/infinispan/server/memcached/GetsCommand.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/main/java/org/infinispan/server/memcached/GetsCommand.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -38,8 +38,7 @@
@Override
protected StringBuilder constructValue(String key, Value value) {
- return super.constructValue(key, value)
- .append(value.getCas()).append(" ");
+ return super.constructValue(key, value).append(value.getCas()).append(" ");
}
}
Modified: trunk/server/memcached/src/main/java/org/infinispan/server/memcached/ReplaceCommand.java
===================================================================
--- trunk/server/memcached/src/main/java/org/infinispan/server/memcached/ReplaceCommand.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/main/java/org/infinispan/server/memcached/ReplaceCommand.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -39,11 +39,6 @@
}
@Override
- protected StorageReply put(String key, int flags, byte[] data) {
- return put(key, flags, data, -1);
- }
-
- @Override
protected StorageReply put(String key, int flags, byte[] data, long expiry) {
Value value = new Value(flags, data);
Object prev = cache.replace(params.key, value, expiry, TimeUnit.MILLISECONDS);
Modified: trunk/server/memcached/src/main/java/org/infinispan/server/memcached/StorageReply.java
===================================================================
--- trunk/server/memcached/src/main/java/org/infinispan/server/memcached/StorageReply.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/main/java/org/infinispan/server/memcached/StorageReply.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -29,10 +29,7 @@
* @since 4.0
*/
public enum StorageReply {
- STORED, NOT_STORED, EXISTS, NOT_FOUND;
-
-// @Override
-// public String toString() {
-// return super.toString() + "\r\n";
-// }
+ STORED, NOT_STORED,
+ EXISTS, NOT_FOUND // replies only valid for cas
+ ;
}
Modified: trunk/server/memcached/src/test/java/org/infinispan/server/memcached/FunctionalTest.java
===================================================================
--- trunk/server/memcached/src/test/java/org/infinispan/server/memcached/FunctionalTest.java 2009-12-07 14:47:09 UTC (rev 1261)
+++ trunk/server/memcached/src/test/java/org/infinispan/server/memcached/FunctionalTest.java 2009-12-07 18:22:16 UTC (rev 1262)
@@ -58,7 +58,8 @@
DefaultConnectionFactory d = new DefaultConnectionFactory() {
@Override
public long getOperationTimeout() {
- return 5000;
+ return 360000;
+ // return 5000;
}
};
@@ -213,12 +214,44 @@
public void testBasicCas(Method m) throws Exception {
Future<Boolean> f = client.set(k(m), 0, v(m));
+ assert f.get(5, TimeUnit.MINUTES);
+ CASValue<Object> value = client.gets(k(m));
+ assert v(m).equals(value.getValue());
+ assert value.getCas() != 0;
+
+ CASResponse resp = client.cas(k(m), value.getCas(), v(m, "v1-"));
+ assert CASResponse.OK == resp;
+ }
+
+ public void testCasNotFound(Method m) throws Exception {
+ Future<Boolean> f = client.set(k(m), 0, v(m));
+ assert f.get(5, TimeUnit.MINUTES);
+ CASValue<Object> value = client.gets(k(m));
+ assert v(m).equals(value.getValue());
+ assert value.getCas() != 0;
+
+ CASResponse resp = client.cas(k(m, "k1-"), value.getCas(), v(m, "v1-"));
+ assert CASResponse.NOT_FOUND == resp;
+ }
+
+ public void testCasExists(Method m) throws Exception {
+ Future<Boolean> f = client.set(k(m), 0, v(m));
assert f.get(5, TimeUnit.SECONDS);
CASValue<Object> value = client.gets(k(m));
assert v(m).equals(value.getValue());
assert value.getCas() != 0;
- CASResponse resp = client.cas(k(m), value.getCas(), v(m, "k1-"));
+ long old = value.getCas();
+ CASResponse resp = client.cas(k(m), value.getCas(), v(m, "v1-"));
+ value = client.gets(k(m));
+ assert v(m, "v1-").equals(value.getValue());
+ assert value.getCas() != 0;
+ assert value.getCas() != old;
+
+ resp = client.cas(k(m), old, v(m, "v2-"));
+ assert CASResponse.EXISTS == resp;
+
+ resp = client.cas(k(m), value.getCas(), v(m, "v2-"));
assert CASResponse.OK == resp;
}
More information about the infinispan-commits
mailing list