You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2016/03/04 18:30:13 UTC

[01/14] incubator-geode git commit: GEODE-1014: PdxSerializationException Error when putall an object from native client withSecurity enabled

Repository: incubator-geode
Updated Branches:
  refs/heads/feature/GEODE-949-2 5f18b9d30 -> f00184c04


GEODE-1014: PdxSerializationException Error when putall an object from
native client withSecurity enabled


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/aa92530d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/aa92530d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/aa92530d

Branch: refs/heads/feature/GEODE-949-2
Commit: aa92530d386096feb4ac540c1da240d18f612d42
Parents: b4ed2aa
Author: Jianxia Chen <jc...@pivotal.io>
Authored: Mon Feb 29 17:51:22 2016 -0800
Committer: Jianxia Chen <jc...@pivotal.io>
Committed: Mon Feb 29 17:51:22 2016 -0800

----------------------------------------------------------------------
 .../operations/PutAllOperationContext.java      | 275 +----------------
 .../operations/internal/UpdateOnlyMap.java      | 304 +++++++++++++++++++
 .../cache/tier/sockets/command/PutAll.java      |   4 +
 .../cache/tier/sockets/command/PutAll70.java    |   4 +
 .../cache/tier/sockets/command/PutAll80.java    |   4 +
 .../security/ClientAuthorizationDUnitTest.java  |  29 ++
 .../gemfire/security/SecurityTestUtil.java      |  44 +++
 .../gemfire/codeAnalysis/excludedClasses.txt    |   1 +
 8 files changed, 391 insertions(+), 274 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/PutAllOperationContext.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/PutAllOperationContext.java b/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/PutAllOperationContext.java
index b05216b..cc648f7 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/PutAllOperationContext.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/PutAllOperationContext.java
@@ -17,20 +17,10 @@
 
 package com.gemstone.gemfire.cache.operations;
 
-import java.io.Serializable;
-import java.util.AbstractCollection;
-import java.util.AbstractSet;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.Map.Entry;
 
 import com.gemstone.gemfire.cache.operations.OperationContext;
