import org.opendaylight.controller.md.sal.dom.broker.impl.TransactionCommitFailedExceptionMapper;
import org.opendaylight.controller.sal.core.spi.data.DOMStore;
import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohort;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistration;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.yangtools.util.DurationStatisticsTracker;
import org.opendaylight.yangtools.util.concurrent.MappingCheckedFuture;
import org.slf4j.Logger;
* @author Thomas Pantelis
*/
@Beta
-public class ConcurrentDOMDataBroker extends AbstractDOMBroker implements DOMDataTreeCommitCohortRegistry {
+public class ConcurrentDOMDataBroker extends AbstractDOMBroker {
private static final Logger LOG = LoggerFactory.getLogger(ConcurrentDOMDataBroker.class);
private static final String CAN_COMMIT = "CAN_COMMIT";
private static final String PRE_COMMIT = "PRE_COMMIT";
}
LOG.warn("Tx: {} Error during phase {}, starting Abort", transaction.getIdentifier(), phase, throwable);
- final Exception e;
- if (throwable instanceof NoShardLeaderException || throwable instanceof ShardLeaderNotRespondingException) {
- e = new DataStoreUnavailableException(throwable.getMessage(), throwable);
- } else if (throwable instanceof Exception) {
- e = (Exception)throwable;
- } else {
- e = new RuntimeException("Unexpected error occurred", throwable);
- }
-
- final TransactionCommitFailedException clientException = exMapper.apply(e);
// Transaction failed - tell all cohorts to abort.
-
@SuppressWarnings("unchecked")
ListenableFuture<Void>[] canCommitFutures = new ListenableFuture[cohorts.size()];
int index = 0;
canCommitFutures[index++] = cohort.abort();
}
+ // Propagate the original exception
+ final Exception e;
+ if (throwable instanceof NoShardLeaderException || throwable instanceof ShardLeaderNotRespondingException) {
+ e = new DataStoreUnavailableException(throwable.getMessage(), throwable);
+ } else if (throwable instanceof Exception) {
+ e = (Exception)throwable;
+ } else {
+ e = new RuntimeException("Unexpected error occurred", throwable);
+ }
+ clientSubmitFuture.setException(exMapper.apply(e));
+
ListenableFuture<List<Void>> combinedFuture = Futures.allAsList(canCommitFutures);
Futures.addCallback(combinedFuture, new FutureCallback<List<Void>>() {
@Override
public void onSuccess(List<Void> notUsed) {
// Propagate the original exception to the client.
- clientSubmitFuture.setException(clientException);
+ LOG.debug("Tx: {} aborted successfully", transaction.getIdentifier());
}
@Override
public void onFailure(Throwable failure) {
LOG.error("Tx: {} Error during Abort.", transaction.getIdentifier(), failure);
-
- // Propagate the original exception as that is what caused the Tx to fail and is
- // what's interesting to the client.
- clientSubmitFuture.setException(clientException);
}
}, MoreExecutors.directExecutor());
}
}
}
- @Override
- public <T extends DOMDataTreeCommitCohort> DOMDataTreeCommitCohortRegistration<T> registerCommitCohort(
- DOMDataTreeIdentifier path, T cohort) {
- DOMStore store = getTxFactories().get(toLegacy(path.getDatastoreType()));
- if (store instanceof DOMDataTreeCommitCohortRegistry) {
- return ((DOMDataTreeCommitCohortRegistry) store).registerCommitCohort(path, cohort);
- }
- throw new UnsupportedOperationException("Commit cohort is not supported for " + path);
- }
-
- private static LogicalDatastoreType toLegacy(org.opendaylight.mdsal.common.api.LogicalDatastoreType datastoreType) {
- switch (datastoreType) {
- case CONFIGURATION:
- return LogicalDatastoreType.CONFIGURATION;
- case OPERATIONAL:
- return LogicalDatastoreType.OPERATIONAL;
- default:
- throw new IllegalArgumentException("Unsupported data store type: " + datastoreType);
- }
- }
-
@Override
public String toString() {
return "Clustered ConcurrentDOMDataBroker";