Merge remote-tracking branch 'origin/master'

This commit is contained in:
Rob Austin
2014-12-16 21:30:29 +00:00
5 changed files with 191 additions and 133 deletions
@@ -543,7 +543,6 @@ public class CHMUseCasesTest {
}
}
@Ignore("HCOLL-249 issue when using acquireUsingLocked() with ByteBufferBytes wrong string.length()")
@Test
public void testAcquireUsingWithByteBufferBytesValue() throws IOException {
@@ -564,6 +563,7 @@ public class CHMUseCasesTest {
try (WriteContext rc = map.acquireUsingLocked(key, value)) {
assertTrue(key instanceof IntValue);
assertTrue(value instanceof CharSequence);
value.limit(value.position());
}
assertTrue( map.get(key).length() == 0);
@@ -643,24 +643,24 @@ public class ChronicleMapTest {
InstantiationException, InterruptedException, ExecutionException {
// int runs = Integer.getInteger("runs", 10);
int procs = Runtime.getRuntime().availableProcessors();
int threads = procs * 3; // runs > 100 ? procs / 2 : procs;
if (procs > 8) procs--;
int threads = procs * 3;
ExecutorService es = Executors.newFixedThreadPool(procs);
for (int runs : new int[]{10, 50, 250, 500, 1000, 2500}) {
// JAVA 8 produces more garbage than previous versions for internal work.
// System.gc();
for (int runs : new int[]{1, 2, 5, 10, 25, 50, 100, 500, 1000, 2500}) {
final long entries = runs * 1000 * 1000L;
ChronicleMapBuilder<CharSequence, LongValue> builder = ChronicleMapBuilder
.of(CharSequence.class, LongValue.class)
.entries(entries)
.entryAndValueAlignment(OF_8_BYTES)
.actualSegments(8 * 1024)
.actualSegments(256)
.entrySize(24);
File tmpFile = File.createTempFile("testAcquirePerf", ".deleteme");
tmpFile.deleteOnExit();
final ChronicleMap<CharSequence, LongValue> map = builder.createPersistedTo(tmpFile);
int count = runs > 500 ? runs > 1200 ? 3 : 5 : 5;
int count = runs >= 5 ? 2 : 3;
final int independence = Math.min(procs, runs > 500 ? 8 : 4);
System.out.println("\nKey size: " + runs + " Million entries. " + builder);
for (int j = 0; j < count; j++) {
@@ -674,6 +674,7 @@ public class ChronicleMapTest {
LongValue value = nativeLongValue();
StringBuilder sb = new StringBuilder();
long next = 50 * 1000 * 1000;
Random rand = new Random();
// use a factor to give up to 10 digit numbers.
int factor = Math.max(1, (int) ((10 * 1000 * 1000 * 1000L - 1) / entries));
for (long j = t % independence; j < entries + independence - 1; j += independence) {
@@ -681,8 +682,15 @@ public class ChronicleMapTest {
sb.append("us:");
sb.append(j * factor);
long n;
try (WriteContext wc = map.acquireUsingLocked(sb, value)) {
n = value.addValue(1);
// 75% read
if (rand.nextBoolean() || rand.nextBoolean()) {
try (ReadContext rc = map.getUsingLocked(sb, value)) {
n = rc.present() ? value.getValue() + 1 : 1;
}
} else {
try (WriteContext wc = map.acquireUsingLocked(sb, value)) {
n = value.addValue(1);
}
}
assert n > 0 && n < 1000 : "Counter corrupted " + n;
if (t == 0 && j >= next) {
@@ -62,106 +62,133 @@ public class EntryCountMapTest {
@Test
public void testVerySmall() throws Exception {
int s = 1, i = 1;
// regression test.
testEntriesMaxSize(s, 1, 1, i);
testEntriesMaxSize(s, 2, 4, i);
testEntriesMaxSize(s, 4, 6, i);
testEntriesMaxSize(s, 8, 13, i);
testEntriesMaxSize(s, 16, 55, i); // todo fix the max.
testEntriesMaxSize(s, 32, 82, i); // todo fix the max.
testEntriesMaxSize(s, 64, 128, i);
testEntriesMaxSize(s, 128, 256, i);
}
@Test
public void testSmall() throws Exception {
for (int i = 0; i < 5; i++) {
for (int t = 0; t < 5; t++) {
int s = 1;
// regression test.
for (int s : new int[]{1, 2, 4, 8}) {
testEntriesMaxSize(s, 256, 510, i);
testEntriesMaxSize(s, 512, 1010, i);
testEntriesMaxSize(s, 1000, 1730, i);
testEntriesMaxSize(s, 2000, 2800, i);
testEntriesMaxSize(s, 4000, 5300, i);
testEntriesMaxSize(s, 5000, 6800, i);
testEntriesMaxSize(s, 8000, 10600, i);
testEntriesMaxSize(s, 12000, 16000, i);
testEntriesMaxSize(s, 16000, 21300, i);
testEntriesMaxSize(s, 1, 1);
testEntriesMaxSize(s, 2, 2);
testEntriesMaxSize(s, 4, 4);
testEntriesMaxSize(s, 8, 8);
testEntriesMaxSize(s, 16, 16);
testEntriesMaxSize(s, 32, 32);
testEntriesMaxSize(s, 64, 64);
testEntriesMaxSize(s, 128, 128);
testEntriesMaxSize(s, 256, 256);
testEntriesMaxSize(s, 512, 512);
s = 2;
// regression test.
testEntriesMaxSize(s, 8, 16);
testEntriesMaxSize(s, 16, 32);
testEntriesMaxSize(s, 32, 56);
testEntriesMaxSize(s, 64, 95);
testEntriesMaxSize(s, 128, 168);
testEntriesMaxSize(s, 256, 322);
testEntriesMaxSize(s, 512, 640);
s = 4;
// regression test.
testEntriesMaxSize(s, 32, 70);
testEntriesMaxSize(s, 64, 120);
testEntriesMaxSize(s, 128, 200);
testEntriesMaxSize(s, 256, 380);
testEntriesMaxSize(s, 512, 650);
for (int s2 : new int[]{1, 2, 4}) {
testEntriesMaxSize(s2, 1000, 1300);
testEntriesMaxSize(s2, 2000, 2500);
testEntriesMaxSize(s2, 4000, 5000);
testEntriesMaxSize(s2, 5000, 6200);
testEntriesMaxSize(s2, 8000, 9900);
testEntriesMaxSize(s2, 12000, 15000);
testEntriesMaxSize(s2, 16000, 20000);
}
}
// hyperbolic average gives more weight to small numbers.
System.out.printf("Score: %.2f%n", scoreCount / score);
}
@Ignore("HCOLL-251 Investigate test failure of net.openhft.chronicle.map" +
".EntryCountMapTest#testMedium")
@Test
public void testSmall() throws Exception {
for (int i = 0; i < 5; i++) {
{
int s = 8;
testEntriesMaxSize(s, 250, 400);
testEntriesMaxSize(s, 500, 770);
testEntriesMaxSize(s, 1000, 1400);
testEntriesMaxSize(s, 2000, 2800);
}
// regression test.
for (int s : new int[]{8, 16}) {
testEntriesMaxSize(s, 3000, 4200);
testEntriesMaxSize(s, 5000, 6900);
testEntriesMaxSize(s, 10000, 13000);
}
for (int s : new int[]{8, 16, 32}) {
testEntriesMaxSize(s, 8000, 11600);
testEntriesMaxSize(s, 12000, 16500);
testEntriesMaxSize(s, 16000, 22000);
testEntriesMaxSize(s, 24000, 31000);
testEntriesMaxSize(s, 32000, 41000);
}
}
// hyperbolic average gives more weight to small numbers.
System.out.printf("Score: %.2f%n", scoreCount / score);
}
@Ignore("Long running test")
@Test
public void testMedium() throws Exception {
for (int i = 0; i < 2; i++) {
for (int i = 0; i < 10; i++) {
// regression test.
int s = 16;
testEntriesMaxSize(s, 512, 1000, i);
testEntriesMaxSize(s, 1000, 2100, i);
testEntriesMaxSize(s, 2000, 3100, i);
testEntriesMaxSize(s, 4000, 5100, i);
testEntriesMaxSize(s, 5000, 7100, i);
testEntriesMaxSize(s, 8000, 11000, i);
testEntriesMaxSize(s, 12000, 17000, i);
testEntriesMaxSize(s, 16000, 22000, i);
s = 32;
testEntriesMaxSize(s, 2000, 3900, i);
testEntriesMaxSize(s, 4000, 5900, i);
testEntriesMaxSize(s, 5000, 7900, i);
testEntriesMaxSize(s, 8000, 12000, i);
testEntriesMaxSize(s, 12000, 17000, i);
testEntriesMaxSize(s, 16000, 23000, i);
testEntriesMaxSize(s, 32000, 46000, i);
s = 64;
testEntriesMaxSize(s, 5000, 7550, i);
testEntriesMaxSize(s, 8000, 11400, i);
testEntriesMaxSize(s, 12000, 18000, i);
testEntriesMaxSize(s, 16000, 24000, i);
testEntriesMaxSize(s, 32000, 47000, i);
testEntriesMaxSize(s, 40000, 60000, i);
s = 128;
testEntriesMaxSize(s, 16000, 24000, i);
testEntriesMaxSize(s, 32000, 50000, i);
testEntriesMaxSize(s, 40000, 62000, i);
testEntriesMaxSize(s, 64000, 98000, i);
testEntriesMaxSize(s, 129000, 204000, i);
s = 256;
testEntriesMaxSize(s, 64000, 100000, i);
testEntriesMaxSize(s, 129000, 213000, i);
for (int s : new int[]{16, 32, 64}) {
int s3 = s * s * s;
testEntriesMaxSize(s, s3, s3 * 14 / 10);
testEntriesMaxSize(s, s3 * 3 / 2, s3 * 2);
testEntriesMaxSize(s, s3 * 2, s3 * 27 / 10);
}
for (int s : new int[]{128, 256, 512}) {
int s2 = s * s;
testEntriesMaxSize(s, s2, s2 * 15 / 10);
}
for (int s : new int[]{1024, 2048, 4096}) {
int s2 = s * 1024;
testEntriesMaxSize(s, s2, s2 * 14 / 10);
}
}
// hyperbolic average gives more weight to small numbers.
System.out.printf("Score: %.2f%n", scoreCount / score);
}
@Test
@Ignore ("ignore because its a scalability test")
@Ignore("ignore because its a scalability test")
public void testLarge() throws Exception {
int s = 8 * 1024;
for (int i = 0; i < 10; i++) {
System.out.println("i:" + i);
int entries = s * s;
testEntriesMaxSize(s, entries * 4 / 5, entries * 4 / 3, i);
testEntriesMaxSize(s, entries * 4 / 5, entries * 4 / 3);
// testEntriesMaxSize(s, entries + 100, entries * 3 / 2, i);
entries *= 2;
testEntriesMaxSize(s, entries * 4 / 5, entries * 4 / 3, i);
testEntriesMaxSize(s, entries * 4 / 5, entries * 4 / 3);
// testEntriesMaxSize(s, entries + 100, entries * 3 / 2, i);
}
// hyperbolic average gives more weight to small numbers.
System.out.printf("Score: %.2f%n", scoreCount / score);
}
private void testEntriesMaxSize(int segments, int minSize, int maxSize, int seed) throws IOException {
int counter = minSize + new Random(seed + segments * 1000).nextInt(9999);
private void testEntriesMaxSize(int segments, int minSize, int maxSize) throws IOException {
assert minSize <= maxSize;
Random random = new Random();
int counter = minSize + random.nextInt(9999 + maxSize);
int stride = 1 + random.nextInt(100);
ChronicleMap<CharSequence, LongValue> map = getSharedMap(minSize, segments, 32);
LongValue longValue = newDirectReference(LongValue.class);
try {
for (int j = 0; j < maxSize * 12 / 10 + 300; j++) {
String key = "key:" + counter++;
for (int j = 0; j < maxSize * 14 / 10 + 300; j++) {
String key = "key:" + counter;
counter += stride;
// give a biased hashcode distribution.
if ((Integer.bitCount(key.hashCode()) & 7) != 0) {
j--;
@@ -180,12 +207,12 @@ public class EntryCountMapTest {
score += (double) minSize / map.size();
scoreCount++;
boolean condition = minSize <= map.size() && map.size() <= maxSize;
long[] a = ((VanillaChronicleMap) map).segmentSizes();
System.out.println("segs: " + segments + " min: " + minSize + " was " + map.size() + " "
+ Arrays.toString(a)
+ " sum: " + sum(a));
if (!condition) {
long[] a = ((VanillaChronicleMap) map).segmentSizes();
System.out.println("segs: " + segments + " min: " + minSize + " was " + map.size() + " "
+ Arrays.toString(a)
+ " sum: " + sum(a));
assertTrue("seg: " + segments + ", min: " + minSize + ", size: " + map.size(), condition);
assertTrue("stride: " + stride + ", seg: " + segments + ", min: " + minSize + ", size: " + map.size(), condition);
}
} finally {
map.close();