From: Robert Varga Date: Mon, 7 Nov 2022 01:11:11 +0000 (+0100) Subject: Specialize CommitCoordinationTask X-Git-Tag: v11.0.0~67 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=767dd79895f06c6dd5cde702044152d4ee3b8939;p=mdsal.git Specialize CommitCoordinationTask Tracker is optional, so let's subclass the tracking into a wrapper class. Change-Id: I4271d2453181bbbf2310c4737ef90b87d154b046 Signed-off-by: Robert Varga --- diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTask.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTask.java index 64ebada794..49af6d65ff 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTask.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTask.java @@ -27,7 +27,29 @@ import org.slf4j.LoggerFactory; /** * Implementation of blocking three-phase commit-coordination tasks without support of cancellation. */ -final class CommitCoordinationTask implements Callable { +sealed class CommitCoordinationTask implements Callable { + static final class WithTracker extends CommitCoordinationTask { + private final DurationStatisticsTracker commitStatTracker; + + WithTracker(final DOMDataTreeWriteTransaction transaction, + final Collection cohorts, + final DurationStatisticsTracker commitStatTracker) { + super(transaction, cohorts); + this.commitStatTracker = requireNonNull(commitStatTracker); + } + + @Override + public CommitInfo call() throws TransactionCommitFailedException { + final long startTime = System.nanoTime(); + + try { + return super.call(); + } finally { + commitStatTracker.addDuration(System.nanoTime() - startTime); + } + } + } + private enum Phase { CAN_COMMIT, PRE_COMMIT, @@ -36,23 +58,17 @@ final class CommitCoordinationTask implements Callable { private static final Logger LOG = LoggerFactory.getLogger(CommitCoordinationTask.class); private final Collection cohorts; - private final DurationStatisticsTracker commitStatTracker; private final DOMDataTreeWriteTransaction tx; CommitCoordinationTask(final DOMDataTreeWriteTransaction transaction, - final Collection cohorts, - final DurationStatisticsTracker commitStatTracker) { - this.tx = requireNonNull(transaction, "transaction must not be null"); + final Collection cohorts) { + tx = requireNonNull(transaction, "transaction must not be null"); this.cohorts = requireNonNull(cohorts, "cohorts must not be null"); - this.commitStatTracker = commitStatTracker; } @Override public CommitInfo call() throws TransactionCommitFailedException { - final long startTime = commitStatTracker != null ? System.nanoTime() : 0; - - Phase phase = Phase.CAN_COMMIT; - + var phase = Phase.CAN_COMMIT; try { LOG.debug("Transaction {}: canCommit Started", tx.getIdentifier()); canCommitBlocking(); @@ -71,10 +87,6 @@ final class CommitCoordinationTask implements Callable { LOG.warn("Tx: {} Error during phase {}, starting Abort", tx.getIdentifier(), phase, e); abortBlocking(e); throw e; - } finally { - if (commitStatTracker != null) { - commitStatTracker.addDuration(System.nanoTime() - startTime); - } } } diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/SerializedDOMDataBroker.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/SerializedDOMDataBroker.java index 4053475ccb..d100e8f230 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/SerializedDOMDataBroker.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/SerializedDOMDataBroker.java @@ -71,7 +71,7 @@ public class SerializedDOMDataBroker extends AbstractDOMDataBroker { try { return FluentFuture.from(executor.submit( - new CommitCoordinationTask(transaction, cohorts, commitStatsTracker))); + new CommitCoordinationTask.WithTracker(transaction, cohorts, commitStatsTracker))); } catch (RejectedExecutionException e) { LOG.error("The commit executor's queue is full - submit task was rejected. \n{}", executor, e); return FluentFutures.immediateFailedFluentFuture(new TransactionCommitFailedException( diff --git a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTaskTest.java b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTaskTest.java index 3cf8b485b2..d93072dd74 100644 --- a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTaskTest.java +++ b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/CommitCoordinationTaskTest.java @@ -20,14 +20,14 @@ import org.opendaylight.mdsal.dom.spi.store.DOMStoreThreePhaseCommitCohort; import org.opendaylight.yangtools.util.concurrent.FluentFutures; public class CommitCoordinationTaskTest { - private final DOMStoreThreePhaseCommitCohort cohort = mock(DOMStoreThreePhaseCommitCohort.class); + private CommitCoordinationTask task; @Before public void setUp() throws Exception { final DOMDataTreeWriteTransaction tx = mock(DOMDataTreeWriteTransaction.class); - task = new CommitCoordinationTask(tx, ImmutableList.of(cohort), null); + task = new CommitCoordinationTask(tx, ImmutableList.of(cohort)); doReturn("test").when(tx).getIdentifier(); }