-import com.gemstone.gemfire.internal.cache.CachedDeserializable;
-import com.gemstone.gemfire.internal.cache.Token;
+import com.gemstone.gemfire.cache.operations.internal.UpdateOnlyMap;
 
 /**
  * Encapsulates a {@link com.gemstone.gemfire.cache.operations.OperationContext.OperationCode#PUTALL} operation for both the
@@ -141,267 +131,4 @@ public class PutAllOperationContext extends OperationContext {
   public void setCallbackArg(Object callbackArg) {
     this.callbackArg = callbackArg;
   }
-  
-  /**
-   * This map only allows updates. No creates or removes.
-   * It was adapted from UnmodifiableMap in the jdk's Collections class.
-   * It was added to fix bug 51604.
-   * It also make sure that customers do not see Token.INVALID and
-   * CachedDeserializable to fix bug 51625.
-   * @author dschneider
-   */
-  private static class UpdateOnlyMap implements Map, Serializable {
-    private static final long serialVersionUID = -1034234728574286014L;
-
-    private final Map m;
-
-    UpdateOnlyMap(Map m) {
-      if (m==null) {
-        throw new NullPointerException();
-      }
-      this.m = m;
-    }
-
-    public int size()                        {return m.size();}
-    public boolean isEmpty()                 {return m.isEmpty();}
-    public boolean containsKey(Object key)   {return m.containsKey(key);}
-    public boolean containsValue(Object val) {
-      return values().contains(val);
-    }
-    public Object get(Object key) {
-      return exportValue(m.get(key));
-    }
-    
-    private static Object exportValue(Object v) {
-      Object result;
-      if (v == Token.INVALID) {
-        result = null;
-      } else if (v instanceof CachedDeserializable) {
-        result = ((CachedDeserializable) v).getDeserializedForReading();
-      } else {
-        result = v;
-      }
-      return result;
-    }
-
-    public Object put(Object key, Object value) {
-      if (containsKey(key)) {
-        return m.put(key,  value);
-      } else {
-        throw new UnsupportedOperationException("can not add the key \"" + key + "\"");
-      }
-    }
-    public void putAll(Map m) {
-      if (m != null) {
-        for (Object i: m.entrySet()) {
-          Map.Entry me = (Map.Entry) i;
-          put(me.getKey(), me.getValue());
-        }
-      }
-    }
-    public Object remove(Object key) {
-        throw new UnsupportedOperationException();
-    }
-    public void clear() {
-        throw new UnsupportedOperationException();
-    }
-
-    private transient Set keySet = null;
-    private transient Set entrySet = null;
-    private transient Collection values = null;
-
-    public Set keySet() {
-      if (keySet==null) {
-        keySet = Collections.unmodifiableSet(m.keySet());
-      }
-      return keySet;
-    }
-
-    public Set entrySet() {
-      if (entrySet==null) {
-        entrySet = Collections.unmodifiableSet(new EntrySet());
-      }
-      return entrySet;
-    }
-
-    private final class EntrySet extends AbstractSet {
-      public Iterator iterator() {
-          return new EntryIterator();
-      }
-      @Override
-      public int size() {
-          return m.size();
-      }
-    }
-    private class EntryIterator implements Iterator {
-      private Iterator mIterator = m.entrySet().iterator();
-
-      @Override
-      public boolean hasNext() {
-          return this.mIterator.hasNext();
-      }
-
-      @Override
-      public Object next() {
-        Entry me = (Entry) this.mIterator.next();
-        return new ExportableEntry(me);
-      }
-
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException();
-      }
-    }
-    private static class ExportableEntry implements Map.Entry {
-      private final Map.Entry e;
-
-      ExportableEntry(Map.Entry e) {
-        this.e = e;
-      }
-      public Object getKey() {
-        return this.e.getKey();
-      }
-      public Object getValue() {
-        return exportValue(this.e.getValue());
-      }
-      public Object setValue(Object value) {
-        return exportValue(this.e.setValue(value));
-      }
-      public int hashCode() {
-        return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
-      }
-      public boolean equals(Object o) {
-        if (this == o) {
-          return true;
-        }
-        if (!(o instanceof Map.Entry)) {
-          return false;
-        }
-        Entry other = (Entry) o;
-        return eq(getKey(), other.getKey()) && eq(getValue(), other.getValue());
-      }
-      public String toString() {
-        return getKey() + "=" + getValue();
-      }
-    }
-    private static boolean eq(Object o1, Object o2) {
-      return o1==null ? o2==null : o1.equals(o2);
-    }
-    
-    public Collection values() {
-      if (values==null) {
-        values = Collections.unmodifiableCollection(new Values());
-      }
-      return values;
-    }
-    
-    private final class Values extends AbstractCollection {
-      @Override
-      public Iterator iterator() {
-        return new ValueIterator();
-      }
-      @Override
-      public int size() {
-        return m.size();
-      }
-    }
-    private class ValueIterator implements Iterator {
-      private Iterator mIterator = m.values().iterator();
-
-      @Override
-      public boolean hasNext() {
-          return this.mIterator.hasNext();
-      }
-
-      @Override
-      public Object next() {
-        return exportValue(this.mIterator.next());
-      }
-
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException();
-      }
-    }
-
-    
-    /**
-     * equals is over-ridden to make sure it is based on
-     * the objects we expose and not the internal CachedDeserializables.
-     */
-    @Override
-    public boolean equals(Object o) {
-      if (o == this) {
-        return true;
-      }
-
-      if (!(o instanceof Map)) {
-        return false;
-      }
-      Map m = (Map) o;
-      if (m.size() != size()) {
-        return false;
-      }
-
-      try {
-        Iterator<Entry> i = entrySet().iterator();
-        while (i.hasNext()) {
-          Entry e = i.next();
-          Object key = e.getKey();
-          Object value = e.getValue();
-          if (value == null) {
-            if (!(m.get(key)==null && m.containsKey(key))) {
-              return false;
-            }
-          } else {
-            if (!value.equals(m.get(key))) {
-              return false;
-            }
-          }
-        }
-      } catch (ClassCastException unused) {
-        return false;
-      } catch (NullPointerException unused) {
-        return false;
-      }
-
-      return true;
-  }
-
-  /**
-   * hashCode is over-ridden to make sure it is based on
-   * the objects we expose and not the internal CachedDeserializables.
-   */
-  @Override
-  public int hashCode() {
-    int h = 0;
-    Iterator<Entry> i = entrySet().iterator();
-    while (i.hasNext()) {
-      h += i.next().hashCode();
-    }
-    return h;
-  }
-
-    @Override
-    public String toString() {
-      Iterator<Entry> i = entrySet().iterator();
-      if (! i.hasNext()) {
-        return "{}";
-      }
-      StringBuilder sb = new StringBuilder();
-      sb.append('{');
-      for (;;) {
-        Entry e = i.next();
-        Object key = e.getKey();
-        Object value = e.getValue();
-        sb.append(key   == this ? "(this Map)" : key);
-        sb.append('=');
-        sb.append(value == this ? "(this Map)" : value);
-        if (! i.hasNext()) {
-          return sb.append('}').toString();
-        }
-        sb.append(',').append(' ');
-      }
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/internal/UpdateOnlyMap.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/internal/UpdateOnlyMap.java b/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/internal/UpdateOnlyMap.java
new file mode 100644
index 0000000..8063841
--- /dev/null
+++ b/geode-core/src/main/java/com/gemstone/gemfire/cache/operations/internal/UpdateOnlyMap.java
@@ -0,0 +1,304 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gemstone.gemfire.cache.operations.internal;
+
+import java.io.Serializable;
+
+import java.util.AbstractCollection;
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import com.gemstone.gemfire.internal.cache.CachedDeserializable;
+import com.gemstone.gemfire.internal.cache.Token;
+
+/**
+ * This map only allows updates. No creates or removes.
+ * It was adapted from UnmodifiableMap in the jdk's Collections class.
+ * It was added to fix bug 51604.
+ * It also make sure that customers do not see Token.INVALID and
+ * CachedDeserializable to fix bug 51625.
+ * @author dschneider
+ */
+public class UpdateOnlyMap implements Map, Serializable {
+  private static final long serialVersionUID = -1034234728574286014L;
+
+  private final Map m;
+
+  public UpdateOnlyMap(Map m) {
+    if (m==null) {
+      throw new NullPointerException();
+    }
+    this.m = m;
+  }
+
+  /**
+   * Only called by internal code
+   * to bypass exportValue() method
+   * @return internal map
+   */
+  public Map getInternalMap() {
+    return this.m;
+  }
+  
+  public int size()                        {return m.size();}
+  public boolean isEmpty()                 {return m.isEmpty();}
+  public boolean containsKey(Object key)   {return m.containsKey(key);}
+  public boolean containsValue(Object val) {
+    return values().contains(val);
+  }
+  public Object get(Object key) {
+    return exportValue(m.get(key));
+  }
+  
+  private static Object exportValue(Object v) {
+    Object result;
+    if (v == Token.INVALID) {
+      result = null;
+    } else if (v instanceof CachedDeserializable) {
+      result = ((CachedDeserializable) v).getDeserializedForReading();
+    } else {
+      result = v;
+    }
+    return result;
+  }
+
+  public Object put(Object key, Object value) {
+    if (containsKey(key)) {
+      return m.put(key,  value);
+    } else {
+      throw new UnsupportedOperationException("can not add the key \"" + key + "\"");
+    }
+  }
+  public void putAll(Map m) {
+    if (m != null) {
+      for (Object i: m.entrySet()) {
+        Map.Entry me = (Map.Entry) i;
+        put(me.getKey(), me.getValue());
+      }
+    }
+  }
+  public Object remove(Object key) {
+      throw new UnsupportedOperationException();
+  }
+  public void clear() {
+      throw new UnsupportedOperationException();
+  }
+
+  private transient Set keySet = null;
+  private transient Set entrySet = null;
+  private transient Collection values = null;
+
+  public Set keySet() {
+    if (keySet==null) {
+      keySet = Collections.unmodifiableSet(m.keySet());
+    }
+    return keySet;
+  }
+
+  public Set entrySet() {
+    if (entrySet==null) {
+      entrySet = Collections.unmodifiableSet(new EntrySet());
+    }
+    return entrySet;
+  }
+
+  private final class EntrySet extends AbstractSet {
+    public Iterator iterator() {
+        return new EntryIterator();
+    }
+    @Override
+    public int size() {
+        return m.size();
+    }
+  }
+  private class EntryIterator implements Iterator {
+    private Iterator mIterator = m.entrySet().iterator();
+
+    @Override
+    public boolean hasNext() {
+        return this.mIterator.hasNext();
+    }
+
+    @Override
+    public Object next() {
+      Entry me = (Entry) this.mIterator.next();
+      return new ExportableEntry(me);
+    }
+
+    @Override
+    public void remove() {
+      throw new UnsupportedOperationException();
+    }
+  }
+  private static class ExportableEntry implements Map.Entry {
+    private final Map.Entry e;
+
+    ExportableEntry(Map.Entry e) {
+      this.e = e;
+    }
+    public Object getKey() {
+      return this.e.getKey();
+    }
+    public Object getValue() {
+      return exportValue(this.e.getValue());
+    }
+    public Object setValue(Object value) {
+      return exportValue(this.e.setValue(value));
+    }
+    public int hashCode() {
+      return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
+    }
+    public boolean equals(Object o) {
+      if (this == o) {
+        return true;
+      }
+      if (!(o instanceof Map.Entry)) {
+        return false;
+      }
+      Entry other = (Entry) o;
+      return eq(getKey(), other.getKey()) && eq(getValue(), other.getValue());
+    }
+    public String toString() {
+      return getKey() + "=" + getValue();
+    }
+  }
+  private static boolean eq(Object o1, Object o2) {
+    return o1==null ? o2==null : o1.equals(o2);
+  }
+  
+  public Collection values() {
+    if (values==null) {
+      values = Collections.unmodifiableCollection(new Values());
+    }
+    return values;
+  }
+  
+  private final class Values extends AbstractCollection {
+    @Override
+    public Iterator iterator() {
+      return new ValueIterator();
+    }
+    @Override
+    public int size() {
+      return m.size();
+    }
+  }
+  private class ValueIterator implements Iterator {
+    private Iterator mIterator = m.values().iterator();
+
+    @Override
+    public boolean hasNext() {
+        return this.mIterator.hasNext();
+    }
+
+    @Override
+    public Object next() {
+      return exportValue(this.mIterator.next());
+    }
+
+    @Override
+    public void remove() {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  
+  /**
+   * equals is over-ridden to make sure it is based on
+   * the objects we expose and not the internal CachedDeserializables.
+   */
+  @Override
+  public boolean equals(Object o) {
+    if (o == this) {
+      return true;
+    }
+
+    if (!(o instanceof Map)) {
+      return false;
+    }
+    Map m = (Map) o;
+    if (m.size() != size()) {
+      return false;
+    }
+
+    try {
+      Iterator<Entry> i = entrySet().iterator();
+      while (i.hasNext()) {
+        Entry e = i.next();
+        Object key = e.getKey();
+        Object value = e.getValue();
+        if (value == null) {
+          if (!(m.get(key)==null && m.containsKey(key))) {
+            return false;
+          }
+        } else {
+          if (!value.equals(m.get(key))) {
+            return false;
+          }
+        }
+      }
+    } catch (ClassCastException unused) {
+      return false;
+    } catch (NullPointerException unused) {
+      return false;
+    }
+
+    return true;
+}
+
+/**
+ * hashCode is over-ridden to make sure it is based on
+ * the objects we expose and not the internal CachedDeserializables.
+ */
+@Override
+public int hashCode() {
+  int h = 0;
+  Iterator<Entry> i = entrySet().iterator();
+  while (i.hasNext()) {
+    h += i.next().hashCode();
+  }
+  return h;
+}
+
+  @Override
+  public String toString() {
+    Iterator<Entry> i = entrySet().iterator();
+    if (! i.hasNext()) {
+      return "{}";
+    }
+    StringBuilder sb = new StringBuilder();
+    sb.append('{');
+    for (;;) {
+      Entry e = i.next();
+      Object key = e.getKey();
+      Object value = e.getValue();
+      sb.append(key   == this ? "(this Map)" : key);
+      sb.append('=');
+      sb.append(value == this ? "(this Map)" : value);
+      if (! i.hasNext()) {
+        return sb.append('}').toString();
+      }
+      sb.append(',').append(' ');
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll.java
index 5d2f5ca..1f668e4 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll.java
@@ -37,6 +37,7 @@ import com.gemstone.gemfire.cache.DynamicRegionFactory;
 import com.gemstone.gemfire.cache.RegionDestroyedException;
 import com.gemstone.gemfire.cache.ResourceException;
 import com.gemstone.gemfire.cache.operations.PutAllOperationContext;
+import com.gemstone.gemfire.cache.operations.internal.UpdateOnlyMap;
 import com.gemstone.gemfire.distributed.internal.DistributionStats;
 
 import java.io.IOException;
@@ -189,6 +190,9 @@ public class PutAll extends BaseCommand {
           PutAllOperationContext putAllContext = authzRequest.putAllAuthorize(
               regionName, map, null);
           map = putAllContext.getMap();
+          if (map instanceof UpdateOnlyMap) {
+            map = ((UpdateOnlyMap) map).getInternalMap();
+          }
         }
       } else {
         // no auth, so update the map based on isObjectMap here

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll70.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll70.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll70.java
index 7507299..4b13ecd 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll70.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll70.java
@@ -28,6 +28,7 @@ import com.gemstone.gemfire.cache.DynamicRegionFactory;
 import com.gemstone.gemfire.cache.RegionDestroyedException;
 import com.gemstone.gemfire.cache.ResourceException;
 import com.gemstone.gemfire.cache.operations.PutAllOperationContext;
+import com.gemstone.gemfire.cache.operations.internal.UpdateOnlyMap;
 import com.gemstone.gemfire.distributed.internal.DistributionStats;
 import com.gemstone.gemfire.internal.Version;
 import com.gemstone.gemfire.internal.cache.CachedDeserializableFactory;
@@ -235,6 +236,9 @@ public class PutAll70 extends BaseCommand {
           PutAllOperationContext putAllContext = authzRequest.putAllAuthorize(
               regionName, map, null);
           map = putAllContext.getMap();
+          if (map instanceof UpdateOnlyMap) {
+            map = ((UpdateOnlyMap) map).getInternalMap();
+          }
         }
       } else {
         // no auth, so update the map based on isObjectMap here

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll80.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll80.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll80.java
index 6a2b072..4552c95 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll80.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/PutAll80.java
@@ -29,6 +29,7 @@ import com.gemstone.gemfire.cache.RegionDestroyedException;
 import com.gemstone.gemfire.cache.ResourceException;
 import com.gemstone.gemfire.cache.client.internal.PutAllOp;
 import com.gemstone.gemfire.cache.operations.PutAllOperationContext;
+import com.gemstone.gemfire.cache.operations.internal.UpdateOnlyMap;
 import com.gemstone.gemfire.distributed.internal.DistributionStats;
 import com.gemstone.gemfire.internal.cache.CachedDeserializableFactory;
 import com.gemstone.gemfire.internal.cache.EventID;
@@ -275,6 +276,9 @@ public class PutAll80 extends BaseCommand {
           PutAllOperationContext putAllContext = authzRequest.putAllAuthorize(
               regionName, map, callbackArg);
           map = putAllContext.getMap();
+          if (map instanceof UpdateOnlyMap) {
+            map = ((UpdateOnlyMap) map).getInternalMap();
+          }
           callbackArg = putAllContext.getCallbackArg();
         }
       } else {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/test/java/com/gemstone/gemfire/security/ClientAuthorizationDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/security/ClientAuthorizationDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/security/ClientAuthorizationDUnitTest.java
index 0e46da5..1d0b481 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/security/ClientAuthorizationDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/security/ClientAuthorizationDUnitTest.java
@@ -254,6 +254,35 @@ public class ClientAuthorizationDUnitTest extends ClientAuthorizationTestBase {
           new Integer(2), new Integer(SecurityTestUtil.NO_EXCEPTION) ));
   }
 
+  public void testPutAllWithSecurity() {
+    AuthzCredentialGenerator gen = getXmlAuthzGenerator();
+    CredentialGenerator cGen = gen.getCredentialGenerator();
+    Properties extraAuthProps = cGen.getSystemProperties();
+    Properties javaProps = cGen.getJavaProperties();
+    Properties extraAuthzProps = gen.getSystemProperties();
+    String authenticator = cGen.getAuthenticator();
+    String authInit = cGen.getAuthInit();
+    String accessor = gen.getAuthorizationCallback();
+
+    LogWriterUtils.getLogWriter().info("testPutAllWithSecurity: Using authinit: " + authInit);
+    LogWriterUtils.getLogWriter().info("testPutAllWithSecurity: Using authenticator: " + authenticator);
+    LogWriterUtils.getLogWriter().info("testPutAllWithSecurity: Using accessor: " + accessor);
+
+    // Start servers with all required properties
+    Properties serverProps = buildProperties(authenticator, accessor, false, extraAuthProps, extraAuthzProps);
+    Integer port1 = createServer1(javaProps, serverProps);
+    Integer port2 = createServer2(javaProps, serverProps);
+
+    // Start client1 with valid CREATE credentials
+    Properties createCredentials = gen.getAllowedCredentials(new OperationCode[] { OperationCode.PUTALL }, new String[] { regionName }, 1);
+    javaProps = cGen.getJavaProperties();
+    LogWriterUtils.getLogWriter().info("testPutAllWithSecurity: For first client credentials: " + createCredentials);
+    createClient1NoException(javaProps, authInit, port1, port2, createCredentials);
+
+    // Perform some put all operations from client1
+    client1.invoke(() -> SecurityTestUtil.doPutAllP());
+  }
+  
   protected void createClient2NoException(Properties javaProps, String authInit,
       Integer port1, Integer port2, Properties getCredentials) {
     client2.invoke(() -> ClientAuthenticationDUnitTest.createCacheClient( authInit, getCredentials, javaProps, port1, port2,

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/test/java/com/gemstone/gemfire/security/SecurityTestUtil.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/security/SecurityTestUtil.java b/geode-core/src/test/java/com/gemstone/gemfire/security/SecurityTestUtil.java
index ad9b3e1..d3c379f 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/security/SecurityTestUtil.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/security/SecurityTestUtil.java
@@ -29,6 +29,7 @@ import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -78,6 +79,9 @@ import com.gemstone.gemfire.internal.AvailablePort;
 import com.gemstone.gemfire.internal.logging.InternalLogWriter;
 import com.gemstone.gemfire.internal.logging.PureLogWriter;
 import com.gemstone.gemfire.internal.util.Callable;
+import com.gemstone.gemfire.pdx.PdxReader;
+import com.gemstone.gemfire.pdx.PdxSerializable;
+import com.gemstone.gemfire.pdx.PdxWriter;
 import com.gemstone.gemfire.test.dunit.Assert;
 import com.gemstone.gemfire.test.dunit.DistributedTestCase;
 import com.gemstone.gemfire.test.dunit.DistributedTestUtils;
@@ -831,6 +835,46 @@ public class SecurityTestUtil extends DistributedTestCase {
     }
   }
 
+  public static class Employee implements PdxSerializable
+  {
+    private Long Id;
+    private String fname;
+    private String lname;
+    
+    public Employee() {}
+    
+    public Employee(Long id, String fn, String ln){
+      this.Id = id;
+      this.fname = fn;
+      this.lname = ln;
+    }
+        
+    /**
+     * For test purpose, to make sure
+     * the object is not deserialized
+     */
+    @Override
+    public void fromData(PdxReader in) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void toData(PdxWriter out) {
+      out.writeLong("Id", Id);
+      out.writeString("fname", fname);
+      out.writeString("lname", lname);
+    }
+    
+  }
+  
+  public static void doPutAllP() throws Exception {    
+    Region region = getCache().getRegion(regionName);
+    assertNotNull(region);
+    Map map = new LinkedHashMap();
+    map.put("1010L", new Employee(1010L, "John", "Doe"));
+    region.putAll(map);
+  }
+  
   private static void doGetAllP(Integer multiUserIndex,
       Integer expectedResult, boolean useTX) {
     Region region = null;

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/aa92530d/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/excludedClasses.txt
----------------------------------------------------------------------
diff --git a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/excludedClasses.txt b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/excludedClasses.txt
index 2097878..d5682a6 100644
--- a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/excludedClasses.txt
+++ b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/excludedClasses.txt
@@ -116,3 +116,4 @@ com/gemstone/org/apache/logging/log4j/core/config/xml/GemFireXmlConfiguration$Er
 com/gemstone/gemfire/internal/ra/GFConnectionFactoryImpl
 com/gemstone/gemfire/internal/ra/GFConnectionImpl
 com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionFactory
+com/gemstone/gemfire/cache/operations/internal/UpdateOnlyMap
\ No newline at end of file


[05/14] incubator-geode git commit: Fix for GEODE-106 Invalidate operation fails with IndexMaintenanceException with underlying java.lang.ArrayIndexOutOfBoundsException.

Posted by kl...@apache.org.
Fix for GEODE-106 Invalidate operation fails with IndexMaintenanceException with underlying java.lang.ArrayIndexOutOfBoundsException.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/39969409
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/39969409
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/39969409

Branch: refs/heads/feature/GEODE-949-2
Commit: 3996940954e6099fb927c1703a2c085760c4899a
Parents: c18f515
Author: Anil <ag...@pivotal.io>
Authored: Wed Feb 24 17:13:04 2016 -0800
Committer: Anil <ag...@pivotal.io>
Committed: Tue Mar 1 16:13:13 2016 -0800

----------------------------------------------------------------------
 .../query/internal/index/IndexElemArray.java    | 34 +++++-----
 .../internal/index/IndexElemArrayJUnitTest.java | 66 +++++++++++++++++---
 2 files changed, 74 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/39969409/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArray.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArray.java b/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArray.java
index de694a4..7fdce2d 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArray.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArray.java
@@ -199,18 +199,20 @@ public class IndexElemArray implements Iterable, Collection {
    * @return <tt>true</tt> if this list contained the specified element
    */
   public boolean remove(Object o) {
-    if (o == null) {
-      for (int index = 0; index < size; index++)
-        if (elementData[index] == null) {
-          fastRemove(index);
-          return true;
-        }
-    } else {
-      for (int index = 0; index < size; index++)
-        if (o.equals(elementData[index])) {
-          fastRemove(index);
-          return true;
-        }
+    synchronized (lock) {
+      if (o == null) {
+        for (int index = 0; index < size; index++)
+          if (elementData[index] == null) {
+            fastRemove(index);
+            return true;
+          }
+      } else {
+        for (int index = 0; index < size; index++)
+          if (o.equals(elementData[index])) {
+            fastRemove(index);
+            return true;
+          }
+      }
     }
     return false;
   }
@@ -224,13 +226,11 @@ public class IndexElemArray implements Iterable, Collection {
     Object[] newArray = new Object[len - 1];
     System.arraycopy(elementData, 0, newArray, 0, index);
     int numMoved = len - index - 1;
-    if (numMoved > 0)
+    if (numMoved > 0) {
       System.arraycopy(elementData, index + 1, newArray, index, numMoved);
-
-    synchronized (lock) {
-      elementData = newArray;
-      --size;
     }
+    elementData = newArray;
+    --size;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/39969409/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArrayJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArrayJUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArrayJUnitTest.java
index 8c51264..91dbf7b 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArrayJUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/IndexElemArrayJUnitTest.java
@@ -19,36 +19,37 @@ package com.gemstone.gemfire.cache.query.internal.index;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Iterator;
+import java.util.Random;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.stream.IntStream;
 
 import org.junit.After;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+import com.gemstone.gemfire.cache.query.MultithreadedTester;
 import com.gemstone.gemfire.test.junit.categories.UnitTest;
 
 @Category(UnitTest.class)
 public class IndexElemArrayJUnitTest {
   
-  private IndexElemArray list;
+  private IndexElemArray list = new IndexElemArray(7);
 
   @After
   public void tearDown() {
-    System.clearProperty("index_elemarray_size");
+    //System.clearProperty("index_elemarray_size");
   }
   
   @Test
   public void testFunctionality() throws Exception {
-    // test disabled due to frequent failures that indicate that the product
-    // is malfunctioning.  See internal ticket #52285
-    if (true) {
-      return;
-    }
-    System.setProperty("index_elemarray_size", "7");
-    list = new IndexElemArray();
+    list.clear();
     boundaryCondition();
     add();
     clearAndAdd();
@@ -62,6 +63,52 @@ public class IndexElemArrayJUnitTest {
     clearAndAdd();
   }
 
+  @Test
+  /**
+   * This tests concurrent modification of IndexElemArray and to make 
+   * sure elementData and size are updated atomically. Ticket# GEODE-106.   
+   */
+  public void testFunctionalityUsingMultiThread() throws Exception {
+    list.clear();
+    Collection<Callable> callables = new ConcurrentLinkedQueue<>();    
+    IntStream.range(0, 1000).parallel().forEach(i -> {
+      callables.add(() -> {
+        if (i%3 == 0) {
+          return add(Integer.valueOf(new Random().nextInt(4)));
+        } else if (i%3 == 1) {
+          return remove(Integer.valueOf(new Random().nextInt(4)));
+        } else {
+          return iterateList();
+        }
+      });
+    });
+
+    Collection<Object> results = MultithreadedTester.runMultithreaded(callables);
+    results.forEach(result -> {
+      // There should not be any Exception here. 
+      // E.g. ArrayIndexOutOfBoundsException when multiple threads are acting.
+      assertTrue(result.getClass().getName() + " was not an expected result", result instanceof Integer);
+    });
+  }
+  
+  private Integer add(Integer i) {
+    list.add(i);
+    return i;
+  }
+  
+  private Integer remove(Integer i) {
+    list.remove(i);
+    return i;
+  }
+  
+  private Integer iterateList() {    
+    Iterator iter = list.iterator();
+    if (iter.hasNext()){ 
+      iter.next(); 
+    }
+    return Integer.valueOf(list.size());
+  }
+  
   private void add() {
     Object objBefore = list.getElementData();
     insert(7);
@@ -134,4 +181,5 @@ public class IndexElemArrayJUnitTest {
       // ok
     }
   }
+  
 }


[07/14] incubator-geode git commit: GEODE-991: Marking LuceneFunction as in InternalEntity

Posted by kl...@apache.org.
GEODE-991: Marking LuceneFunction as in InternalEntity

This prevents LuceneFunction from showing up in the list functions
command in gfsh.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/0ca2f2ea
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/0ca2f2ea
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/0ca2f2ea

Branch: refs/heads/feature/GEODE-949-2
Commit: 0ca2f2ea16d09b67b3b7b3c723b0f02e35b577b3
Parents: e1a0830
Author: Dan Smith <up...@apache.org>
Authored: Wed Mar 2 14:12:52 2016 -0800
Committer: Dan Smith <up...@apache.org>
Committed: Wed Mar 2 14:21:08 2016 -0800

----------------------------------------------------------------------
 .../gemfire/cache/lucene/internal/distributed/LuceneFunction.java | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0ca2f2ea/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java
index c3b79c5..199b698 100644
--- a/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java
+++ b/geode-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java
@@ -39,6 +39,7 @@ import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepository;
 import com.gemstone.gemfire.cache.lucene.internal.repository.IndexResultCollector;
 import com.gemstone.gemfire.cache.lucene.internal.repository.RepositoryManager;
 import com.gemstone.gemfire.cache.query.QueryException;
+import com.gemstone.gemfire.internal.InternalEntity;
 import com.gemstone.gemfire.internal.cache.BucketNotFoundException;
 import com.gemstone.gemfire.internal.logging.LogService;
 
@@ -47,7 +48,7 @@ import com.gemstone.gemfire.internal.logging.LogService;
  * and arguments like region and buckets. It invokes search on the local index and provides a result collector. The
  * locally collected results are sent to the search coordinator.
  */
-public class LuceneFunction extends FunctionAdapter {
+public class LuceneFunction extends FunctionAdapter implements InternalEntity {
   private static final long serialVersionUID = 1L;
   public static final String ID = LuceneFunction.class.getName();
 


[02/14] incubator-geode git commit: GEODE-967: Changed to serialize substitute value only if necessary

Posted by kl...@apache.org.
GEODE-967: Changed to serialize substitute value only if necessary


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/d067f41d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/d067f41d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/d067f41d

Branch: refs/heads/feature/GEODE-949-2
Commit: d067f41d5411e54f1fa83caca6c3494182b6fe78
Parents: aa92530
Author: Barry Oglesby <bo...@pivotal.io>
Authored: Thu Feb 25 16:56:12 2016 -0800
Committer: Barry Oglesby <bo...@pivotal.io>
Committed: Tue Mar 1 10:13:05 2016 -0800

----------------------------------------------------------------------
 .../cache/wan/GatewaySenderEventImpl.java       | 38 +++++++--
 .../cache/wan/AsyncEventQueueTestBase.java      | 86 +++++++++++++++++++-
 .../asyncqueue/AsyncEventListenerDUnitTest.java | 21 ++++-
 3 files changed, 132 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/d067f41d/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/wan/GatewaySenderEventImpl.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/wan/GatewaySenderEventImpl.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/wan/GatewaySenderEventImpl.java
index e19d7bf..0e506f7 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/wan/GatewaySenderEventImpl.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/wan/GatewaySenderEventImpl.java
@@ -518,6 +518,9 @@ public class GatewaySenderEventImpl implements
     }
     Object rawValue = this.value;
     if (rawValue == null) {
+      rawValue = this.substituteValue;
+    }
+    if (rawValue == null) {
       @Unretained(OffHeapIdentifier.GATEWAY_SENDER_EVENT_IMPL_VALUE)
       Object vo = this.valueObj;
       if (vo instanceof StoredObject) {
@@ -548,6 +551,8 @@ public class GatewaySenderEventImpl implements
     @Retained(OffHeapIdentifier.GATEWAY_SENDER_EVENT_IMPL_VALUE)
     Object result = this.value;
     if (result == null) {
+      result = this.substituteValue;
+      if (result == null) {
       result = this.valueObj;
       if (result instanceof ObjectChunk) {
         if (this.valueObjReleased) {
@@ -562,6 +567,7 @@ public class GatewaySenderEventImpl implements
           }
         }
       }
+      }
     }
     return result;
   }
@@ -582,7 +588,6 @@ public class GatewaySenderEventImpl implements
    * @return this event's deserialized value
    */
   public Object getDeserializedValue() {
-// TODO OFFHEAP MERGE: handle substituteValue here?
     if (this.valueIsObject == 0x00) {
       Object result = this.value;
       if (result == null) {
@@ -616,6 +621,9 @@ public class GatewaySenderEventImpl implements
           Object result = EntryEventImpl.deserialize(this.value);
           this.valueObj = result;
           return result;
+        } else if (this.substituteValue != null) {
+          // If the substitute value is set, return it.
+          return this.substituteValue;
         } else {
           if (this.valueObjReleased) {
             throw new IllegalStateException("Value is no longer available. getDeserializedValue must be called before processEvents returns.");
@@ -633,8 +641,10 @@ public class GatewaySenderEventImpl implements
    * the value. This is a debugging exception.
    */
   public String getValueAsString(boolean deserialize) {
-// TODO OFFHEAP MERGE: handle substituteValue here?
     Object v = this.value;
+    if (v == null) {
+      v = this.substituteValue;
+    }
     if (deserialize) {
       try {
         v = getDeserializedValue();
@@ -672,6 +682,13 @@ public class GatewaySenderEventImpl implements
   public byte[] getSerializedValue() {
     byte[] result = this.value;
     if (result == null) {
+      if (this.substituteValue != null) {
+        // The substitute value is set. Serialize it
+        isSerializingValue.set(Boolean.TRUE);
+        result = EntryEventImpl.serialize(this.substituteValue);
+        isSerializingValue.set(Boolean.FALSE);
+        return result;
+      }
       @Unretained(OffHeapIdentifier.GATEWAY_SENDER_EVENT_IMPL_VALUE)
       Object vo = this.valueObj;
       if (vo instanceof StoredObject) {
@@ -687,7 +704,9 @@ public class GatewaySenderEventImpl implements
         synchronized (this) {
           result = this.value;
           if (result == null && vo != null && !(vo instanceof Token)) {
+            isSerializingValue.set(Boolean.TRUE);
             result = EntryEventImpl.serialize(vo);
+            isSerializingValue.set(Boolean.FALSE);
             this.value = result;
           } else if (result == null) {
             if (this.valueObjReleased) {
@@ -982,15 +1001,12 @@ public class GatewaySenderEventImpl implements
         this.value = (byte[]) this.substituteValue;
         this.valueIsObject = 0x00;
       } else if (this.substituteValue == TOKEN_NULL) {
-        // The substituteValue represents null. Set the value to null.
+        // The substituteValue represents null. Set the value and substituteValue to null.
         this.value = null;
+        this.substituteValue = null;
         this.valueIsObject = 0x01;
       } else {
-        // The substituteValue is an object. Serialize it.
-        isSerializingValue.set(Boolean.TRUE);
-        this.value = CacheServerHelper.serialize(this.substituteValue);
-        isSerializingValue.set(Boolean.FALSE);
-        event.setCachedSerializedNewValue(this.value);
+        // The substituteValue is an object. Leave it as is.
         this.valueIsObject = 0x01;
       }
     }
@@ -1219,7 +1235,11 @@ public class GatewaySenderEventImpl implements
     if (vo instanceof StoredObject) {
       return ((StoredObject) vo).getSizeInBytes();
     } else {
+      if (this.substituteValue != null) {
+        return sizeOf(this.substituteValue);
+      } else {
       return CachedDeserializableFactory.calcMemSize(getSerializedValue());
+      }
     }
   }
   
@@ -1247,7 +1267,7 @@ public class GatewaySenderEventImpl implements
    * If it was stored off-heap and is no longer available (because it was released) then return null.
    */
   public GatewaySenderEventImpl makeHeapCopyIfOffHeap() {
-    if (this.value != null) {
+    if (this.value != null || this.substituteValue != null) {
       // we have the value stored on the heap so return this
       return this;
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/d067f41d/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/AsyncEventQueueTestBase.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/AsyncEventQueueTestBase.java b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/AsyncEventQueueTestBase.java
index 93e91c9..d834017 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/AsyncEventQueueTestBase.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/AsyncEventQueueTestBase.java
@@ -16,6 +16,8 @@
  */
 package com.gemstone.gemfire.internal.cache.wan;
 
+import java.io.DataInput;
+import java.io.DataOutput;
 import java.io.File;
 import java.io.IOException;
 import java.net.InetSocketAddress;
@@ -34,6 +36,8 @@ import java.util.StringTokenizer;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import com.gemstone.gemfire.DataSerializable;
+import com.gemstone.gemfire.DataSerializer;
 import com.gemstone.gemfire.cache.AttributesFactory;
 import com.gemstone.gemfire.cache.Cache;
 import com.gemstone.gemfire.cache.CacheClosedException;
@@ -72,6 +76,7 @@ import com.gemstone.gemfire.internal.cache.ForceReattemptException;
 import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
 import com.gemstone.gemfire.internal.cache.PartitionedRegion;
 import com.gemstone.gemfire.internal.cache.RegionQueue;
+import com.gemstone.gemfire.internal.cache.lru.Sizeable;
 import com.gemstone.gemfire.test.dunit.Assert;
 import com.gemstone.gemfire.test.dunit.DistributedTestCase;
 import com.gemstone.gemfire.test.dunit.IgnoredException;
@@ -1375,20 +1380,20 @@ public class AsyncEventQueueTestBase extends DistributedTestCase {
     }
   }
 
-  public static void verifySubstitutionFilterInvocations(String asyncEventQueueId, int numInvocations) {
+  public static void verifySubstitutionFilterInvocations(String asyncEventQueueId, int expectedNumInvocations) {
     AsyncEventQueue queue = cache.getAsyncEventQueue(asyncEventQueueId);
     assertNotNull(queue);
 
     // Verify the GatewayEventSubstitutionFilter has been invoked the appropriate number of times
     MyGatewayEventSubstitutionFilter filter = (MyGatewayEventSubstitutionFilter) queue.getGatewayEventSubstitutionFilter();
     assertNotNull(filter);
-    assertEquals(numInvocations, filter.getNumInvocations());
+    assertEquals(expectedNumInvocations, filter.getNumInvocations());
 
     // Verify the AsyncEventListener has received the substituted values
     MyAsyncEventListener listener = (MyAsyncEventListener) queue.getAsyncEventListener();
     final Map eventsMap = listener.getEventsMap();
     assertNotNull(eventsMap);
-    assertEquals(numInvocations, eventsMap.size());
+    assertEquals(expectedNumInvocations, eventsMap.size());
 
     for (Iterator i = eventsMap.entrySet().iterator(); i.hasNext();) {
       Map.Entry<Integer,String> entry = (Map.Entry<Integer,String>) i.next();
@@ -1396,6 +1401,17 @@ public class AsyncEventQueueTestBase extends DistributedTestCase {
     }
   }
 
+
+  public static void verifySubstitutionFilterToDataInvocations(String asyncEventQueueId, int expectedToDataInvoations) {
+    AsyncEventQueue queue = cache.getAsyncEventQueue(asyncEventQueueId);
+    assertNotNull(queue);
+
+    // Verify the GatewayEventSubstitutionFilter has been invoked the appropriate number of times
+    SizeableGatewayEventSubstitutionFilter filter = (SizeableGatewayEventSubstitutionFilter) queue.getGatewayEventSubstitutionFilter();
+    assertNotNull(filter);
+    assertEquals(expectedToDataInvoations, filter.getNumToDataInvocations());
+  }
+
   public static int getAsyncEventListenerMapSize(String asyncEventQueueId) {
     AsyncEventListener theListener = null;
 
@@ -1649,6 +1665,70 @@ class MyCacheLoader implements CacheLoader, Declarable {
 
 }
 
+class SizeableGatewayEventSubstitutionFilter implements GatewayEventSubstitutionFilter, Declarable {
+
+  private AtomicInteger numToDataInvocations = new AtomicInteger();
+
+  protected static final String SUBSTITUTION_PREFIX = "substituted_";
+
+  public Object getSubstituteValue(EntryEvent event) {
+    return new GatewayEventSubstituteObject(this, SUBSTITUTION_PREFIX + event.getKey());
+  }
+
+  public void close() {
+  }
+
+  public void init(Properties properties) {
+  }
+
+  protected void incNumToDataInvocations() {
+    this.numToDataInvocations.incrementAndGet();
+  }
+
+  protected int getNumToDataInvocations() {
+    return this.numToDataInvocations.get();
+  }
+}
+
+class GatewayEventSubstituteObject implements DataSerializable, Sizeable {
+
+  private String id;
+
+  private SizeableGatewayEventSubstitutionFilter filter;
+
+  public GatewayEventSubstituteObject(SizeableGatewayEventSubstitutionFilter filter, String id) {
+    this.filter = filter;
+    this.id = id;
+  }
+
+  public String getId() {
+    return this.id;
+  }
+
+  public void toData(DataOutput out) throws IOException {
+    this.filter.incNumToDataInvocations();
+    DataSerializer.writeString(this.id, out);
+  }
+
+  public void fromData(DataInput in) throws IOException, ClassNotFoundException {
+    this.id = DataSerializer.readString(in);
+  }
+
+  public int getSizeInBytes() {
+    return 0;
+  }
+
+  public String toString() {
+    return new StringBuilder()
+        .append(getClass().getSimpleName())
+        .append("[")
+        .append("id=")
+        .append(this.id)
+        .append("]")
+        .toString();
+  }
+}
+
 class MyGatewayEventSubstitutionFilter implements GatewayEventSubstitutionFilter, Declarable {
 
   private AtomicInteger numInvocations = new AtomicInteger();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/d067f41d/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/asyncqueue/AsyncEventListenerDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/asyncqueue/AsyncEventListenerDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/asyncqueue/AsyncEventListenerDUnitTest.java
index 59b2caa..779fc75 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/asyncqueue/AsyncEventListenerDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/wan/asyncqueue/AsyncEventListenerDUnitTest.java
@@ -943,7 +943,26 @@ public class AsyncEventListenerDUnitTest extends AsyncEventQueueTestBase {
 
     vm4.invoke(() -> AsyncEventQueueTestBase.waitForAsyncQueueToGetEmpty( "ln" ));
 
-    vm4.invoke(() -> verifySubstitutionFilterInvocations( "ln" , numPuts ));
+    vm4.invoke(() -> verifySubstitutionFilterInvocations( "ln" ,numPuts ));
+  }
+
+  public void testParallelAsyncEventQueueWithSubstitutionFilterNoSubstituteValueToDataInvocations() {
+    Integer lnPort = (Integer)vm0.invoke(() -> AsyncEventQueueTestBase.createFirstLocatorWithDSId( 1 ));
+
+    vm4.invoke(createCacheRunnable(lnPort));
+
+    vm4.invoke(() -> AsyncEventQueueTestBase.createAsyncEventQueue( "ln",
+        true, 100, 100, false, false, null, false, "MyAsyncEventListener", "SizeableGatewayEventSubstitutionFilter" ));
+
+    String regionName = getTestMethodName() + "_PR";
+    vm4.invoke(() -> AsyncEventQueueTestBase.createPartitionedRegionWithAsyncEventQueue( regionName, "ln", isOffHeap() ));
+
+    int numPuts = 10;
+    vm4.invoke(() -> AsyncEventQueueTestBase.doPuts( regionName, numPuts ));
+
+    vm4.invoke(() -> AsyncEventQueueTestBase.waitForAsyncQueueToGetEmpty( "ln" ));
+
+    vm4.invoke(() -> verifySubstitutionFilterToDataInvocations( "ln" ,0 ));
   }
 
   /**


[13/14] incubator-geode git commit: Update

Posted by kl...@apache.org.
Update


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/a96f2d01
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/a96f2d01
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/a96f2d01

Branch: refs/heads/feature/GEODE-949-2
Commit: a96f2d019327ff147377d248aafbd6f2a3e981b3
Parents: c14f552
Author: Kirk Lund <kl...@apache.org>
Authored: Fri Mar 4 09:28:31 2016 -0800
Committer: Kirk Lund <kl...@apache.org>
Committed: Fri Mar 4 09:28:31 2016 -0800

----------------------------------------------------------------------
 .../gemfire/codeAnalysis/sanctionedSerializables.txt      | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/a96f2d01/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
----------------------------------------------------------------------
diff --git a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
index f3c1c5d..a8f6514 100644
--- a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
+++ b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedSerializables.txt
@@ -140,7 +140,6 @@ com/gemstone/gemfire/cache/hdfs/internal/hoplog/HdfsSortedOplogOrganizer$HoplogR
 com/gemstone/gemfire/cache/hdfs/internal/hoplog/Hoplog$HoplogVersion,false
 com/gemstone/gemfire/cache/hdfs/internal/hoplog/Hoplog$Meta,false
 com/gemstone/gemfire/cache/hdfs/internal/org/apache/hadoop/io/SequenceFile$CompressionType,false
-com/gemstone/gemfire/cache/operations/PutAllOperationContext$UpdateOnlyMap,true,-1034234728574286014,m:java/util/Map
 com/gemstone/gemfire/cache/partition/PartitionNotAvailableException,true,1
 com/gemstone/gemfire/cache/persistence/ConflictingPersistentDataException,true,-2629287782021455875
 com/gemstone/gemfire/cache/persistence/PartitionOfflineException,true,-6471045959318795870,offlineMembers:java/util/Set
@@ -342,8 +341,6 @@ com/gemstone/gemfire/internal/cache/execute/util/NestedTransactionFunction,true,
 com/gemstone/gemfire/internal/cache/execute/util/RollbackFunction,true,1377183180063184795
 com/gemstone/gemfire/internal/cache/ha/ThreadIdentifier$Bits,false,position:int,width:int
 com/gemstone/gemfire/internal/cache/ha/ThreadIdentifier$WanType,false
-com/gemstone/gemfire/internal/cache/locks/GFEAbstractQueuedSynchronizer,true,7373984972572414691,state:int
-com/gemstone/gemfire/internal/cache/locks/ReentrantReadWriteWriteShareLock$CASSync,false,allowUpgradeOfWriteShare:boolean,ownerId:java/lang/Object
 com/gemstone/gemfire/internal/cache/lru/HeapLRUCapacityController,true,4970685814429530675,perEntryOverhead:int,sizer:com/gemstone/gemfire/cache/util/ObjectSizer
 com/gemstone/gemfire/internal/cache/lru/LRUAlgorithm,false,bucketRegion:com/gemstone/gemfire/internal/cache/BucketRegion,evictionAction:com/gemstone/gemfire/cache/EvictionAction
 com/gemstone/gemfire/internal/cache/lru/LRUCapacityController,true,-4383074909189355938,maximumEntries:int
@@ -357,12 +354,7 @@ com/gemstone/gemfire/internal/cache/partitioned/RedundancyAlreadyMetException,fa
 com/gemstone/gemfire/internal/cache/partitioned/rebalance/PartitionedRegionLoadModel$RefusalReason,false
 com/gemstone/gemfire/internal/cache/persistence/OplogType,false,prefix:java/lang/String
 com/gemstone/gemfire/internal/cache/persistence/PersistentMemberState,false
-com/gemstone/gemfire/internal/cache/persistence/soplog/SoplogToken,false,val:byte
-com/gemstone/gemfire/internal/cache/persistence/soplog/SortedOplogFactory$SortedOplogConfiguration$Checksum,false
-com/gemstone/gemfire/internal/cache/persistence/soplog/SortedOplogFactory$SortedOplogConfiguration$Compression,false
-com/gemstone/gemfire/internal/cache/persistence/soplog/SortedOplogFactory$SortedOplogConfiguration$KeyEncoding,false
 com/gemstone/gemfire/internal/cache/persistence/soplog/SortedReader$Metadata,false
-com/gemstone/gemfire/internal/cache/persistence/soplog/hfile/HFileSortedOplog$InternalMetadata,false
 com/gemstone/gemfire/internal/cache/snapshot/ClientExporter$ClientArgs,true,1,options:com/gemstone/gemfire/cache/snapshot/SnapshotOptions,prSingleHop:boolean,region:java/lang/String
 com/gemstone/gemfire/internal/cache/snapshot/ClientExporter$ProxyExportFunction,true,1
 com/gemstone/gemfire/internal/cache/snapshot/RegionSnapshotServiceImpl$1,true,1
@@ -821,7 +813,7 @@ com/gemstone/gemfire/pdx/internal/PdxReaderImpl,true,-6094553093860427759,blobTy
 com/gemstone/gemfire/pdx/internal/WritablePdxInstanceImpl,true,7398999150097596214,dirtyFields:java/lang/Object[]
 com/gemstone/gemfire/security/AuthenticationFailedException,true,-8202866472279088879
 com/gemstone/gemfire/security/AuthenticationRequiredException,true,4675976651103154919
-com/gemstone/gemfire/security/GemFireSecurityException,true,3814254578203076926
+com/gemstone/gemfire/security/GemFireSecurityException,true,3814254578203076926,cause:java/lang/Throwable
 com/gemstone/gemfire/security/NotAuthorizedException,true,419215768216387745,principal:java/security/Principal
 com/gemstone/org/apache/logging/log4j/message/GemFireParameterizedMessage,true,-665975803997290697,messagePattern:java/lang/String,stringArgs:java/lang/String[]
 com/gemstone/org/apache/logging/log4j/message/GemFireParameterizedMessageFactory,true,1


[11/14] incubator-geode git commit: GEODE-1021: show members of the region that has hyphen in it's name

Posted by kl...@apache.org.
GEODE-1021: show members of the region that has hyphen in it's name


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/23950e80
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/23950e80
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/23950e80

Branch: refs/heads/feature/GEODE-949-2
Commit: 23950e80f8771eb134cb128ad9cff4d78f270d12
Parents: 4914142
Author: Jinmei Liao <ji...@pivotal.io>
Authored: Thu Mar 3 13:38:27 2016 -0800
Committer: Jinmei Liao <ji...@pivotal.io>
Committed: Fri Mar 4 07:51:50 2016 -0800

----------------------------------------------------------------------
 .../pulse/internal/data/JMXDataUpdater.java     | 85 ++------------------
 .../service/ClusterSelectedRegionService.java   |  8 +-
 .../ClusterSelectedRegionsMemberService.java    |  8 +-
 3 files changed, 14 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/23950e80/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/data/JMXDataUpdater.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/data/JMXDataUpdater.java b/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/data/JMXDataUpdater.java
index 71dfa61..bb433f5 100644
--- a/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/data/JMXDataUpdater.java
+++ b/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/data/JMXDataUpdater.java
@@ -1246,10 +1246,10 @@ public class JMXDataUpdater implements IClusterUpdater, NotificationListener {
   /**
    * Add member specific region information on the region
    *
-   * @param regionFullPath
+   * @param regionObjectName: used to construct the jmx objectname. For region name that has special characters in, it will have double quotes around it.
    * @param region
    */
-  private void updateRegionOnMembers(String regionFullPath, Cluster.Region region) throws IOException {
+  private void updateRegionOnMembers(String regionObjectName, String regionFullPath, Cluster.Region region) throws IOException {
 
     try{
         List<String> memberNamesTemp = region.getMemberName();
@@ -1272,7 +1272,7 @@ public class JMXDataUpdater implements IClusterUpdater, NotificationListener {
               regionOnMemberListNew.add(anRom);
 
               LOGGER.fine("updateRegionOnMembers : Processing existing Member name = " + anRom.getMemberName());
-              String objectNameROM = PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_REGION + regionFullPath + PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_MEMBER + anRom.getMemberName();
+              String objectNameROM = PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_REGION + regionObjectName + PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_MEMBER + anRom.getMemberName();
               ObjectName regionOnMemberMBean = new ObjectName(objectNameROM);
               LOGGER.fine("updateRegionOnMembers : Object name = " + regionOnMemberMBean.getCanonicalName());
 
@@ -1339,7 +1339,7 @@ public class JMXDataUpdater implements IClusterUpdater, NotificationListener {
         LOGGER.fine("updateRegionOnMembers : Remaining new members in this region = " + memberNames.size());
         //loop over the remaining regions members and add new members for this region
         for(String memberName : memberNames) {
-          String objectNameROM = PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_REGION + regionFullPath + PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_MEMBER + memberName;
+          String objectNameROM = PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_REGION + regionObjectName + PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_MEMBER + memberName;
           ObjectName regionOnMemberMBean = new ObjectName(objectNameROM);
           Cluster.RegionOnMember regionOnMember = new Cluster.RegionOnMember();
           regionOnMember.setMemberName(memberName);
@@ -1419,6 +1419,7 @@ public class JMXDataUpdater implements IClusterUpdater, NotificationListener {
           PulseConstants.REGION_MBEAN_ATTRIBUTES);
 
       // retrieve the full path of the region
+      String regionObjectName = mbeanName.getKeyProperty("name");
       String regionFullPath = null;
       for (int i = 0; i < attributeList.size(); i++) {
         Attribute attribute = (Attribute) attributeList.get(i);
@@ -1512,82 +1513,8 @@ public class JMXDataUpdater implements IClusterUpdater, NotificationListener {
         }
       }
 
-      /* GemfireXD related code
-      try{// Added for Rolling upgrade
-    	  CompositeData compositeData = (CompositeData) (this.mbs.invoke(mbeanName,
-    	          PulseConstants.MBEAN_OPERATION_LISTREGIONATTRIBUTES, null, null));
-
-    	      if (compositeData != null) {
-    	        if (compositeData
-    	            .containsKey(PulseConstants.COMPOSITE_DATA_KEY_COMPRESSIONCODEC)) {
-    	          String regCompCodec = (String) compositeData
-    	              .get(PulseConstants.COMPOSITE_DATA_KEY_COMPRESSIONCODEC);
-    	          if (null != regCompCodec) {
-    	            region.setCompressionCodec(regCompCodec);
-    	          }
-    	        }
-    	        if (compositeData
-    	            .containsKey(PulseConstants.COMPOSITE_DATA_KEY_ENABLEOFFHEAPMEMORY)) {
-    	          region.setEnableOffHeapMemory((Boolean) compositeData
-    	              .get(PulseConstants.COMPOSITE_DATA_KEY_ENABLEOFFHEAPMEMORY));
-    	        }
-    	        if (compositeData
-    	            .containsKey(PulseConstants.COMPOSITE_DATA_KEY_HDFSWRITEONLY)) {
-    	          region.setHdfsWriteOnly((Boolean) compositeData
-    	              .get(PulseConstants.COMPOSITE_DATA_KEY_HDFSWRITEONLY));
-    	        }
-    	      }
-      } catch (MBeanException anfe) {
-          LOGGER.warning(anfe);
-          region.setHdfsWriteOnly(false);
-          region.setEnableOffHeapMemory(false);
-          region.setCompressionCodec("NA");
-      }catch (javax.management.RuntimeMBeanException invalidOe) {
-    	    region.setHdfsWriteOnly(false);
-            region.setEnableOffHeapMemory(false);
-            region.setCompressionCodec("NA");
-           // LOGGER.info("Some of the Pulse elements are not available currently. There might be a GemFire upgrade going on.");
-      }
-      */
-
-      // TODO : Uncomment below code when sql fire mbean attributes are
-      // available
-      /*
-       * // IF SQLFIRE if
-       * (PulseConstants.PRODUCT_NAME_SQLFIRE.equalsIgnoreCase(PulseController
-       * .getPulseProductSupport())) {
-       *
-       * try { String tableName = this.getTableNameFromRegionName(region
-       * .getFullPath());
-       *
-       * ObjectName tableObjName = new ObjectName(
-       * PulseConstants.OBJECT_NAME_TABLE_AGGREGATE_PATTERN + tableName);
-       *
-       * AttributeList tableAttributeList = this.mbs.getAttributes(
-       * tableObjName, PulseConstants.SF_TABLE_MBEAN_ATTRIBUTES);
-       *
-       * for (int i = 0; i < tableAttributeList.size(); i++) {
-       *
-       * Attribute attribute = (Attribute) tableAttributeList.get(i);
-       *
-       * if (attribute.getName().equals(
-       * PulseConstants.MBEAN_ATTRIBUTE_ENTRYSIZE)) {
-       * System.out.println("[SQLfire] setting entry size");
-       * region.setEntrySize(getLongAttribute(attribute.getValue(),
-       * attribute.getName())); } else if (attribute.getName().equals(
-       * PulseConstants.MBEAN_ATTRIBUTE_NUMBEROFROWS)) {
-       * System.out.println("[SQLfire] setting num of rows");
-       * region.setSystemRegionEntryCount(getLongAttribute(
-       * attribute.getValue(), attribute.getName())); } } } catch
-       * (MalformedObjectNameException e) { LOGGER.warning(e); } catch
-       * (NullPointerException e) { LOGGER.warning(e); } }
-       */
-
-      // Add to map even if region is present. If region is already there it
-      // will be a no-op.
-
       //add for each member
-      updateRegionOnMembers(regionFullPath, region);
+      updateRegionOnMembers(regionObjectName, regionFullPath, region);
 
       cluster.addClusterRegion(regionFullPath, region);
       cluster.getDeletedRegions().remove(region.getFullPath());

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/23950e80/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionService.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionService.java b/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionService.java
index 4309c40..1e2f5b1 100644
--- a/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionService.java
+++ b/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionService.java
@@ -209,13 +209,13 @@ public class ClusterSelectedRegionService implements PulseService {
       }
 
       regionJSON.put("memoryReadsTrend",
-          mapper.valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_GETS_PER_SEC_TREND)));
+          mapper.<JsonNode>valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_GETS_PER_SEC_TREND)));
       regionJSON.put("memoryWritesTrend",
-          mapper.valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_PUTS_PER_SEC_TREND)));
+          mapper.<JsonNode>valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_PUTS_PER_SEC_TREND)));
       regionJSON.put("diskReadsTrend",
-          mapper.valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_DISK_READS_PER_SEC_TREND)));
+          mapper.<JsonNode>valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_DISK_READS_PER_SEC_TREND)));
       regionJSON.put("diskWritesTrend",
-          mapper.valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_DISK_WRITES_PER_SEC_TREND)));
+          mapper.<JsonNode>valueToTree(reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_DISK_WRITES_PER_SEC_TREND)));
 
       regionJSON.put("emptyNodes", reg.getEmptyNode());
       Long entrySize = reg.getEntrySize();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/23950e80/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionsMemberService.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionsMemberService.java b/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionsMemberService.java
index 00807d9..f99e6d6 100644
--- a/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionsMemberService.java
+++ b/geode-pulse/src/main/java/com/vmware/gemfire/tools/pulse/internal/service/ClusterSelectedRegionsMemberService.java
@@ -115,19 +115,19 @@ public class ClusterSelectedRegionsMemberService implements PulseService {
         LOGGER.finest("calling getSelectedRegionsMembersJson :: rom.getLocalMaxMemory() = " + rom.getLocalMaxMemory());
 
         memberJSON.put("memoryReadsTrend",
-            mapper.valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_GETS_PER_SEC_TREND)));
+            mapper.<JsonNode>valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_GETS_PER_SEC_TREND)));
         LOGGER.finest("memoryReadsTrend = " + rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_GETS_PER_SEC_TREND).length);
 
         memberJSON.put("memoryWritesTrend",
-            mapper.valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_PUTS_PER_SEC_TREND)));
+            mapper.<JsonNode>valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_PUTS_PER_SEC_TREND)));
         LOGGER.finest("memoryWritesTrend = " + rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_PUTS_PER_SEC_TREND).length);
 
         memberJSON.put("diskReadsTrend",
-            mapper.valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_DISK_READS_PER_SEC_TREND)));
+            mapper.<JsonNode>valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_DISK_READS_PER_SEC_TREND)));
         LOGGER.finest("diskReadsTrend = " + rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_DISK_READS_PER_SEC_TREND).length);
 
         memberJSON.put("diskWritesTrend",
-            mapper.valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_DISK_WRITES_PER_SEC_TREND)));
+            mapper.<JsonNode>valueToTree(rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_DISK_WRITES_PER_SEC_TREND)));
         LOGGER.finest("diskWritesTrend = " + rom.getRegionOnMemberStatisticTrend(RegionOnMember.REGION_ON_MEMBER_STAT_DISK_WRITES_PER_SEC_TREND).length);
 
         regionMemberJSON.put(rom.getMemberName(), memberJSON);


