New (and more correct!) way to run tests #236

Closed
wants to merge 30 commits into
from

Projects

None yet

4 participants

@rvansa
Member
rvansa commented Jun 11, 2015

To let you guys know what to expect as soon as my other PRs are merged.

@rvansa rvansa added the preview label Jun 11, 2015
@rvansa rvansa modified the milestone: 1.1.0 Jun 11, 2015
@mcimbora
Contributor

Shall I start reviewing now to be finished by the end of the year? :-)

@rvansa
Member
rvansa commented Jun 11, 2015

@mcimbora: yes

@alanfx
Contributor
alanfx commented Jun 11, 2015

@rvansa and @mcimbora is this RadarGun 3.0?! I'm also wondering if you can explain how this approach is more correct?

@rvansa
Member
rvansa commented Jun 11, 2015

@alanfx check out for example the 'It's broken? Coordinated WOT?' part:
http://psy-lob-saw.blogspot.cz/2015/03/fixing-ycsb-coordinated-omission.html

So far we've been dealing with that with 'catching up' - if we were behind the schedule, we issues the requests as far as we could. Neither this nor pretending that nothing happened (this is in fact the no-delay case where think-time == 0 and we fire as often as we can.)

@mcimbora mcimbora added this to the 3.0.0 milestone Jul 22, 2015
@rvansa
Member
rvansa commented Sep 1, 2015

@mcimbora I think these are all changes I've done (added one commit fixing test schema, ff-mergeable).

@mcimbora
Contributor
mcimbora commented Sep 1, 2015

@rvansa Good, let me see

@mcimbora
Contributor
mcimbora commented Sep 1, 2015

Globally - please use TimeService to get current time.

@rvansa
Member
rvansa commented Sep 1, 2015

@mcimbora rebased, dropped commits related to reporting... we'll sort that out later.

@mcimbora
Contributor
mcimbora commented Sep 1, 2015

