http://git-wip-us.apache.org/repos/asf/geode/blob/f79beb1e/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/IBuilder.java ---------------------------------------------------------------------- diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/IBuilder.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/IBuilder.java deleted file mode 100644 index 28340c6..0000000 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/IBuilder.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2011 Clearspring Technologies, Inc. - * - * Licensed 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 org.apache.geode.redis.internal.hll; - - -public interface IBuilder<T> { - - T build(); - - int sizeof(); -}
http://git-wip-us.apache.org/repos/asf/geode/blob/f79beb1e/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/ICardinality.java ---------------------------------------------------------------------- diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/ICardinality.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/ICardinality.java deleted file mode 100644 index 71369b1..0000000 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/ICardinality.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2011 Clearspring Technologies, Inc. - * - * Licensed 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 org.apache.geode.redis.internal.hll; - - -import java.io.IOException; - - -public interface ICardinality { - - /** - * @param o stream element - * @return false if the value returned by cardinality() is unaffected by the appearance of o in - * the stream. - */ - boolean offer(Object o); - - /** - * Offer the value as a hashed long value - * - * @param hashedLong - the hash of the item to offer to the estimator - * @return false if the value returned by cardinality() is unaffected by the appearance of - * hashedLong in the stream - */ - boolean offerHashed(long hashedLong); - - /** - * Offer the value as a hashed long value - * - * @param hashedInt - the hash of the item to offer to the estimator - * @return false if the value returned by cardinality() is unaffected by the appearance of - * hashedInt in the stream - */ - boolean offerHashed(int hashedInt); - - /** - * @return the number of unique elements in the stream or an estimate thereof - */ - long cardinality(); - - /** - * @return size in bytes needed for serialization - */ - int sizeof(); - - /** - * @return byte[] - * @throws IOException - */ - byte[] getBytes() throws IOException; - - /** - * Merges estimators to produce a new estimator for the combined streams of this estimator and - * those passed as arguments. - * <p/> - * Nor this estimator nor the one passed as parameters are modified. - * - * @param estimators Zero or more compatible estimators - * @throws CardinalityMergeException If at least one of the estimators is not compatible with this - * one - */ - ICardinality merge(ICardinality... estimators) throws CardinalityMergeException; -} http://git-wip-us.apache.org/repos/asf/geode/blob/f79beb1e/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/MurmurHash.java ---------------------------------------------------------------------- diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/MurmurHash.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/MurmurHash.java deleted file mode 100644 index e5c1b1a..0000000 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/MurmurHash.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * 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 org.apache.geode.redis.internal.hll; - - -/** - * This is a very fast, non-cryptographic hash suitable for general hash-based lookup. See - * http://murmurhash.googlepages.com/ for more details. - * <p/> - * <p> - * The C version of MurmurHash 2.0 found at that site was ported to Java by Andrzej Bialecki (ab at - * getopt org). - * </p> - */ -public class MurmurHash { - public static int hash(Object o) { - if (o == null) { - return 0; - } - if (o instanceof Long) { - return hashLong((Long) o); - } - if (o instanceof Integer) { - return hashLong((Integer) o); - } - if (o instanceof Double) { - return hashLong(Double.doubleToRawLongBits((Double) o)); - } - if (o instanceof Float) { - return hashLong(Float.floatToRawIntBits((Float) o)); - } - if (o instanceof String) { - return hash(((String) o).getBytes()); - } - if (o instanceof byte[]) { - return hash((byte[]) o); - } - return hash(o.toString()); - } - - public static int hash(byte[] data) { - return hash(data, 0, data.length, -1); - } - - public static int hash(byte[] data, int seed) { - return hash(data, 0, data.length, seed); - } - - public static int hash(byte[] data, int offset, int length, int seed) { - int m = 0x5bd1e995; - int r = 24; - - int h = seed ^ length; - - int len_4 = length >> 2; - - for (int i = 0; i < len_4; i++) { - int i_4 = i << 2; - int k = data[offset + i_4 + 3]; - k = k << 8; - k = k | (data[offset + i_4 + 2] & 0xff); - k = k << 8; - k = k | (data[offset + i_4 + 1] & 0xff); - k = k << 8; - k = k | (data[offset + i_4 + 0] & 0xff); - k *= m; - k ^= k >>> r; - k *= m; - h *= m; - h ^= k; - } - - // avoid calculating modulo - int len_m = len_4 << 2; - int left = length - len_m; - - if (left != 0) { - if (left >= 3) { - h ^= (int) data[offset + length - 3] << 16; - } - if (left >= 2) { - h ^= (int) data[offset + length - 2] << 8; - } - if (left >= 1) { - h ^= (int) data[offset + length - 1]; - } - - h *= m; - } - - h ^= h >>> 13; - h *= m; - h ^= h >>> 15; - - return h; - } - - public static int hashLong(long data) { - int m = 0x5bd1e995; - int r = 24; - - int h = 0; - - int k = (int) data * m; - k ^= k >>> r; - h ^= k * m; - - k = (int) (data >> 32) * m; - k ^= k >>> r; - h *= m; - h ^= k * m; - - h ^= h >>> 13; - h *= m; - h ^= h >>> 15; - - return h; - } - - public static long hash64(Object o) { - if (o == null) { - return 0l; - } else if (o instanceof String) { - final byte[] bytes = ((String) o).getBytes(); - return hash64(bytes, bytes.length); - } else if (o instanceof byte[]) { - final byte[] bytes = (byte[]) o; - return hash64(bytes, bytes.length); - } - return hash64(o.toString()); - } - - // 64 bit implementation copied from here: https://github.com/tnm/murmurhash-java - - /** - * Generates 64 bit hash from byte array with default seed value. - * - * @param data byte array to hash - * @param length length of the array to hash - * @return 64 bit hash of the given string - */ - public static long hash64(final byte[] data, int length) { - return hash64(data, length, 0xe17a1465); - } - - - /** - * Generates 64 bit hash from byte array of the given length and seed. - * - * @param data byte array to hash - * @param length length of the array to hash - * @param seed initial seed value - * @return 64 bit hash of the given array - */ - public static long hash64(final byte[] data, int length, int seed) { - final long m = 0xc6a4a7935bd1e995L; - final int r = 47; - - long h = (seed & 0xffffffffl) ^ (length * m); - - int length8 = length / 8; - - for (int i = 0; i < length8; i++) { - final int i8 = i * 8; - long k = ((long) data[i8 + 0] & 0xff) + (((long) data[i8 + 1] & 0xff) << 8) - + (((long) data[i8 + 2] & 0xff) << 16) + (((long) data[i8 + 3] & 0xff) << 24) - + (((long) data[i8 + 4] & 0xff) << 32) + (((long) data[i8 + 5] & 0xff) << 40) - + (((long) data[i8 + 6] & 0xff) << 48) + (((long) data[i8 + 7] & 0xff) << 56); - - k *= m; - k ^= k >>> r; - k *= m; - - h ^= k; - h *= m; - } - - switch (length % 8) { - case 7: - h ^= (long) (data[(length & ~7) + 6] & 0xff) << 48; - case 6: - h ^= (long) (data[(length & ~7) + 5] & 0xff) << 40; - case 5: - h ^= (long) (data[(length & ~7) + 4] & 0xff) << 32; - case 4: - h ^= (long) (data[(length & ~7) + 3] & 0xff) << 24; - case 3: - h ^= (long) (data[(length & ~7) + 2] & 0xff) << 16; - case 2: - h ^= (long) (data[(length & ~7) + 1] & 0xff) << 8; - case 1: - h ^= (long) (data[length & ~7] & 0xff); - h *= m; - }; - - h ^= h >>> r; - h *= m; - h ^= h >>> r; - - return h; - } -} http://git-wip-us.apache.org/repos/asf/geode/blob/f79beb1e/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/RegisterSet.java ---------------------------------------------------------------------- diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/RegisterSet.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/RegisterSet.java deleted file mode 100644 index 97ac98d..0000000 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/hll/RegisterSet.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2012 Clearspring Technologies, Inc. - * - * Licensed 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 org.apache.geode.redis.internal.hll; - - -public class RegisterSet { - - public final static int LOG2_BITS_PER_WORD = 6; - public final static int REGISTER_SIZE = 5; - - public final int count; - public final int size; - - private final int[] M; - - public RegisterSet(int count) { - this(count, null); - } - - public RegisterSet(int count, int[] initialValues) { - this.count = count; - - if (initialValues == null) { - this.M = new int[getSizeForCount(count)]; - } else { - this.M = initialValues; - } - this.size = this.M.length; - } - - public static int getBits(int count) { - return count / LOG2_BITS_PER_WORD; - } - - public static int getSizeForCount(int count) { - int bits = getBits(count); - if (bits == 0) { - return 1; - } else if (bits % Integer.SIZE == 0) { - return bits; - } else { - return bits + 1; - } - } - - public void set(int position, int value) { - int bucketPos = position / LOG2_BITS_PER_WORD; - int shift = REGISTER_SIZE * (position - (bucketPos * LOG2_BITS_PER_WORD)); - this.M[bucketPos] = (this.M[bucketPos] & ~(0x1f << shift)) | (value << shift); - } - - public int get(int position) { - int bucketPos = position / LOG2_BITS_PER_WORD; - int shift = REGISTER_SIZE * (position - (bucketPos * LOG2_BITS_PER_WORD)); - return (this.M[bucketPos] & (0x1f << shift)) >>> shift; - } - - public boolean updateIfGreater(int position, int value) { - int bucket = position / LOG2_BITS_PER_WORD; - int shift = REGISTER_SIZE * (position - (bucket * LOG2_BITS_PER_WORD)); - int mask = 0x1f << shift; - - // Use long to avoid sign issues with the left-most shift - long curVal = this.M[bucket] & mask; - long newVal = value << shift; - if (curVal < newVal) { - this.M[bucket] = (int) ((this.M[bucket] & ~mask) | newVal); - return true; - } else { - return false; - } - } - - public void merge(RegisterSet that) { - for (int bucket = 0; bucket < M.length; bucket++) { - int word = 0; - for (int j = 0; j < LOG2_BITS_PER_WORD; j++) { - int mask = 0x1f << (REGISTER_SIZE * j); - - int thisVal = (this.M[bucket] & mask); - int thatVal = (that.M[bucket] & mask); - word |= (thisVal < thatVal) ? thatVal : thisVal; - } - this.M[bucket] = word; - } - } - - int[] readOnlyBits() { - return M; - } - - public int[] bits() { - int[] copy = new int[size]; - System.arraycopy(M, 0, copy, 0, M.length); - return copy; - } -} http://git-wip-us.apache.org/repos/asf/geode/blob/f79beb1e/geode-redis/src/test/java/org/apache/geode/redis/ConcurrentStartTest.java ---------------------------------------------------------------------- diff --git a/geode-redis/src/test/java/org/apache/geode/redis/ConcurrentStartTest.java b/geode-redis/src/test/java/org/apache/geode/redis/ConcurrentStartTest.java index 4a5e717..7c2db3b 100644 --- a/geode-redis/src/test/java/org/apache/geode/redis/ConcurrentStartTest.java +++ b/geode-redis/src/test/java/org/apache/geode/redis/ConcurrentStartTest.java @@ -14,72 +14,86 @@ */ package org.apache.geode.redis; +import org.apache.geode.cache.Cache; +import org.apache.geode.cache.CacheFactory; +import org.apache.geode.distributed.DistributedSystem; +import org.apache.geode.internal.AvailablePortHelper; +import org.apache.geode.internal.cache.GemFireCacheImpl; import org.apache.geode.test.junit.categories.IntegrationTest; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.RestoreSystemProperties; import org.junit.experimental.categories.Category; +import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS; +import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT; + +import static org.junit.Assert.*; + // TODO I think this test can now be removed @Category(IntegrationTest.class) public class ConcurrentStartTest extends RedisTestBase { + private Cache cache; + private int numServers = 10; + + @Rule + public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(); + + @Before + public void setUp() { + System.setProperty(DistributedSystem.PROPERTIES_FILE_PROPERTY, + getClass().getSimpleName() + ".properties"); + } + + @After + public void tearDown() { + if (this.cache != null) { + this.cache.close(); + this.cache = null; + } + } + + @Test + public void testCachelessStart() throws InterruptedException { + runNServers(numServers); + GemFireCacheImpl.getInstance().close(); + } + + @Test + public void testCachefulStart() throws InterruptedException { + CacheFactory cf = new CacheFactory(); + cf.set(MCAST_PORT, "0"); + cf.set(LOCATORS, ""); + this.cache = cf.create(); + + runNServers(numServers); + } + + private void runNServers(int n) throws InterruptedException { + final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(numServers); + final Thread[] threads = new Thread[n]; + for (int i = 0; i < n; i++) { + final int j = i; + Runnable r = new Runnable() { + + @Override + public void run() { + GeodeRedisServer s = new GeodeRedisServer(ports[j]); + s.start(); + s.shutdown(); + } + }; - // private Cache cache; - // private int numServers = 10; - // - // @Rule - // public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(); - // - // @Before - // public void setUp() { - // System.setProperty(DistributedSystem.PROPERTIES_FILE_PROPERTY, - // getClass().getSimpleName() + ".properties"); - // } - // - // @After - // public void tearDown() { - // if (this.cache != null) { - // this.cache.close(); - // this.cache = null; - // } - // } - // - // @Test - // public void testCachelessStart() throws InterruptedException { - // runNServers(numServers); - // GemFireCacheImpl.getInstance().close(); - // } - // - // @Test - // public void testCachefulStart() throws InterruptedException { - // CacheFactory cf = new CacheFactory(); - // cf.set(MCAST_PORT, "0"); - // cf.set(LOCATORS, ""); - // this.cache = cf.create(); - // - // runNServers(numServers); - // } - // - // private void runNServers(int n) throws InterruptedException { - // final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(numServers); - // final Thread[] threads = new Thread[n]; - // for (int i = 0; i < n; i++) { - // final int j = i; - // Runnable r = new Runnable() { - // - // @Override - // public void run() { - // GeodeRedisServiceImpl s = new GeodeRedisServiceImpl(ports[j]); - // s.start(); - // s.stop(); - // } - // }; - // - // Thread t = new Thread(r); - // t.setDaemon(true); - // t.start(); - // threads[i] = t; - // } - // for (Thread t : threads) - // t.join(); - // this.cache = GemFireCacheImpl.getInstance(); - // assertFalse(this.cache.isClosed()); - // } + Thread t = new Thread(r); + t.setDaemon(true); + t.start(); + threads[i] = t; + } + for (Thread t : threads) + t.join(); + this.cache = GemFireCacheImpl.getInstance(); + assertFalse(this.cache.isClosed()); + } }