[14/14] incubator-geode git commit: Synchronize overridden getCause() and getPrincipal()

Posted by kl...@apache.org.
Synchronize overridden getCause() and getPrincipal()


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/f00184c0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/f00184c0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/f00184c0

Branch: refs/heads/feature/GEODE-949-2
Commit: f00184c04eac8494d5987c99dceeab926b851ce3
Parents: a96f2d0
Author: Kirk Lund <kl...@apache.org>
Authored: Fri Mar 4 09:29:39 2016 -0800
Committer: Kirk Lund <kl...@apache.org>
Committed: Fri Mar 4 09:29:39 2016 -0800

----------------------------------------------------------------------
 .../com/gemstone/gemfire/security/GemFireSecurityException.java    | 2 +-
 .../java/com/gemstone/gemfire/security/NotAuthorizedException.java | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f00184c0/geode-core/src/main/java/com/gemstone/gemfire/security/GemFireSecurityException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/security/GemFireSecurityException.java b/geode-core/src/main/java/com/gemstone/gemfire/security/GemFireSecurityException.java
index 40be542..1c4ab6c 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/security/GemFireSecurityException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/security/GemFireSecurityException.java
@@ -83,7 +83,7 @@ public class GemFireSecurityException extends GemFireException {
   }
 
   @Override