@rvansa Looks like all comments have been lost after the rebase (at least here), I'll continue with the review tomorrow.

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ this.maxThreads = maxThreads;
+ }
+
+ public void setLogTransactionExceptions(boolean logTransactionExceptions) {
+ this.logTransactionExceptions = logTransactionExceptions;
+ }
+
+ public void setMinThreadCreationDelay(long minThreadCreationDelay) {
+ this.minThreadCreationDelay = minThreadCreationDelay;
+ }
+
+ /**
+ * Add operation executed when the test is stopped.
+ * @param runnable
+ */
+ public synchronized void addStopListener(Runnable runnable) {
@mcimbora
mcimbora Sep 9, 2015 Contributor

Unused?

@rvansa
rvansa Sep 9, 2015 Member

Not in this PR, but it will be :)

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ for (Runnable listener : stopListeners) {
+ listener.run();
+ }
+ }
+ }
+
+ public void addStressor(boolean failSilently) {
+ int threadIndex = getNextThreadId(maxThreads);
+ if (threadIndex < 0) {
+ if (failSilently) {
+ return;
+ }
+ reachedMax = true;
+ log.warnf("Attempt to create more than %d threads!", maxThreads);
+ Utils.threadDump();
+ return;
@mcimbora
mcimbora Sep 9, 2015 Contributor

Shouldn't this throw an exception instead? Otherwise this fails silently even if failSilently == false.

@rvansa
rvansa Sep 9, 2015 Member

Since this is called from another stressor, it does not make much sense to throw an exception and just catch it elsewhere, logging an error. The test will be later declared failed anyway.

@mcimbora
mcimbora Sep 9, 2015 Contributor

I disagree. According to log message this is undesired state so I see no point in pretending nothing happened. IMO letting the client decide what to do is more proper way.

@rvansa
rvansa Sep 9, 2015 Member

I disagree, too. The new thread is added as a side effect of retrieving new operation from the selector, it does not relate to what the client wants to do. I would accept raising this from warn to error. The fact that something got broken is not lost, but the caller is not the one who should deal with that.

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ }
+ for (Stressor stressor : stressors) {
+ try {
+ stressor.join();
+ } catch (InterruptedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ synchronized (this) {
+ for (Runnable listener : stopListeners) {
+ listener.run();
+ }
+ }
+ }
+
+ public void addStressor(boolean failSilently) {
@mcimbora
mcimbora Sep 9, 2015 Contributor

Method name is a bit misleading as this starts the stressor as well.

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ }
+ }
+
+ public void stopStressors() {
+ finished = true;
+ steadyState = false;
+ interruptStressors();
+ List<Stressor> stressors;
+ synchronized (this) {
+ stressors = new ArrayList<>(this.stressors);
+ }
+ for (Stressor stressor : stressors) {
+ try {
+ stressor.join();
+ } catch (InterruptedException e) {
+ throw new IllegalStateException(e);
@mcimbora
mcimbora Sep 9, 2015 Contributor

You may want to restore interrupted status of the thread before rethrowing the exception.

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ public void recordStatistics(Statistics stats) {
+ statisticsQueue.add(stats);
+ }
+
+ public List<Statistics> getStatistics() {
+ interruptStressors();
+ ArrayList<Statistics> statistics = new ArrayList<>();
+ while (!terminated && statistics.size() < statisticsCounter.get()) {
+ Statistics stats = statisticsQueue.poll();
+ if (stats != null) {
+ statistics.add(stats);
+ } else {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ throw new IllegalStateException(e);
@mcimbora
mcimbora Sep 9, 2015 Contributor

Interrupted handling.

@mcimbora mcimbora commented on the diff Sep 9, 2015
.../src/main/java/org/radargun/stages/test/Stressor.java
- if (stats != null) {
- stats.end();
- }
- stage.getFinishLatch().countDown();
- }
- }
-
- private void runInternal() {
- int i = 0;
- while (completion.moreToRun(i)) {
- Object result = null;
- try {
- if (useTransactions && txRemainingOperations <= 0) {
- ongoingTx = stage.transactional.getTransaction();
- logic.transactionStarted();
+ while (!test.isFinished()) {
@mcimbora
mcimbora Sep 9, 2015 Contributor

Shouldn't the loops check interrupted status of the stressor as well? We had problems due to this little detail in BackgroundOperationsManager some time ago.

@rvansa
rvansa Sep 9, 2015 Member

I'd prefer to to as little checks as possible, though, it should not incur too much overhead. These threads should get interrupted only after the finished is set to true.

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ synchronized (this) {
+ if (!finished) {
+ stressors.add(stressor);
+ }
+ }
+ log.infof("Created stressor %s", stressor.getName());
+ stressor.start();
+ }
+
+ public int getUsedThreads() {
+ return threadCounter.get();
+ }
+
+ private int getNextThreadId(int maxThreads) {
+ int threadIndex;
+ do {
@mcimbora
mcimbora Sep 9, 2015 Contributor

Wouldn't it be easier (to understand) to introduce synchronized method which would increment the thread counter? That would avoid assignment + increment atomicity problem if the loop was introduced for this reason.

@rvansa
rvansa Sep 9, 2015 Member

The less synchronization the better. This code does not have any race conditions, since the reachedMax should flip only in the false -> true direction.

@mcimbora
mcimbora Sep 9, 2015 Contributor

On the one hand such optimizations may be beneficial from performance point of view, but what are the costs? The code becomes unmaintainable. Premature optimizations are the root of all evil :-)

@rvansa
rvansa Sep 9, 2015 Member

I think that using atomic counters and volatile boolean variable is far from 'unmaintainable'.

@mcimbora
mcimbora Sep 9, 2015 Contributor

Think of it from global perspective. You add one counter here, one counter there and you end up with class having 20 fields.

@rvansa
rvansa Sep 9, 2015 Member

Do you argue about number of counters or the synchronization? Maybe I could restructure that to keep the threadCounter increasing and omit reachedMax, but this way seemed more readable to me.

@mcimbora mcimbora commented on an outdated diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ */
+public class RunningTest extends ServiceListenerAdapter {
+ private final Log log = LogFactory.getLog(RunningTest.class);
+ private final ConcurrentLinkedQueue<Statistics> statisticsQueue = new ConcurrentLinkedQueue<>();
+ private final ArrayList<Stressor> stressors = new ArrayList<>();
+ private final ThreadLocal<Conversation> lastConversation = new ThreadLocal<>();
+ private final AtomicLong lastCreated = new AtomicLong(Long.MIN_VALUE);
+ private final ConcurrentMap<Conversation, AtomicInteger> actuallyExecuting = new ConcurrentHashMap<>();
+ private final ArrayList<Runnable> stopListeners = new ArrayList<>();
+
+ private Statistics statisticsPrototype;
+ private AtomicInteger waitingThreads = new AtomicInteger();
+ private AtomicInteger threadCounter = new AtomicInteger();
+ private AtomicInteger statisticsCounter = new AtomicInteger();
+
+ private volatile boolean steadyState = false;
@mcimbora
mcimbora Sep 9, 2015 Contributor

The class is quite complex, it would be worth to at least add comments to describe the fields (or find better names which will avoid the need of having those comments).

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ public int getUsedThreads() {
+ return threadCounter.get();
+ }
+
+ private int getNextThreadId(int maxThreads) {
+ int threadIndex;
+ do {
+ threadIndex = threadCounter.get();
+ if (threadIndex >= maxThreads) {reachedMax = true;
+ return -1;
+ }
+ } while (!threadCounter.compareAndSet(threadIndex, threadIndex + 1));
+ return threadIndex;
+ }
+
+ public void updateSelector(SchedulingSelector<Conversation> schedulingSelector) {
@mcimbora
mcimbora Sep 9, 2015 Contributor

This should be standard setter instead?

@rvansa
rvansa Sep 9, 2015 Member

getSelector() returns ConversationSelector while updateSelector accepts SchedulingSelector - those methods are not symmetric. As ThreadPoolingSelector is an inner class, it cannot be created outside (moving the instance creation to the caller).

@mcimbora mcimbora commented on the diff Sep 9, 2015
...c/main/java/org/radargun/stages/test/RunningTest.java
+ /**
+ * Wraps scheduling selector and monitors number of active threads; when the number of waiting threads drop below
+ * actual threshold, spawns another thread.
+ *
+ * @author Radim Vansa &lt;rvansa@redhat.com&gt;
+ */
+ class ThreadPoolingSelector implements ConversationSelector {
+ private final SchedulingSelector<Conversation> schedulingSelector;
+
+ ThreadPoolingSelector(SchedulingSelector<Conversation> schedulingSelector) {
+ this.schedulingSelector = schedulingSelector;
+ }
+
+ @Override
+ public Conversation next() throws InterruptedException {
+ Conversation previous = lastConversation.get();
@mcimbora
mcimbora Sep 9, 2015 Contributor

Could you please document this piece of code better?

@mcimbora mcimbora commented on an outdated diff Sep 9, 2015
...java/org/radargun/stages/test/SchedulingSelector.java
+import java.util.concurrent.atomic.AtomicIntegerArray;
+import java.util.concurrent.atomic.AtomicLongArray;
+
+import org.radargun.logging.Log;
+import org.radargun.logging.LogFactory;
+import org.radargun.utils.Projections;
+import org.radargun.utils.TimeService;
+
+/**
+ * Based on provided frequency, returns matching invocation from {@link #next()} or blocks the thread calling it.
+ *
+ * @author Radim Vansa &lt;rvansa@redhat.com&gt;
+ */
+public class SchedulingSelector<T> {
+ private final static Log log = LogFactory.getLog(SchedulingSelector.class);
+ private final static boolean trace = log.isTraceEnabled();
@mcimbora
mcimbora Sep 9, 2015 Contributor

Unused

@mcimbora mcimbora commented on an outdated diff Sep 9, 2015
...java/org/radargun/stages/test/SchedulingSelector.java
+import org.radargun.logging.LogFactory;
+import org.radargun.utils.Projections;
+import org.radargun.utils.TimeService;
+
+/**
+ * Based on provided frequency, returns matching invocation from {@link #next()} or blocks the thread calling it.
+ *
+ * @author Radim Vansa &lt;rvansa@redhat.com&gt;
+ */
+public class SchedulingSelector<T> {
+ private final static Log log = LogFactory.getLog(SchedulingSelector.class);
+ private final static boolean trace = log.isTraceEnabled();
+ private final int[] invocations;
+ private final long[] intervals;
+ private final T[] operations;
+ private final int numOperations;
@mcimbora
mcimbora Sep 9, 2015 Contributor

Is it worth introducing separate variable for numOperations when it can be derived from operations array?

@mcimbora mcimbora commented on an outdated diff Sep 9, 2015
...java/org/radargun/stages/test/SchedulingSelector.java
+ /**
+ * @param operations Returned invocations
+ * @param invocations Number of operations per interval
+ * @param intervals Size of slot, in milliseconds
+ */
+ public SchedulingSelector(T[] operations, int[] invocations, long[] intervals) {
+ if (operations.length != invocations.length) throw new IllegalArgumentException();
+ this.operations = operations;
+ this.invocations = invocations;
+ this.intervals = intervals;
+ numOperations = operations.length;
+ lastIntervals = new AtomicLongArray(numOperations);
+ todoInvocations = new AtomicIntegerArray(numOperations);
+ }
+
+ /**
@mcimbora
mcimbora Sep 9, 2015 Contributor

Documentation

@mcimbora mcimbora commented on the diff Sep 9, 2015
...java/org/radargun/stages/test/SchedulingSelector.java
+ public SchedulingSelector(T[] operations, int[] invocations, long[] intervals) {
+ if (operations.length != invocations.length) throw new IllegalArgumentException();
+ this.operations = operations;
+ this.invocations = invocations;
+ this.intervals = intervals;
+ numOperations = operations.length;
+ lastIntervals = new AtomicLongArray(numOperations);
+ todoInvocations = new AtomicIntegerArray(numOperations);
+ }
+
+ /**
+ * @return
+ * @throws InterruptedException
+ */
+ public T next() throws InterruptedException {
+ WAIT_LOOP: for (;;) {
@mcimbora
mcimbora Sep 9, 2015 Contributor

What about adding a timeout here?

@mcimbora
mcimbora Sep 9, 2015 Contributor

Can you guarantee this won't loop indefinitely?

@rvansa
rvansa Sep 9, 2015 Member

It is desired to have the thread waiting here until it gets the operation - this is the part that should keep threads blocked. It is perfectly valid to have the thread waiting here for the whole duration of test. The only undesired property is that the threads have to wake up every 1 ms too see that the time has advanced and there may be more work to do - this is a place for optimization.
If we want to forcefully stop the thread, we interrupt it - and I can guarantee that the thread reacts to interruption.

@rvansa
rvansa Sep 9, 2015 Member

(unless it is stuck in the do while loop with atomic updates, but it's unlikely that it will be stuck there for too long).

@mcimbora mcimbora commented on an outdated diff Sep 9, 2015
...java/org/radargun/stages/test/SchedulingSelector.java
+ /**
+ * @return
+ * @throws InterruptedException
+ */
+ public T next() throws InterruptedException {
+ WAIT_LOOP: for (;;) {
+ long now = TimeService.currentTimeMillis();
+ int myOffset = offset;
+ INVOCATIONS_LOOP: for (int i = 0; i < numOperations; ++i) {
+ int operationIndex = (i + myOffset) % numOperations;
+
+ long myInterval = intervals[operationIndex];
+ long currentInterval = now / myInterval;
+
+ long lastInterval;
+ boolean set = false;
@mcimbora
mcimbora Sep 9, 2015 Contributor

Can you rename this? Can't immediately see what is set.

@mcimbora mcimbora and 1 other commented on an outdated diff Sep 9, 2015
.../src/main/java/org/radargun/stages/test/Stressor.java
+ // since it did not grab the selector
+ selector = test.getSelector();
+ }
+ try {
+ Conversation conversation = selector.next();
+ conversation.run(this);
+ } catch (InterruptedException e) {
+ // the test is interrupted
+ } catch (RequestException e) {
+ // the exception was already logged in makeRequest
+ }
+ }
+ } finally {
+ stats.end();
+ test.recordStatistics(stats);
+ stats = null; // let's throw NPE if we try to record now
@mcimbora
mcimbora Sep 9, 2015 Contributor

If this may ever occur, let's handle the situation instead.

@rvansa
rvansa Sep 9, 2015 Member

I think that it's handled in the end, accesses of stats check in recording() method.

@mcimbora
mcimbora Sep 9, 2015 Contributor

So is the comment still valid? Causing intentional NPE anywhere is not acceptable.

@mcimbora mcimbora commented on the diff Sep 9, 2015
...ain/java/org/radargun/stages/test/TestSetupStage.java
+ }
+ now = TimeService.currentTimeMillis();
+ }
+ if (runningTest.isTerminated()) {
+ return errorResponse("Test was terminated during ramp-up");
+ } else if (rampUpMaxDuration > 0 && now >= startTime + rampUpMaxDuration) {
+ return errorResponse("Ramp-up has not stabilized within timeout");
+ } else if (runningTest.isReachedMax()) {
+ return errorResponse("Max thread count reached during ramp-up");
+ }
+ return successfulResponse();
+ }
+
+ protected abstract SchedulingSelector<Conversation> createSelector();
+
+ protected void prepare() {
@mcimbora
mcimbora Sep 9, 2015 Contributor

Looks like this could be abstract.

@rvansa
rvansa Sep 9, 2015 Member

Abstract methods need to be defined. This provides a point which the stage can use optionally.

@mcimbora
mcimbora Sep 9, 2015 Contributor

All subclasses seem to implement the method anyway.

@mcimbora mcimbora and 1 other commented on an outdated diff Sep 9, 2015
...src/main/java/org/radargun/stages/test/TestStage.java
+ }
+ if (failed) {
+ if (repeatCondition == null) {
+ return StageResult.FAIL;
+ } else {
+ return StageResult.BREAK;
+ }
+ }
+ if (checkRepeatCondition(aggregated)) {
+ return StageResult.SUCCESS;
+ } else {
+ return StageResult.BREAK;
+ }
+ }
+
+ protected void destroy() {
@mcimbora
mcimbora Sep 9, 2015 Contributor

Could be removed

@rvansa
rvansa Sep 9, 2015 Member

Nope, this is an extension point that I am about to use.

@mcimbora
mcimbora Sep 9, 2015 Contributor

How I'm supposed to know that? You can add it once it is used.

@rvansa
rvansa Sep 9, 2015 Member

Okay, I'll document the prepare and destroy methods :) So little clairvoyance in the crowd...

@mcimbora mcimbora commented on the diff Sep 9, 2015
...g/radargun/stages/test/legacy/AbstractCompletion.java
+ protected final static Log log = LogFactory.getLog(Completion.class);
+
+ protected boolean started, completed;
+ protected long startTime;
+ private Runnable handler;
+
+ @Override
+ public synchronized void start() {
+ if (!started) {
+ startTime = TimeService.nanoTime();
+ started = true;
+ }
+ }
+
+ @Override
+ public synchronized void setCompletionHandler(Runnable handler) {
@mcimbora
mcimbora Sep 9, 2015 Contributor

I'd rather opt for introducing CompletionHandler interface.

@rvansa
rvansa Sep 9, 2015 Member

I think that lambda expression will be used for handling this now as we are based on Java 8 now, so introducing special interface would not have the effect. I'll fix the usage.

@mcimbora mcimbora and 1 other commented on an outdated diff Sep 9, 2015
...a/org/radargun/stages/test/legacy/OperationLogic.java
this.stressor = stressor;
}
/**
+ * Release resources held by this logic.
+ */
+ public void destroy() {}
@mcimbora
mcimbora Sep 9, 2015 Contributor

No implementation found.

@rvansa
rvansa Sep 9, 2015 Member

You must really hate providing extension points. Though, in this particular case, I have to admit that I haven't used that anywhere (usage got lost during refactoring).

@mcimbora
Contributor
mcimbora commented Sep 9, 2015

@rvansa Review complete, however I might add some other comments. As usual, any tests are welcomed. A design doc would be nice as well.

@mcimbora mcimbora commented on the diff Sep 9, 2015
...src/main/java/org/radargun/stages/test/LoadStage.java
+ * @author Radim Vansa &lt;rvansa@redhat.com&gt;
+ */
+@Stage(doc = "Manages thread for data loading")
+public abstract class LoadStage extends AbstractDistStage {
+ @Property(doc = "Number of loaded entries after which a log entry should be written. Default is 10000.")
+ protected long logPeriod = 10000;
+
+ @Property(doc = "The number of threads that should load the entries on one slave. Default is 10.")
+ protected int numThreads = 10;
+
+ @Property(doc = "Seed used for initialization of random generators - with same seed (and other arguments)," +
+ " the stage guarantees same entries added to the cache. By default the seed is not set.")
+ protected Long seed;
+
+ @Property(doc = "During loading phase, if the insert fails, try it again. This is the maximum number of attempts. Default is 10.")
+ protected int maxLoadAttempts = 10;
@mcimbora
mcimbora Sep 9, 2015 Contributor

Both maxLoadAttempts and waitOnError are unused on this level..

@rvansa
rvansa Sep 9, 2015 Member

Well spotted, I forgot to remove them from LoadDataStage (I'll probably rename that to LoadCacheStage)

@mcimbora
Contributor
mcimbora commented Sep 9, 2015

Please make sure example configs work, e.g. query, jcache are broken.

@rvansa rvansa added changes required and removed preview labels Oct 7, 2015
@rvansa
Member
rvansa commented Oct 20, 2015

@mcimbora I would appreciate review of the updates & integration.

@mcimbora
Contributor

@rvansa This is to be discussed today with the rest of RG team. Anyway as long as there's no design doc describing new test mechanism and improved test coverage, I won't integrate the PR.

@mcimbora
Contributor

@rvansa Thanks, these tests are a good starting point. @alanfx @mgencur @vjuranek are you planning to add some more comments? This might be getting ready for integration.

@vjuranek
Member

@mcimbora I haven't time to dive into it in near future, so if you want to integrate it soon, don't wait for any comments from me :-)

@alanfx
Contributor
alanfx commented Oct 26, 2015

@rvansa can you look at the comment I had on ServiceStartStage? I will try to look through more of this today as well.

rvansa added some commits Jun 10, 2015
@rvansa rvansa Added custom (non-numeric) statistics into InternalsExposition trait. b53dda8
@rvansa rvansa Fixed evaluation of nested functions, added conversion to floating ty…
…pe and greatest common divisor computation.
0efee4e
@rvansa rvansa minor fix 64927a4
@rvansa rvansa Histogram held through soft reference. 3d806de
@rvansa rvansa Define master.address on slave 8800170
@rvansa rvansa Partially fixed case for two property delegates with empty prefix not…
… having correctly generated schema.
0038b3c
@rvansa rvansa -Dno-zip build option eb2ad8f
@rvansa rvansa Helper method a66fc9c
@rvansa rvansa Change source and target version to Java 8 806b052
@rvansa rvansa * Refactored LoadStage into LoadStage (base) and LoadDataStage
* JIT avoidance moved into Blackhole
49eaf73
@rvansa rvansa * Stressors start recording after (optional) ramp-up period
** using volatile boolean to start the recording instead of CountDownLatch - stressors are executing requests right from the beginning
** using Phaser for signalization of end - allows changing number of stressors
* Moved blackhole result consumption to makeRequest()
* Refactored Completion -> Completion + OperationSelector
7cc6aee
@rvansa rvansa Adapt Queryable trait for transactional queries. e701f51
@rvansa rvansa Refactored QueryStage - most of the functionality moved to reusable c…
…lasses
2b006af
@rvansa rvansa Test type that allows specifying frequency of requests and these are …
…executed by varying number of threads.

* Implemented in CrudOperationsScheduledStage
0312148
@rvansa rvansa Refactoring of test stages to get rid of the coordinated ommission pr…
…oblem

* renamed old tests xxx-test -> xxx-legacy-test and moved to different package
** functionality is still there beyond the operation-count based limit
* created new tests: these should be always in pairs xxx-test-setup + (xxx-)test (with the same test-name)
** these tests introduce the concept of conversation rather that testing just basic operations
** thread counts are not set directly, test specifies rather frequency of conversations invocation
** removed the option for data-per-thread since we don't have fixed number of threads
cdc2a8c
@rvansa rvansa fix hazelcast tx 5b10dc8
@rvansa rvansa Statistics: newInstance without expensive copy and lazy stats initial…
…ization
20fd9fb
@rvansa rvansa Added minThreads + fixes ef81a19
@rvansa rvansa test amend cab5a86
@rvansa rvansa Legacy stress test fixes 186fb17
@rvansa rvansa Master lifecycle listener + remove repeat counter from state after fa…
…iled scenario
d60c5fc
@rvansa rvansa Get default client-server benchmark working
* fix classpath issues when looking for internal classes (tools.jar)
* switch to Infinispan 8 since Infinispan 6 server does not start on Java 8
* fix standalone.sh vs. clustered.sh
8fe87a3
@rvansa rvansa Remove warmup from benchmark-dist.xml
* The warmup phase is part of basic-operations-test-setup, no need to repeat that.
b838cfa
@rvansa rvansa Tests for SchedulingSelector and Stressor dc35729
@rvansa
Member
rvansa commented Nov 2, 2015

@mcimbora @alanfx Dropped the controversial change for expected num of slaves, and rebased + fixed benchmarks that haven't been properly updated.

rvansa added some commits Nov 2, 2015
@rvansa rvansa Fix example benchmarks:
* load-data -> cache-load
* clear-cache -> cache-clear (clear-cache still works but is deprecated)
* background-load-data-stop -> background-cache-load-stop
8b3714c
@rvansa rvansa Namespace fix in schema 81f455b
@rvansa rvansa Duration is non-optional. 5aac198
@rvansa rvansa Fix NPE in legacy stress test with transactions
* the wrapped transactional cache was set after the invocation was created; replaced with delegate
e21410b
@rvansa rvansa AbstractConversation implements toString, hashCode and equals 892b16c
@rvansa rvansa Fix query on transactional cache d5787bd
@mcimbora
Contributor
mcimbora commented Nov 4, 2015

@rvansa Integrated, thanks.

@mcimbora mcimbora closed this Nov 4, 2015
@rvansa
Member
rvansa commented Nov 4, 2015

😤 😅

@rvansa
Member
rvansa commented Nov 10, 2015

@mcimbora Looking into master, the last commit d5787bd was not integrated. Please, correct this.

@rvansa rvansa reopened this Nov 10, 2015
@rvansa rvansa referenced this pull request Nov 10, 2015
Closed

Namespaces introduction #305

@mcimbora
Contributor

@rvansa Fixed

@mcimbora mcimbora closed this Nov 11, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment