package org.radargun.stages.cache.test;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import org.radargun.Operation;
import org.radargun.config.Namespace;
import org.radargun.config.Property;
import org.radargun.config.Stage;
import org.radargun.stages.test.Invocation;
import org.radargun.stages.test.OperationLogic;
import org.radargun.stages.test.OperationSelector;
import org.radargun.stages.test.RatioOperationSelector;
import org.radargun.stages.test.Stressor;
import org.radargun.stages.test.TestStage;
import org.radargun.traits.BasicOperations;
import org.radargun.traits.InjectTrait;
import org.radargun.traits.StreamingOperations;
@Namespace(name = TestStage.NAMESPACE, deprecatedName = TestStage.DEPRECATED_NAMESPACE)
@Stage(doc = "Streaming operations test stage")
public class StreamingOperationsTestStage extends CacheOperationsTestStage {
@Property(doc = "Ratio of GET requests. Default is 4.")
protected int getRatio = 4;
@Property(doc = "Ratio of PUT requests. Default is 1.")
protected int putRatio = 1;
@Property(doc = "Streaming operations buffer size in bytes, default is 100")
protected int bufferSize = 100;
@InjectTrait
protected StreamingOperations streamingOperations;
@Override
protected OperationSelector createOperationSelector() {
statisticsPrototype.registerOperationsGroup(BasicOperations.class.getSimpleName() + ".Total",
new HashSet<>(Arrays.asList(
StreamingOperations.GET,
StreamingOperations.PUT)));
return new RatioOperationSelector.Builder().add(StreamingOperations.GET, getRatio).add(StreamingOperations.PUT, putRatio)
.build();
}
public OperationLogic getLogic() {
return new Logic();
}
protected class Logic extends OperationLogic {
protected Long version = null;
protected KeySelector keySelector;
protected StreamingOperations.StreamingCache<Object> cache;
protected byte[] buffer = new byte[bufferSize];
@Override
public void init(Stressor stressor) {
super.init(stressor);
String cacheName = cacheSelector.getCacheName(stressor.getGlobalThreadIndex());
this.cache = streamingOperations.getStreamingCache(cacheName);
this.keySelector = getKeySelector(stressor);
}
@Override
public void run(Operation operation) throws RequestException {
Object key = keyGenerator.generateKey(keySelector.next());
Random random = stressor.getRandom();
Invocation invocation;
if (operation == StreamingOperations.GET) {
invocation = new CacheInvocations.GetViaStream<Object, Integer>(cache, key, buffer);
} else if (operation == StreamingOperations.PUT) {
invocation = new CacheInvocations.PutViaStream<Object, InputStream>(cache, key,
(InputStream) valueGenerator.generateValue(key, entrySize.next(random), random), buffer);
} else
throw new IllegalArgumentException(operation.name);
stressor.makeRequest(invocation);
}
}
}