diff options
author | Ryan D. Brooks | 2018-02-23 17:07:37 +0000 |
---|---|---|
committer | Ryan D. Brooks | 2020-12-15 22:28:27 +0000 |
commit | 20a211daa6d42e60a442f8b3fc988a81a96b4b5b (patch) | |
tree | bd6b17fb065590c0618511149dbc7e70772c9ee5 | |
parent | 81920feadc87c7408e28f685afbd2ece9c20c499 (diff) | |
download | org.eclipse.osee-20a211daa6d42e60a442f8b3fc988a81a96b4b5b.tar.gz org.eclipse.osee-20a211daa6d42e60a442f8b3fc988a81a96b4b5b.tar.xz org.eclipse.osee-20a211daa6d42e60a442f8b3fc988a81a96b4b5b.zip |
bug: Safely handle concurrent transactions on serverrbrooks/dev
Change-Id: If8d01884dae0eb5b93e6c82461179ff399aeba79
2 files changed, 12 insertions, 2 deletions
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxCallableFactory.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxCallableFactory.java index 3fb0909a8a5..ffe03be15d5 100644 --- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxCallableFactory.java +++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxCallableFactory.java @@ -91,8 +91,7 @@ public class TxCallableFactory { private TransactionResult doCommit() throws Exception { TransactionData changes = txManager.createChangeData(txData); - Callable<TransactionResult> callable = txDataStore.commitTransaction(getSession(), changes); - return callable.call(); + return txDataStore.commitTransaction(getSession(), changes).call(); } }; } diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxDataManager.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxDataManager.java index 44dea6c9d25..457168b5e20 100644 --- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxDataManager.java +++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/transaction/TxDataManager.java @@ -22,6 +22,10 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; import org.eclipse.osee.framework.core.data.ApplicabilityId; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import org.eclipse.osee.framework.core.data.ArtifactId; import org.eclipse.osee.framework.core.data.ArtifactTypeToken; import org.eclipse.osee.framework.core.data.AttributeTypeToken; @@ -76,6 +80,7 @@ public class TxDataManager { private final RelationManager relationManager; private final TupleDataFactory tupleFactory; private final TxDataLoader loader; + private final ConcurrentMap<Long, Lock> hotBranches = new ConcurrentHashMap<>(); public TxDataManager(ExternalArtifactManager proxyManager, ArtifactFactory artifactFactory, RelationManager relationManager, TupleDataFactory tupleFactory, TxDataLoader loader) { this.proxyManager = proxyManager; @@ -107,6 +112,10 @@ public class TxDataManager { } public void startTx(TxData txData) { + Long branchId = txData.getBranchId(); + hotBranches.putIfAbsent(branchId, new ReentrantLock()); + Lock lock = hotBranches.get(branchId); + lock.lock(); Conditions.checkExpressionFailOnTrue(txData.isCommitInProgress(), "Commit is already in progress"); txData.setCommitInProgress(true); txData.setTxState(TxState.COMMIT_STARTED); @@ -114,6 +123,8 @@ public class TxDataManager { public void endTx(TxData txData) { txData.setCommitInProgress(false); + Lock lock = hotBranches.get(txData.getBranchId()); + lock.unlock(); } public Iterable<Artifact> getForWrite(TxData txData, Iterable<? extends ArtifactId> ids) { |