[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