-  public final Throwable getCause() {
+  public final synchronized Throwable getCause() {
     return (this.cause == this ? null : this.cause);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f00184c0/geode-core/src/main/java/com/gemstone/gemfire/security/NotAuthorizedException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/security/NotAuthorizedException.java b/geode-core/src/main/java/com/gemstone/gemfire/security/NotAuthorizedException.java
index 27c612f..0aecbad 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/security/NotAuthorizedException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/security/NotAuthorizedException.java
@@ -106,7 +106,7 @@ public class NotAuthorizedException extends GemFireSecurityException {
    *
    * @return the {@code principal} for which authorization failed.
    */
-  public Principal getPrincipal() {
+  public synchronized Principal getPrincipal() {
     return this.principal;
   }
 


[10/14] incubator-geode git commit: GEODE-966 HashIndex with Overflow region detection/conversion needs to occur sooner

Posted by kl...@apache.org.
GEODE-966 HashIndex with Overflow region detection/conversion needs to occur sooner

Conversion of HashIndex to CompactRangeIndex due to overflow is determined before the create
task is created.  This prevents the index map from getting into a weird state.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/49141421
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/49141421
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/49141421

Branch: refs/heads/feature/GEODE-949-2
Commit: 4914142105e2ec478679efdc1737ab9972b30d1e
Parents: 7e35494
Author: Jason Huynh <hu...@gmail.com>
Authored: Thu Feb 25 16:23:08 2016 -0800
Committer: Jason Huynh <hu...@gmail.com>
Committed: Thu Mar 3 15:15:15 2016 -0800

----------------------------------------------------------------------
 .../gemfire/cache/query/internal/index/IndexManager.java  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49141421/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexManager.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexManager.java b/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexManager.java
index 7a0b1a9..d21b50d 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexManager.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/IndexManager.java
@@ -302,6 +302,11 @@ public class IndexManager  {
 
       IndexCreationHelper helper = null;
       boolean isCompactOrHash = false;
+      //Hash index not supported for overflow but we "thought" we were so let's maintain backwards compatibility
+      //and create a regular compact range index instead
+      if (indexType == IndexType.HASH && isOverFlowRegion()) {
+        indexType = IndexType.FUNCTIONAL;
+      }
       if (indexType != IndexType.PRIMARY_KEY) {
         helper = new FunctionalIndexCreationHelper(origFromClause,
             origIndexedExpression, projectionAttributes, imports, region.getCache(),
@@ -1615,11 +1620,6 @@ public class IndexManager  {
       if (this.prIndex != null) {
         stats = this.prIndex.getStatistics();
       }
-      //Hash index not supported for overflow but we "thought" we were so let's maintain backwards compatibility
-      //and create a regular compact range index instead
-      if (indexType == IndexType.HASH && isOverFlowRegion()) {
-        indexType = IndexType.FUNCTIONAL;
-      }
       if (indexType == IndexType.PRIMARY_KEY) {
         index = new PrimaryKeyIndex(indexName, region, fromClause,indexedExpression,
              projectionAttributes, origFromClause,


[04/14] incubator-geode git commit: GEODE-996: OffheapStats - fragmentation percentage calculation has to be revisited.

Posted by kl...@apache.org.
GEODE-996: OffheapStats - fragmentation percentage calculation has to be revisited.

 Offheap fragmentation stat is computed based on
 available fragments compared to max possbile fragments
 which describes how fragmented the current free memory is.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/c18f5156
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/c18f5156
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/c18f5156

Branch: refs/heads/feature/GEODE-949-2
Commit: c18f5156a0982fcbec6f288b3c88c101bcf10736
Parents: 00b4c84
Author: Sai Boorlagadda <sb...@pivotal.io>
Authored: Fri Feb 26 13:46:32 2016 -0800
Committer: Sai Boorlagadda <sb...@pivotal.io>
Committed: Tue Mar 1 14:21:31 2016 -0800

----------------------------------------------------------------------
 .../internal/offheap/FreeListManager.java       | 39 +++++----
 .../internal/offheap/OffHeapStorage.java        |  2 +-
 .../internal/offheap/FreeListManagerTest.java   | 83 ++++++++++++++++++++
 .../management/OffHeapManagementDUnitTest.java  | 54 ++++++++++---
 4 files changed, 149 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c18f5156/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
index b816eb9..3859d58 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
@@ -437,7 +437,7 @@ public class FreeListManager {
 
         this.ma.getStats().setLargestFragment(largestFragment);
         this.ma.getStats().setFragments(tmp.size());        
-        updateFragmentation(largestFragment);
+        this.ma.getStats().setFragmentation(getFragmentation());
 
         return result;
       } // sync
@@ -473,21 +473,30 @@ public class FreeListManager {
     }
   }
   
-  private void updateFragmentation(long largestFragment) {      
-    long freeSize = getFreeMemory();
-
-    // Calculate free space fragmentation only if there is free space available.
-    if(freeSize > 0) {
-      long numerator = freeSize - largestFragment;
-
-      double percentage = (double) numerator / (double) freeSize;
-      percentage *= 100d;
-
-      int wholePercentage = (int) Math.rint(percentage);
-      this.ma.getStats().setFragmentation(wholePercentage);
+  protected int getFragmentCount() {
+    return this.fragmentList.size();
+  }
+  
+  protected int getFragmentation() {
+    if(getUsedMemory() == 0) {
+      //when no memory is used then there is no fragmentation
+      return 0;
     } else {
-      // No free space? Then we have no free space fragmentation.
-      this.ma.getStats().setFragmentation(0);
+      int availableFragments = getFragmentCount();
+      if (availableFragments == 0) {
+        //zero fragments means no free memory then no fragmentation
+        return 0;
+      } else if (availableFragments == 1) {
+        //free memory is available as one fragment, so no fragmentation
+        return 0;
+      } else {
+        //more than 1 fragment is available so freeMemory is > ObjectChunk.MIN_CHUNK_SIZE
+        long freeMemory = getFreeMemory();
+        assert freeMemory > ObjectChunk.MIN_CHUNK_SIZE;
+        long maxPossibleFragments = freeMemory / ObjectChunk.MIN_CHUNK_SIZE;
+        double fragmentation = ((double) availableFragments /(double) maxPossibleFragments) * 100d;
+        return (int) Math.rint(fragmentation);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c18f5156/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/OffHeapStorage.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/OffHeapStorage.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/OffHeapStorage.java
index bb5cdeb..3156067 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/OffHeapStorage.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/OffHeapStorage.java
@@ -71,7 +71,7 @@ public class OffHeapStorage implements OffHeapMemoryStats {
     final String usedMemoryDesc = "The amount of off-heap memory, in bytes, that is being used to store data.";
     final String compactionsDesc = "The total number of times off-heap memory has been compacted.";
     final String compactionTimeDesc = "The total time spent compacting off-heap memory.";
-    final String fragmentationDesc = "The percentage of off-heap memory fragmentation.  Updated every time a compaction is performed.";
+    final String fragmentationDesc = "The percentage of off-heap free memory that is fragmented.  Updated every time a compaction is performed.";
     final String fragmentsDesc = "The number of fragments of free off-heap memory. Updated every time a compaction is done.";
     final String freeMemoryDesc = "The amount of off-heap memory, in bytes, that is not being used.";
     final String largestFragmentDesc = "The largest fragment of memory found by the last compaction of off heap memory. Updated every time a compaction is done.";

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c18f5156/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java b/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
index 64032cc..9bfb2eb 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
@@ -739,6 +739,89 @@ public class FreeListManagerTest {
     LogWriter lw = mock(LogWriter.class);
     this.freeListManager.logOffHeapState(lw, 1024);
   }
+  
+  @Test
+  public void fragmentationShouldBeZeroIfNumberOfFragmentsIsZero() {
+    UnsafeMemoryChunk chunk = new UnsafeMemoryChunk(10);
+    this.freeListManager = createFreeListManager(ma, new UnsafeMemoryChunk[] {chunk});
+    
+    FreeListManager spy = spy(this.freeListManager);
+    
+    when(spy.getFragmentCount()).thenReturn(0);
+    
+    assertThat(spy.getFragmentation()).isZero();
+  }
+  
+  @Test
+  public void fragmentationShouldBeZeroIfNumberOfFragmentsIsOne() {
+    UnsafeMemoryChunk chunk = new UnsafeMemoryChunk(10);
+    this.freeListManager = createFreeListManager(ma, new UnsafeMemoryChunk[] {chunk});
+    
+    FreeListManager spy = spy(this.freeListManager);
+    
+    when(spy.getFragmentCount()).thenReturn(1);
+    
+    assertThat(spy.getFragmentation()).isZero();
+  }
+  
+  @Test
+  public void fragmentationShouldBeZeroIfUsedMemoryIsZero() {
+    UnsafeMemoryChunk chunk = new UnsafeMemoryChunk(10);
+    this.freeListManager = createFreeListManager(ma, new UnsafeMemoryChunk[] {chunk});
+    
+    FreeListManager spy = spy(this.freeListManager);
+    
+    when(spy.getUsedMemory()).thenReturn(0L);
+    
+    assertThat(spy.getFragmentation()).isZero();
+  }
+  
+  @Test
+  public void fragmentationShouldBe100IfAllFreeMemoryIsFragmentedAsMinChunks() {
+    UnsafeMemoryChunk chunk = new UnsafeMemoryChunk(10);
+    this.freeListManager = createFreeListManager(ma, new UnsafeMemoryChunk[] {chunk});
+    
+    FreeListManager spy = spy(this.freeListManager);
+    
+    when(spy.getUsedMemory()).thenReturn(1L);
+    when(spy.getFragmentCount()).thenReturn(2);
+    when(spy.getFreeMemory()).thenReturn((long)ObjectChunk.MIN_CHUNK_SIZE * 2);
+    
+    assertThat(spy.getFragmentation()).isEqualTo(100);
+  }
+  
+  @Test
+  public void fragmentationShouldBeRoundedToNearestInteger() {
+    UnsafeMemoryChunk chunk = new UnsafeMemoryChunk(10);
+    this.freeListManager = createFreeListManager(ma, new UnsafeMemoryChunk[] {chunk});
+    
+    FreeListManager spy = spy(this.freeListManager);
+    
+    when(spy.getUsedMemory()).thenReturn(1L);
+    when(spy.getFragmentCount()).thenReturn(4);
+    when(spy.getFreeMemory()).thenReturn((long)ObjectChunk.MIN_CHUNK_SIZE * 8);
+    
+    assertThat(spy.getFragmentation()).isEqualTo(50); //Math.rint(50.0)
+    
+    when(spy.getUsedMemory()).thenReturn(1L);
+    when(spy.getFragmentCount()).thenReturn(3);
+    when(spy.getFreeMemory()).thenReturn((long)ObjectChunk.MIN_CHUNK_SIZE * 8);
+    
+    assertThat(spy.getFragmentation()).isEqualTo(38); //Math.rint(37.5)
+    
+    when(spy.getUsedMemory()).thenReturn(1L);
+    when(spy.getFragmentCount()).thenReturn(6);
+    when(spy.getFreeMemory()).thenReturn((long)ObjectChunk.MIN_CHUNK_SIZE * 17);
+    
+    assertThat(spy.getFragmentation()).isEqualTo(35); //Math.rint(35.29)
+    
+    when(spy.getUsedMemory()).thenReturn(1L);
+    when(spy.getFragmentCount()).thenReturn(6);
+    when(spy.getFreeMemory()).thenReturn((long)ObjectChunk.MIN_CHUNK_SIZE * 9);
+    
+    assertThat(spy.getFragmentation()).isEqualTo(67); //Math.rint(66.66)
+  }
+  
   /**
    * Just like Fragment except that the first time allocate is called
    * it returns false indicating that the allocate failed.

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c18f5156/geode-core/src/test/java/com/gemstone/gemfire/management/OffHeapManagementDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/management/OffHeapManagementDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/management/OffHeapManagementDUnitTest.java
index acafada..3d06e11 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/management/OffHeapManagementDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/management/OffHeapManagementDUnitTest.java
@@ -36,6 +36,7 @@ import com.gemstone.gemfire.cache30.CacheTestCase;
 import com.gemstone.gemfire.distributed.internal.DistributionConfig;
 import com.gemstone.gemfire.distributed.internal.InternalDistributedSystem;
 import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
+import com.gemstone.gemfire.internal.offheap.ObjectChunk;
 import com.gemstone.gemfire.internal.offheap.OffHeapMemoryStats;
 import com.gemstone.gemfire.internal.offheap.OffHeapStorage;
 import com.gemstone.gemfire.management.internal.MBeanJMXAdapter;
@@ -237,21 +238,51 @@ public class OffHeapManagementDUnitTest extends CacheTestCase {
       // Make sure our starting off heap stats are correct
       assertOffHeapMetricsOnVm(vm, TOTAL_MEMORY, 0, 0, 0);
       
-      // After allocating large chunck we should still have no fragmentation
-      doPutOnVm(vm, KEY, new byte[HALF_TOTAL_MEMORY], OFF_HEAP_REGION_NAME, false);
+      // After allocating large chunk (equal to total memory) 
+      // we should still have no fragmentation
+      int largeChunk = (int) TOTAL_MEMORY - ObjectChunk.OFF_HEAP_HEADER_SIZE;
+      doPutOnVm(vm, KEY, new byte[largeChunk], OFF_HEAP_REGION_NAME, false);
+      // No compaction has run, so fragmentation should be zero
+      assertFragmentationStatOnVm(vm,0,ASSERT_OP.EQUAL);
+      
+      // Allocate more memory to trigger compaction
+      doPutOnVm(vm, KEY, new byte[ALLOCATION_SIZE], OFF_HEAP_REGION_NAME, true);
+      // When total memory is used no fragmentation
       assertFragmentationStatOnVm(vm,0,ASSERT_OP.EQUAL);
       
       // After freeing all memory we should have no fragmentation
       doDestroyOnVm(vm, KEY, OFF_HEAP_REGION_NAME);
       assertFragmentationStatOnVm(vm,0,ASSERT_OP.EQUAL);
       
-      // Consume all off-heap memory using an allocation size
-      int numAllocations = doConsumeOffHeapMemoryOnVm(vm,ALLOCATION_SIZE);
-      assertTrue(numAllocations > 0);
+      // Allocate HALF_TOTAL_MEMORY twice and release one to create one fragment
+      int halfChunk = HALF_TOTAL_MEMORY - ObjectChunk.OFF_HEAP_HEADER_SIZE;
+      doPutOnVm(vm, KEY + "0", new byte[halfChunk], OFF_HEAP_REGION_NAME, false);
+      doPutOnVm(vm, KEY + "1", new byte[halfChunk], OFF_HEAP_REGION_NAME, false);
+      doDestroyOnVm(vm, KEY + "0", OFF_HEAP_REGION_NAME);
       
-      // Randomly free 3 allocations to produce off-heap gaps
-      doFreeOffHeapMemoryOnVm(vm, numAllocations, 3);
-
+      // Allocate largeChunk to trigger compaction and fragmentation should be zero 
+      // as all free memory is available as one fragment
+      doPutOnVm(vm, KEY + "1", new byte[largeChunk], OFF_HEAP_REGION_NAME, true);
+      assertFragmentationStatOnVm(vm,0,ASSERT_OP.EQUAL);
+      
+      // Consume the available fragment as below
+      // [16][262120][16][262120][16] = [524288] (HALF_TOTAL_MEMORY)
+      int smallChunk = ObjectChunk.MIN_CHUNK_SIZE - ObjectChunk.OFF_HEAP_HEADER_SIZE;
+      int mediumChunk = 262112; //(262120 - ObjectChunk.OFF_HEAP_HEADER_SIZE)
+      doPutOnVm(vm, KEY + "S1", new byte[smallChunk], OFF_HEAP_REGION_NAME, false);
+      doPutOnVm(vm, KEY + "M1", new byte[mediumChunk], OFF_HEAP_REGION_NAME, false);
+      doPutOnVm(vm, KEY + "S2", new byte[smallChunk], OFF_HEAP_REGION_NAME, false);
+      doPutOnVm(vm, KEY + "M2", new byte[mediumChunk], OFF_HEAP_REGION_NAME, false);
+      doPutOnVm(vm, KEY + "S3", new byte[smallChunk], OFF_HEAP_REGION_NAME, false);
+      
+      // free small chunks to create gaps
+      doDestroyOnVm(vm, KEY + "S1", OFF_HEAP_REGION_NAME);
+      doDestroyOnVm(vm, KEY + "S2", OFF_HEAP_REGION_NAME);
+      doDestroyOnVm(vm, KEY + "S3", OFF_HEAP_REGION_NAME);
+
+      // Now free memory should be 48 so allocate a 40 byte object
+      doPutOnVm(vm, KEY + "newKey", new byte[40], OFF_HEAP_REGION_NAME, true);
+     
       /*
        * Setup a fragmentation attribute monitor
        */
@@ -259,12 +290,9 @@ public class OffHeapManagementDUnitTest extends CacheTestCase {
         setupOffHeapMonitorOnVm(vm,"OffHeapFragmentation",0,0);      
         clearNotificationListenerOnVm(vm);
       }
-      
-      // Allocate enough memory to force compaction which will update fragmenation stat
-      doPutOnVm(vm,KEY, new byte[NEW_ALLOCATION_SIZE], OFF_HEAP_REGION_NAME, true);
-      
+
       // Make sure we have some fragmentation
-      assertFragmentationStatOnVm(vm, 0, ASSERT_OP.GREATER_THAN);
+      assertFragmentationStatOnVm(vm, 100, ASSERT_OP.EQUAL);
       
       // Make sure our fragmentation monitor was triggered
       waitForNotificationListenerOnVm(vm, 5000, 500, true);


[09/14] incubator-geode git commit: GEODE-1040: Add a DUnit for JTA rollback

Posted by kl...@apache.org.
GEODE-1040: Add a DUnit for JTA rollback


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/7e354942
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/7e354942
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/7e354942

Branch: refs/heads/feature/GEODE-949-2
Commit: 7e354942b5b861b1aa4edb620bb05d0307c67713
Parents: e7e1fc6
Author: Sai Boorlagadda <sb...@pivotal.io>
Authored: Wed Mar 2 12:54:15 2016 -0800
Committer: Sai Boorlagadda <sb...@pivotal.io>
Committed: Thu Mar 3 10:14:03 2016 -0800

----------------------------------------------------------------------
 .../cache/ClientServerTransactionDUnitTest.java | 58 +++++++++++++-------
 1 file changed, 39 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/7e354942/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/ClientServerTransactionDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/ClientServerTransactionDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/ClientServerTransactionDUnitTest.java
index add43a0..28e6419 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/ClientServerTransactionDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/ClientServerTransactionDUnitTest.java
@@ -388,22 +388,26 @@ public class ClientServerTransactionDUnitTest extends RemoteTransactionDUnitTest
   }
 
   public void testBasicCommitOnEmpty() {
-    doBasicCommit(false, false);
+    doBasicTransaction(false, false, true);
   }
   
   public void testBasicCommitOnEmptyUsingJTA() {
-    doBasicCommit(false, true);
+    doBasicTransaction(false, true, true);
   }
 
   public void testBasicCommit() {
-    doBasicCommit(true, false);
+    doBasicTransaction(true, false, true);
   }
   
   public void testBasicCommitUsingJTA() {
-    doBasicCommit(true, true);
+    doBasicTransaction(true, true, true);
   }
   
-  private void doBasicCommit(final boolean prePopulateData, final boolean useJTA) {
+  public void testBasicRollbackUsingJTA() {
+    doBasicTransaction(true, true, false);
+  }
+  
+  private void doBasicTransaction(final boolean prePopulateData, final boolean useJTA, final boolean isCommit) {
     Host host = Host.getHost(0);
     VM server = host.getVM(0);
     VM client = host.getVM(1);
@@ -473,18 +477,28 @@ public class ClientServerTransactionDUnitTest extends RemoteTransactionDUnitTest
             "pr sized should be " + MAX_ENTRIES + " but it is:" + pr.size(),
             MAX_ENTRIES, pr.size());
         com.gemstone.gemfire.test.dunit.LogWriterUtils.getLogWriter().info("committing transaction");
-        if (useJTA) {
-          utx.commit();
+        if (isCommit) {
+          if (useJTA) {
+            utx.commit();
+          } else {
+            getCache().getCacheTransactionManager().commit();
+          }
         } else {
-          getCache().getCacheTransactionManager().commit();
+          if (useJTA) {
+            utx.rollback();
+          } else {
+            getCache().getCacheTransactionManager().rollback();
+          }
         }
-        com.gemstone.gemfire.test.dunit.LogWriterUtils.getLogWriter().info("done committing transaction");
+        com.gemstone.gemfire.test.dunit.LogWriterUtils. getLogWriter().info("done " + (isCommit ? "committing" : "rollingback") + "transaction");
+        int expectedRegionSize = isCommit ? MAX_ENTRIES : 5;
+
         assertEquals(
-            "r sized should be " + MAX_ENTRIES + " but it is:" + r.size(),
-            MAX_ENTRIES, r.size());
+            "r sized should be " + expectedRegionSize + " but it is:" + r.size(),
+            expectedRegionSize, r.size());
         assertEquals(
-            "pr sized should be " + MAX_ENTRIES + " but it is:" + pr.size(),
-            MAX_ENTRIES, pr.size());
+            "pr sized should be " + expectedRegionSize + " but it is:" + pr.size(),
+            expectedRegionSize, pr.size());
 
         return null;
       }
@@ -494,12 +508,13 @@ public class ClientServerTransactionDUnitTest extends RemoteTransactionDUnitTest
       public Object call() throws Exception {
         Region<Integer, String> r = getGemfireCache().getRegion(D_REFERENCE);
         Region<CustId, Customer> pr = getGemfireCache().getRegion(CUSTOMER);
+        int expectedRegionSize = isCommit ? MAX_ENTRIES : 5;
         assertEquals(
-            "r sized should be " + MAX_ENTRIES + " but it is:" + r.size(),
-            MAX_ENTRIES, r.size());
+            "r sized should be " + expectedRegionSize + " but it is:" + r.size(),
+            expectedRegionSize, r.size());
         assertEquals(
-            "pr sized should be " + MAX_ENTRIES + " but it is:" + pr.size(),
-            MAX_ENTRIES, pr.size());
+            "pr sized should be " + expectedRegionSize + " but it is:" + pr.size(),
+            expectedRegionSize, pr.size());
         return null;
       }
     });
@@ -512,8 +527,13 @@ public class ClientServerTransactionDUnitTest extends RemoteTransactionDUnitTest
         for (int i = 0; i < MAX_ENTRIES; i++) {
           CustId custId = new CustId(i);
           Customer cust = new Customer("name"+suffix+i, "address"+suffix+i);
-          assertEquals(cust, r.get(custId));
-          assertEquals(cust, pr.get(custId));
+          if (isCommit) {
+            assertEquals(cust, r.get(custId));
+            assertEquals(cust, pr.get(custId));
+          } else {
+            assertNotSame(cust, r.get(custId));
+            assertNotSame(cust, pr.get(custId));
+          }
         }
         return null;
       }


[03/14] incubator-geode git commit: GEDOE-856: Unit tests for TinyMemoryBlock, a nested class in FreeListManager.

Posted by kl...@apache.org.
GEDOE-856: Unit tests for TinyMemoryBlock, a nested class in
FreeListManager.

 To give testing access to the class, the access modifier of
 TinyMemoryBlock and it's constructor has been changed from private to protected.

this closes #108


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/00b4c842
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/00b4c842
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/00b4c842

Branch: refs/heads/feature/GEODE-949-2
Commit: 00b4c842832318d133c816afb345c84f2180b809
Parents: d067f41
Author: Ken Howe <kh...@pivotal.io>
Authored: Fri Feb 26 10:04:30 2016 -0800
Committer: Sai Boorlagadda <sb...@pivotal.io>
Committed: Tue Mar 1 10:45:49 2016 -0800

----------------------------------------------------------------------
 .../internal/offheap/FreeListManager.java       |   4 +-
 .../offheap/TinyMemoryBlockJUnitTest.java       | 244 +++++++++++++++++++
 2 files changed, 246 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/00b4c842/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
index a716f14..b816eb9 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
@@ -779,11 +779,11 @@ public class FreeListManager {
   /**
    * Used to represent an address from a tiny free list as a MemoryBlock
    */
-  private static final class TinyMemoryBlock implements MemoryBlock {
+  protected static final class TinyMemoryBlock implements MemoryBlock {
     private final long address;
     private final int freeListId;
 
-    private TinyMemoryBlock(long address, int freeListId) {
+    protected TinyMemoryBlock(long address, int freeListId) {
       this.address = address;
       this.freeListId = freeListId;
     }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/00b4c842/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/TinyMemoryBlockJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/TinyMemoryBlockJUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/TinyMemoryBlockJUnitTest.java
new file mode 100644
index 0000000..1626a15
--- /dev/null
+++ b/geode-core/src/test/java/com/gemstone/gemfire/internal/offheap/TinyMemoryBlockJUnitTest.java
@@ -0,0 +1,244 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.gemstone.gemfire.internal.offheap;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+
+import java.nio.ByteBuffer;
+
+import org.assertj.core.api.JUnitSoftAssertions;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.ExpectedException;
+
+import com.gemstone.gemfire.internal.cache.EntryEventImpl;
+import com.gemstone.gemfire.internal.offheap.MemoryBlock.State;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+@Category(UnitTest.class)
+public class TinyMemoryBlockJUnitTest {
+
+  private SimpleMemoryAllocatorImpl ma;
+  private OutOfOffHeapMemoryListener ooohml;
+  private OffHeapMemoryStats stats;
+
+  private AddressableMemoryChunk[] slabs = {
+      new UnsafeMemoryChunk((int)OffHeapStorage.MIN_SLAB_SIZE),
+      new UnsafeMemoryChunk((int)OffHeapStorage.MIN_SLAB_SIZE),
+      new UnsafeMemoryChunk((int)OffHeapStorage.MIN_SLAB_SIZE)
+  };
+
+  private static class TestableFreeListManager extends FreeListManager {
+    TestableFreeListManager(SimpleMemoryAllocatorImpl ma, final AddressableMemoryChunk[] slabs) {
+      super (ma, slabs);
+    }
+  }
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  @Rule
+  public JUnitSoftAssertions softly = new JUnitSoftAssertions();
+
+  @BeforeClass
+  public static void setUpBeforeClass() throws Exception {
+  }
+
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception {
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    ooohml = mock(OutOfOffHeapMemoryListener.class);
+    stats = mock(OffHeapMemoryStats.class);
+    ma = (SimpleMemoryAllocatorImpl) SimpleMemoryAllocatorImpl.createForUnitTest(ooohml, stats, slabs);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    SimpleMemoryAllocatorImpl.freeOffHeapMemory();
+  }
+
+  protected Object getValue() {
+    return Long.valueOf(Long.MAX_VALUE);
+  }
+
+  private MemoryChunkWithRefCount createChunk(byte[] v, boolean isSerialized, boolean isCompressed) {
+    MemoryChunkWithRefCount chunk = (MemoryChunkWithRefCount) ma.allocateAndInitialize(v, isSerialized, isCompressed);
+    return chunk;
+  }
+
+  private MemoryChunkWithRefCount createValueAsSerializedStoredObject(Object value, boolean isCompressed) {
+    byte[] valueInSerializedByteArray = EntryEventImpl.serialize(value);
+
+    boolean isSerialized = true;
+
+    MemoryChunkWithRefCount createdObject = createChunk(valueInSerializedByteArray, isSerialized, isCompressed);
+    return createdObject;
+  }
+
+  private byte[] convertValueToByteArray(Object value) {
+    return ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong((Long) value).array();
+  }
+
+  private MemoryChunkWithRefCount createValueAsUnserializedStoredObject(Object value, boolean isCompressed) {
+    byte[] valueInByteArray;
+    if (value instanceof Long) {
+      valueInByteArray = convertValueToByteArray(value);
+    } else {
+      valueInByteArray = (byte[]) value;
+    }
+
+    boolean isSerialized = false;
+
+    MemoryChunkWithRefCount createdObject = createChunk(valueInByteArray, isSerialized, isCompressed);
+    return createdObject;
+  }
+
+   @Test
+  public void constructorReturnsNonNullMemoryBlock() {
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(slabs[0].getMemoryAddress(), 0);
+    softly.assertThat(mb).isNotNull();
+  }
+
+  @Test
+  public void stateAlwaysEqualsDeallocated() {
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(slabs[0].getMemoryAddress(), 0);
+    softly.assertThat(mb.getState()).isEqualTo(State.DEALLOCATED);
+  }
+
+  @Test
+  public void getMemoryAddressReturnsAddressBlockWasContructedFrom() {
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(slabs[0].getMemoryAddress(), 0);
+    softly.assertThat(mb.getMemoryAddress()).isEqualTo(slabs[0].getMemoryAddress());
+  }
+
+  @Test
+  public void getBlockSizeReturnsReturnsSizeOfUnderlyingChunk() {
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(new ObjectChunk(slabs[0].getMemoryAddress(), slabs[0].getSize()).getMemoryAddress(), 0);
+    softly.assertThat(mb.getBlockSize()).isEqualTo(slabs[0].getSize());
+  }
+
+  @Test
+  public void getNextBlockThrowsUnsupportedOperationException() {
+    expectedException.expect(UnsupportedOperationException.class);
+
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(new ObjectChunk(slabs[0].getMemoryAddress(), slabs[0].getSize()).getMemoryAddress(), 0);
+    mb.getNextBlock();
+    fail("getNextBlock failed to throw UnsupportedOperationException");
+  }
+
+  @Test
+  public void getSlabIdThrowsUnsupportedOperationException() {
+    expectedException.expect(UnsupportedOperationException.class);
+
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(new ObjectChunk(slabs[0].getMemoryAddress(), slabs[0].getSize()).getMemoryAddress(), 0);
+    mb.getSlabId();
+    fail("getSlabId failed to throw UnsupportedOperationException");
+  }
+
+  @Test
+  public void getFreeListIdReturnsIdBlockWasConstructedWith() {
+    MemoryBlock mb0 = new TestableFreeListManager.TinyMemoryBlock(new ObjectChunk(slabs[0].getMemoryAddress(), slabs[0].getSize()).getMemoryAddress(), 0);
+    MemoryBlock mb1 = new TestableFreeListManager.TinyMemoryBlock(new ObjectChunk(slabs[1].getMemoryAddress(), slabs[1].getSize()).getMemoryAddress(), 1);
+    softly.assertThat(mb0.getFreeListId()).isEqualTo(0);
+    softly.assertThat(mb1.getFreeListId()).isEqualTo(1);
+  }
+
+  @Test
+  public void getRefCountReturnsZero() {
+    MemoryBlock mb0 = new TestableFreeListManager.TinyMemoryBlock(new ObjectChunk(slabs[0].getMemoryAddress(), slabs[0].getSize()).getMemoryAddress(), 0);
+    MemoryBlock mb1 = new TestableFreeListManager.TinyMemoryBlock(new ObjectChunk(slabs[1].getMemoryAddress(), slabs[1].getSize()).getMemoryAddress(), 1);
+    softly.assertThat(mb0.getRefCount()).isEqualTo(0);
+    softly.assertThat(mb1.getRefCount()).isEqualTo(0);
+  }
+
+  @Test
+  public void getDataTypeReturnsNA() {
+    Object obj = getValue();
+    boolean compressed = false;
+
+    MemoryChunkWithRefCount storedObject0 = createValueAsSerializedStoredObject(obj, compressed);
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(((MemoryBlock)storedObject0).getMemoryAddress(), 0);
+    softly.assertThat(mb.getDataType()).isEqualTo("N/A");
+  }
+
+  @Test
+  public void getDataValueReturnsNull() {
+    Object obj = getValue();
+    boolean compressed = false;
+
+    MemoryChunkWithRefCount storedObject0 = createValueAsSerializedStoredObject(obj, compressed);
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(((MemoryBlock)storedObject0).getMemoryAddress(), 0);
+    softly.assertThat(mb.getDataValue()).isNull();
+  }
+
+  @Test
+  public void isSerializedReturnsFalse() {
+    Object obj = getValue();
+    boolean compressed = false;
+
+    MemoryChunkWithRefCount storedObject0 = createValueAsSerializedStoredObject(obj, compressed);
+    MemoryChunkWithRefCount storedObject1 = createValueAsUnserializedStoredObject(obj, compressed);
+    MemoryBlock mb0 = new TestableFreeListManager.TinyMemoryBlock(((MemoryBlock)storedObject0).getMemoryAddress(), 0);
+    MemoryBlock mb1 = new TestableFreeListManager.TinyMemoryBlock(((MemoryBlock)storedObject1).getMemoryAddress(), 0);
+    softly.assertThat(mb0.isSerialized()).isFalse();
+    softly.assertThat(mb1.isSerialized()).isFalse();
+  }
+
+  @Test
+  public void isCompressedReturnsFalse() {
+    Object obj = getValue();
+    boolean compressed = false;
+    MemoryChunkWithRefCount storedObject0 = createValueAsUnserializedStoredObject(obj, compressed);
+    MemoryChunkWithRefCount storedObject1 = createValueAsUnserializedStoredObject(obj, compressed = true);
+    MemoryBlock mb0 = new TestableFreeListManager.TinyMemoryBlock(((MemoryBlock)storedObject0).getMemoryAddress(), 0);
+    MemoryBlock mb1 = new TestableFreeListManager.TinyMemoryBlock(((MemoryBlock)storedObject1).getMemoryAddress(), 0);
+    softly.assertThat(mb0.isCompressed()).isFalse();
+    softly.assertThat(mb1.isCompressed()).isFalse();
+  }
+
+  @Test
+  public void equalsComparesAddressesOfTinyMemoryBlocks() {
+    MemoryBlock mb0 = new TestableFreeListManager.TinyMemoryBlock(slabs[0].getMemoryAddress(), 0);
+    MemoryBlock mb1 = new TestableFreeListManager.TinyMemoryBlock(slabs[0].getMemoryAddress(), 0);
+    MemoryBlock mb2 = new TestableFreeListManager.TinyMemoryBlock(slabs[1].getMemoryAddress(), 0);
+    softly.assertThat(mb0.equals(mb1)).isTrue();
+    softly.assertThat(mb0.equals(mb2)).isFalse();
+  }
+
+  @Test
+  public void equalsNotTinyMemoryBlockReturnsFalse() {
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(slabs[0].getMemoryAddress(), 0);
+    softly.assertThat(mb.equals(slabs[0])).isFalse();
+  }
+
+  @Test
+  public void hashCodeReturnsHashOfUnderlyingMemory() {
+    MemoryBlock mb = new TestableFreeListManager.TinyMemoryBlock(slabs[0].getMemoryAddress(), 0);
+    softly.assertThat(mb.hashCode()).isEqualTo(new ObjectChunk(slabs[0].getMemoryAddress(), slabs[0].getSize()).hashCode());
+  }
+
+}


[08/14] incubator-geode git commit: GEODE-1042

Posted by kl...@apache.org.
GEODE-1042

shadowPR's entries will not have version tag. So enforce checking if versionTag
is null.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/e7e1fc66
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/e7e1fc66
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/e7e1fc66

Branch: refs/heads/feature/GEODE-949-2
Commit: e7e1fc6660fc54ae449abed82fd0edbe06531050
Parents: 0ca2f2e
Author: zhouxh <gz...@pivotal.io>
Authored: Wed Mar 2 17:02:49 2016 -0800
Committer: zhouxh <gz...@pivotal.io>
Committed: Wed Mar 2 17:02:49 2016 -0800

----------------------------------------------------------------------
 .../gemfire/internal/cache/partitioned/FetchEntriesMessage.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e7e1fc66/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/partitioned/FetchEntriesMessage.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/partitioned/FetchEntriesMessage.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/partitioned/FetchEntriesMessage.java
index 0342164..fda15c4 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/partitioned/FetchEntriesMessage.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/partitioned/FetchEntriesMessage.java
@@ -559,7 +559,7 @@ public final class FetchEntriesMessage extends PartitionMessage
               VersionTag versionTag = DataSerializer.readObject(in);
               
               //Fix for 47260 - canonicalize the mebmer ids to avoid an OOME
-              VersionSource id = versionTag.getMemberID();
+              VersionSource id = versionTag==null?null:versionTag.getMemberID();
               if (id != null) {
                 if(canonicalMembers.containsKey(id)) {
                   versionTag.setMemberID(canonicalMembers.get(id));


[06/14] incubator-geode git commit: GEODE-1029 fixed test issue, where system is not working properly.

Posted by kl...@apache.org.
GEODE-1029 fixed test issue, where system is not working properly.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/e1a0830e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/e1a0830e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/e1a0830e

Branch: refs/heads/feature/GEODE-949-2
Commit: e1a0830e2eda15cf7a8ec2281b521619333c8e53
Parents: 3996940
Author: Hitesh Khamesra <hk...@pivotal.io>
Authored: Tue Mar 1 14:26:48 2016 -0800
Committer: Hitesh Khamesra <hk...@pivotal.io>
Committed: Wed Mar 2 09:36:34 2016 -0800

----------------------------------------------------------------------
 .../gemfire/internal/cache/CachedDeserializableFactory.java     | 4 ++--
 .../gemfire/cache30/DistributedMulticastRegionDUnitTest.java    | 5 +++--
 2 files changed, 5 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e1a0830e/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/CachedDeserializableFactory.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/CachedDeserializableFactory.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/CachedDeserializableFactory.java
index 9120e37..e1bf984 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/CachedDeserializableFactory.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/CachedDeserializableFactory.java
@@ -35,8 +35,8 @@ import com.gemstone.gemfire.pdx.PdxInstance;
  *
  */
 public class CachedDeserializableFactory {
-  private static final boolean PREFER_DESERIALIZED = ! Boolean.getBoolean("gemfire.PREFER_SERIALIZED");
-  private static final boolean STORE_ALL_VALUE_FORMS = Boolean.getBoolean("gemfire.STORE_ALL_VALUE_FORMS");
+  public static boolean PREFER_DESERIALIZED = ! Boolean.getBoolean("gemfire.PREFER_SERIALIZED");
+  public static boolean STORE_ALL_VALUE_FORMS = Boolean.getBoolean("gemfire.STORE_ALL_VALUE_FORMS");
 
   /**
    * Currently GFE always wants a CachedDeserializable wrapper.

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e1a0830e/geode-core/src/test/java/com/gemstone/gemfire/cache30/DistributedMulticastRegionDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/cache30/DistributedMulticastRegionDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/cache30/DistributedMulticastRegionDUnitTest.java
index 72b7941..9a0a6dd 100755
--- a/geode-core/src/test/java/com/gemstone/gemfire/cache30/DistributedMulticastRegionDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/cache30/DistributedMulticastRegionDUnitTest.java
@@ -34,6 +34,7 @@ import com.gemstone.gemfire.distributed.internal.InternalLocator;
 import com.gemstone.gemfire.distributed.internal.ReplyException;
 import com.gemstone.gemfire.distributed.internal.SharedConfiguration;
 import com.gemstone.gemfire.internal.AvailablePortHelper;
+import com.gemstone.gemfire.internal.cache.CachedDeserializableFactory;
 import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
 import com.gemstone.gemfire.internal.cache.OffHeapTestUtil;
 import com.gemstone.gemfire.pdx.PdxReader;
@@ -159,7 +160,7 @@ public class DistributedMulticastRegionDUnitTest extends CacheTestCase {
       
       SerializableRunnable setSysProp = new CacheSerializableRunnable("Create Region") {
         public void run2() throws CacheException {
-          System.setProperty("gemfire.STORE_ALL_VALUE_FORMS", "true");
+          CachedDeserializableFactory.STORE_ALL_VALUE_FORMS = true;
         }
       };
       
@@ -225,7 +226,7 @@ public class DistributedMulticastRegionDUnitTest extends CacheTestCase {
     }finally {
       SerializableRunnable unsetSysProp = new CacheSerializableRunnable("Create Region") {
         public void run2() throws CacheException {
-          System.setProperty("gemfire.STORE_ALL_VALUE_FORMS", "false");          
+          CachedDeserializableFactory.STORE_ALL_VALUE_FORMS = false;
         }
       };
       vm0.invoke(unsetSysProp);


[12/14] incubator-geode git commit: Merge remote-tracking branch 'origin/develop' into feature/GEODE-949-2

Posted by kl...@apache.org.
Merge remote-tracking branch 'origin/develop' into feature/GEODE-949-2


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/c14f552a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/c14f552a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/c14f552a

Branch: refs/heads/feature/GEODE-949-2
Commit: c14f552a6b12d6e6a7092ef42ae1a508ecb4516b
Parents: 5f18b9d 23950e8
Author: Kirk Lund <kl...@apache.org>
Authored: Fri Mar 4 09:18:16 2016 -0800
Committer: Kirk Lund <kl...@apache.org>
Committed: Fri Mar 4 09:18:16 2016 -0800

----------------------------------------------------------------------
 .../operations/PutAllOperationContext.java      | 275 +----------------
 .../operations/internal/UpdateOnlyMap.java      | 304 +++++++++++++++++++
 .../query/internal/index/IndexElemArray.java    |  34 +--
 .../query/internal/index/IndexManager.java      |  10 +-
 .../cache/CachedDeserializableFactory.java      |   4 +-
 .../cache/partitioned/FetchEntriesMessage.java  |   2 +-
 .../cache/tier/sockets/command/PutAll.java      |   4 +
 .../cache/tier/sockets/command/PutAll70.java    |   4 +
 .../cache/tier/sockets/command/PutAll80.java    |   4 +
 .../cache/wan/GatewaySenderEventImpl.java       |  38 ++-
 .../internal/offheap/FreeListManager.java       |  43 +--
 .../internal/offheap/OffHeapStorage.java        |   2 +-
 .../internal/index/IndexElemArrayJUnitTest.java |  66 +++-
 .../DistributedMulticastRegionDUnitTest.java    |   5 +-
 .../cache/ClientServerTransactionDUnitTest.java |  58 ++--
 .../cache/wan/AsyncEventQueueTestBase.java      |  86 +++++-
 .../asyncqueue/AsyncEventListenerDUnitTest.java |  21 +-
 .../internal/offheap/FreeListManagerTest.java   |  83 +++++
 .../offheap/TinyMemoryBlockJUnitTest.java       | 244 +++++++++++++++
 .../management/OffHeapManagementDUnitTest.java  |  54 +++-
 .../security/ClientAuthorizationDUnitTest.java  |  29 ++
 .../gemfire/security/SecurityTestUtil.java      |  44 +++
 .../gemfire/codeAnalysis/excludedClasses.txt    |   1 +
 .../internal/distributed/LuceneFunction.java    |   3 +-
 .../pulse/internal/data/JMXDataUpdater.java     |  85 +-----
 .../service/ClusterSelectedRegionService.java   |   8 +-
 .../ClusterSelectedRegionsMemberService.java    |   8 +-
 27 files changed, 1058 insertions(+), 461 deletions(-)
----------------------------------------------------------------------