import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import javax.annotation.concurrent.GuardedBy;
-import org.opendaylight.controller.cluster.datastore.identifiers.TransactionIdentifier;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
import org.opendaylight.controller.cluster.datastore.utils.ActorContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*/
@GuardedBy("queuedTxOperations")
private final List<TransactionOperation> queuedTxOperations = Lists.newArrayList();
-
private final TransactionIdentifier identifier;
+ private final String shardName;
/**
* The resulting TransactionContext.
private final OperationLimiter limiter;
- TransactionContextWrapper(TransactionIdentifier identifier, final ActorContext actorContext) {
+ TransactionContextWrapper(final TransactionIdentifier identifier, final ActorContext actorContext,
+ final String shardName) {
this.identifier = Preconditions.checkNotNull(identifier);
this.limiter = new OperationLimiter(identifier,
- actorContext.getDatastoreContext().getShardBatchedModificationCount() + 1, // 1 extra permit for the ready operation
- actorContext.getDatastoreContext().getOperationTimeoutInSeconds());
+ // 1 extra permit for the ready operation
+ actorContext.getDatastoreContext().getShardBatchedModificationCount() + 1,
+ TimeUnit.MILLISECONDS.toSeconds(actorContext.getDatastoreContext().getOperationTimeoutInMillis()));
+ this.shardName = Preconditions.checkNotNull(shardName);
}
TransactionContext getTransactionContext() {
final boolean invokeOperation;
synchronized (queuedTxOperations) {
if (transactionContext == null) {
- LOG.debug("Tx {} Queuing TransactionOperation", getIdentifier());
+ LOG.debug("Tx {} Queuing TransactionOperation", identifier);
queuedTxOperations.add(operation);
invokeOperation = false;
if (invokeOperation) {
operation.invoke(transactionContext);
} else {
- limiter.acquire();
+ if (!limiter.acquire()) {
+ LOG.warn("Failed to acquire enqueue operation permit for transaction {} on shard {}", identifier,
+ shardName);
+ }
}
}
}
void executePriorTransactionOperations(final TransactionContext localTransactionContext) {
- while(true) {
+ while (true) {
// Access to queuedTxOperations and transactionContext must be protected and atomic
// (ie synchronized) with respect to #addTxOperationOnComplete to handle timing
// issues and ensure no TransactionOperation is missed and that they are processed
// in case a TransactionOperation results in another transaction operation being
// queued (eg a put operation from a client read Future callback that is notified
// synchronously).
- Collection<TransactionOperation> operationsBatch = null;
+ final Collection<TransactionOperation> operationsBatch;
synchronized (queuedTxOperations) {
if (queuedTxOperations.isEmpty()) {
// We're done invoking the TransactionOperations so we can now publish the
// TransactionContext.
localTransactionContext.operationHandOffComplete();
- if(!localTransactionContext.usesOperationLimiting()){
+ if (!localTransactionContext.usesOperationLimiting()) {
limiter.releaseAll();
}
transactionContext = localTransactionContext;
final Promise<ActorSelection> promise = Futures.promise();
enqueueTransactionOperation(new TransactionOperation() {
@Override
- public void invoke(TransactionContext transactionContext) {
- promise.completeWith(transactionContext.readyTransaction());
+ public void invoke(TransactionContext newTransactionContext) {
+ promise.completeWith(newTransactionContext.readyTransaction());
}
});