You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ja...@apache.org on 2017/06/06 13:43:25 UTC
cassandra git commit: Fix randomness of stress values
Repository: cassandra
Updated Branches:
refs/heads/trunk 106691b2f -> f1f5f1946
Fix randomness of stress values
Patch by Ben Slater; Reviewed by tjake for CASSANDRA-12744
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/f1f5f194
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/f1f5f194
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/f1f5f194
Branch: refs/heads/trunk
Commit: f1f5f194620d3f9e11492f0051b6b71018033413
Parents: 106691b
Author: T Jake Luciani <ja...@apache.org>
Authored: Tue May 30 10:24:38 2017 -0400
Committer: T Jake Luciani <ja...@apache.org>
Committed: Tue Jun 6 09:42:27 2017 -0400
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../cassandra/stress/generate/SeedManager.java | 44 +++++++++++++-------
2 files changed, 29 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/f1f5f194/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index f34b325..aed0036 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
4.0
+ * Fix Randomness of stress values (CASSANDRA-12744)
* Allow selecting Map values and Set elements (CASSANDRA-7396)
* Fast and garbage-free Streaming Histogram (CASSANDRA-13444)
* Update repairTime for keyspaces on completion (CASSANDRA-13539)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/f1f5f194/tools/stress/src/org/apache/cassandra/stress/generate/SeedManager.java
----------------------------------------------------------------------
diff --git a/tools/stress/src/org/apache/cassandra/stress/generate/SeedManager.java b/tools/stress/src/org/apache/cassandra/stress/generate/SeedManager.java
index 5020b45..ae442e7 100644
--- a/tools/stress/src/org/apache/cassandra/stress/generate/SeedManager.java
+++ b/tools/stress/src/org/apache/cassandra/stress/generate/SeedManager.java
@@ -38,37 +38,43 @@ public class SeedManager
final Distribution sample;
final long sampleOffset;
final int sampleSize;
+ final long sampleMultiplier;
final boolean updateSampleImmediately;
public SeedManager(StressSettings settings)
{
+ Distribution sample = settings.insert.revisit.get();
+ this.sampleOffset = Math.min(sample.minValue(), sample.maxValue());
+ long sampleSize = 1 + Math.max(sample.minValue(), sample.maxValue()) - sampleOffset;
+ if (sampleOffset < 0 || sampleSize > Integer.MAX_VALUE)
+ throw new IllegalArgumentException("sample range is invalid");
+
+ // need to get a big numerical range even if a small number of discrete values
+ // one plus so we still get variation at the low order numbers as well as high
+ this.sampleMultiplier = 1 + Math.round(Math.pow(10D, 22 - Math.log10(sampleSize)));
+
Generator writes, reads;
if (settings.generate.sequence != null)
{
long[] seq = settings.generate.sequence;
if (settings.generate.readlookback != null)
{
- LookbackableWriteGenerator series = new LookbackableWriteGenerator(seq[0], seq[1], settings.generate.wrap, settings.generate.readlookback.get());
+ LookbackableWriteGenerator series = new LookbackableWriteGenerator(seq[0], seq[1], settings.generate.wrap, settings.generate.readlookback.get(), sampleMultiplier);
writes = series;
reads = series.reads;
}
else
{
- writes = reads = new SeriesGenerator(seq[0], seq[1], settings.generate.wrap);
+ writes = reads = new SeriesGenerator(seq[0], seq[1], settings.generate.wrap, sampleMultiplier);
}
}
else
{
- writes = reads = new RandomGenerator(settings.generate.distribution.get());
+ writes = reads = new RandomGenerator(settings.generate.distribution.get(), sampleMultiplier);
}
this.visits = settings.insert.visits.get();
this.writes = writes;
this.reads = reads;
- Distribution sample = settings.insert.revisit.get();
- this.sampleOffset = Math.min(sample.minValue(), sample.maxValue());
- long sampleSize = 1 + Math.max(sample.minValue(), sample.maxValue()) - sampleOffset;
- if (sampleOffset < 0 || sampleSize > Integer.MAX_VALUE)
- throw new IllegalArgumentException("sample range is invalid");
this.sampleFrom = new LockedDynamicList<>((int) sampleSize);
this.sample = DistributionInverted.invert(sample);
this.sampleSize = (int) sampleSize;
@@ -132,15 +138,18 @@ public class SeedManager
{
final Distribution distribution;
+ final long multiplier;
- public RandomGenerator(Distribution distribution)
+ public RandomGenerator(Distribution distribution, long multiplier)
{
+
this.distribution = distribution;
+ this.multiplier = multiplier;
}
public Seed next(int visits)
{
- return new Seed(distribution.next(), visits);
+ return new Seed(distribution.next() * multiplier, visits);
}
}
@@ -150,15 +159,18 @@ public class SeedManager
final long start;
final long totalCount;
final boolean wrap;
+ final long multiplier;
final AtomicLong next = new AtomicLong();
- public SeriesGenerator(long start, long end, boolean wrap)
+ public SeriesGenerator(long start, long end, boolean wrap, long multiplier)
{
this.wrap = wrap;
if (start > end)
throw new IllegalStateException();
this.start = start;
this.totalCount = 1 + end - start;
+ this.multiplier = multiplier;
+
}
public Seed next(int visits)
@@ -166,7 +178,7 @@ public class SeedManager
long next = this.next.getAndIncrement();
if (!wrap && next >= totalCount)
return null;
- return new Seed(start + (next % totalCount), visits);
+ return new Seed((start + (next % totalCount))*multiplier, visits);
}
}
@@ -177,9 +189,9 @@ public class SeedManager
final ConcurrentSkipListMap<Seed, Seed> afterMin = new ConcurrentSkipListMap<>();
final LookbackReadGenerator reads;
- public LookbackableWriteGenerator(long start, long end, boolean wrap, Distribution readLookback)
+ public LookbackableWriteGenerator(long start, long end, boolean wrap, Distribution readLookback, long multiplier)
{
- super(start, end, wrap);
+ super(start, end, wrap, multiplier);
this.writeCount.set(0);
reads = new LookbackReadGenerator(readLookback);
}
@@ -189,12 +201,12 @@ public class SeedManager
long next = this.next.getAndIncrement();
if (!wrap && next >= totalCount)
return null;
- return new Seed(start + (next % totalCount), visits);
+ return new Seed((start + (next % totalCount)) * multiplier, visits);
}
void finishWrite(Seed seed)
{
- if (seed.seed <= writeCount.get())
+ if (seed.seed/multiplier <= writeCount.get())
return;
afterMin.put(seed, seed);
while (true)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org