use of org.onosproject.store.service.CommitStatus in project onos by opennetworkinglab.
the class TransactionPerfApp method runTest.
/**
* Runs the test.
*/
private void runTest(int iteration) {
testRunner.execute(() -> {
// Attempt the transaction until successful if retries are enabled.
CommitStatus status = null;
do {
TransactionContext context = storageService.transactionContextBuilder().build();
context.begin();
try {
TransactionalMap<String, String> map = context.getTransactionalMap(mapName, serializer);
int reads = (int) (totalOperationsPerTransaction * readPercentage);
for (int i = 0; i < reads; i++) {
map.get(KEY_PREFIX + i);
}
int writes = (int) (totalOperationsPerTransaction * (1 - readPercentage));
for (int i = 0; i < writes; i++) {
map.put(KEY_PREFIX + i, KEY_PREFIX + iteration + i);
}
status = context.commit().join();
attempted.incrementAndGet();
} catch (Exception e) {
context.abort();
log.warn("An exception occurred during a transaction: {}", e);
}
} while (withRetries && status != CommitStatus.SUCCESS);
// If the transaction was successful, increment succeeded transactions.
if (status == CommitStatus.SUCCESS) {
succeeded.incrementAndGet();
}
runTest(this.iteration.getAndIncrement());
});
}
use of org.onosproject.store.service.CommitStatus in project onos by opennetworkinglab.
the class ConsistentResourceStore method unregister.
@Override
public boolean unregister(List<? extends ResourceId> ids) {
checkNotNull(ids);
// Retry the transaction until successful.
while (true) {
TransactionContext tx = service.transactionContextBuilder().build();
tx.begin();
TransactionalDiscreteResourceSubStore discreteTxStore = discreteStore.transactional(tx);
TransactionalContinuousResourceSubStore continuousTxStore = continuousStore.transactional(tx);
// Look up resources by resource IDs
List<Resource> resources = ids.stream().filter(x -> x.parent().isPresent()).map(x -> {
// avoid access to consistent map in the case of discrete resource
if (x instanceof DiscreteResourceId) {
return Optional.of(Resources.discrete((DiscreteResourceId) x).resource());
} else {
return continuousTxStore.lookup((ContinuousResourceId) x);
}
}).flatMap(Tools::stream).collect(Collectors.toList());
// the order is preserved by LinkedHashMap
Map<DiscreteResourceId, List<Resource>> resourceMap = resources.stream().collect(Collectors.groupingBy(x -> x.parent().get().id(), LinkedHashMap::new, Collectors.toList()));
for (Map.Entry<DiscreteResourceId, List<Resource>> entry : resourceMap.entrySet()) {
if (!unregister(discreteTxStore, continuousTxStore, entry.getKey(), entry.getValue())) {
log.warn("Failed to unregister {}: Failed to remove {} values.", entry.getKey(), entry.getValue().size());
return abortTransaction(tx);
}
}
try {
CommitStatus status = commitTransaction(tx);
if (status == CommitStatus.SUCCESS) {
List<ResourceEvent> events = resources.stream().filter(x -> x.parent().isPresent()).map(x -> new ResourceEvent(RESOURCE_REMOVED, x)).collect(Collectors.toList());
notifyDelegate(events);
return true;
}
} catch (InterruptedException | ExecutionException | TimeoutException e) {
String message = resources.stream().map(Resource::simpleTypeName).collect(Collectors.groupingBy(Function.identity(), Collectors.counting())).entrySet().stream().map(entry -> String.format("%d %s type resources", entry.getValue(), entry.getKey())).collect(Collectors.joining(", "));
log.warn("Failed to unregister {}: {}", message, e);
return false;
}
}
}
use of org.onosproject.store.service.CommitStatus in project onos by opennetworkinglab.
the class ConsistentResourceStore method register.
@Override
public boolean register(List<? extends Resource> resources) {
checkNotNull(resources);
if (log.isTraceEnabled()) {
resources.forEach(r -> log.trace("registering {}", r));
}
// Retry the transaction until successful.
while (true) {
TransactionContext tx = service.transactionContextBuilder().build();
tx.begin();
// the order is preserved by LinkedHashMap
Map<DiscreteResource, List<Resource>> resourceMap = resources.stream().filter(x -> x.parent().isPresent()).collect(groupingBy(x -> x.parent().get(), LinkedHashMap::new, Collectors.<Resource>toList()));
TransactionalDiscreteResourceSubStore discreteTxStore = discreteStore.transactional(tx);
TransactionalContinuousResourceSubStore continuousTxStore = continuousStore.transactional(tx);
for (Map.Entry<DiscreteResource, List<Resource>> entry : resourceMap.entrySet()) {
DiscreteResourceId parentId = entry.getKey().id();
if (!discreteTxStore.lookup(parentId).isPresent()) {
return abortTransaction(tx);
}
if (!register(discreteTxStore, continuousTxStore, parentId, entry.getValue())) {
return abortTransaction(tx);
}
}
try {
CommitStatus status = commitTransaction(tx);
if (status == CommitStatus.SUCCESS) {
log.trace("Transaction commit succeeded on registration: resources={}", resources);
List<ResourceEvent> events = resources.stream().filter(x -> x.parent().isPresent()).map(x -> new ResourceEvent(RESOURCE_ADDED, x)).collect(Collectors.toList());
notifyDelegate(events);
return true;
}
} catch (InterruptedException | ExecutionException | TimeoutException e) {
log.warn("Transaction commit failed on registration", e);
return false;
}
}
}
Aggregations