diff options
author | Eike Stepper | 2010-09-17 11:30:27 +0000 |
---|---|---|
committer | Eike Stepper | 2010-09-17 11:30:27 +0000 |
commit | 3106cea08140b348ddf6afe144c46887b85237b3 (patch) | |
tree | 0d057294c65aa76ee99392fa54f40b9fd995a750 | |
parent | 90317aa6758bfee3128a4e2d7d795f90531ea4a0 (diff) | |
download | cdo-3106cea08140b348ddf6afe144c46887b85237b3.tar.gz cdo-3106cea08140b348ddf6afe144c46887b85237b3.tar.xz cdo-3106cea08140b348ddf6afe144c46887b85237b3.zip |
[325549] Synchronizable repository: order of commits is not ensured (CommitRunnable / WriteThroughCommitContext)
https://bugs.eclipse.org/bugs/show_bug.cgi?id=325549
-rw-r--r-- | plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java index 7359e4adee..c3bb10ede7 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java @@ -59,6 +59,9 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; /** * TODO: @@ -107,8 +110,15 @@ public abstract class SynchronizableRepository extends Repository.Default implem private int lastTransactionID; + private ReadLock writeThroughCommitLock; + + private WriteLock handleCommitInfoLock; + public SynchronizableRepository() { + ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); + writeThroughCommitLock = rwLock.readLock(); + handleCommitInfoLock = rwLock.writeLock(); } public InternalRepositorySynchronizer getSynchronizer() @@ -205,6 +215,8 @@ public abstract class SynchronizableRepository extends Repository.Default implem try { + handleCommitInfoLock.lock(); + commitContext.write(new Monitor()); commitContext.commit(new Monitor()); @@ -214,6 +226,7 @@ public abstract class SynchronizableRepository extends Repository.Default implem } finally { + handleCommitInfoLock.unlock(); commitContext.postCommit(success); transaction.close(); } @@ -508,10 +521,19 @@ public abstract class SynchronizableRepository extends Repository.Default implem addIDMappings(result.getIDMappings()); applyIDMappings(new Monitor()); - // Commit to the local repository - super.preWrite(); - super.write(new Monitor()); - super.commit(new Monitor()); + try + { + writeThroughCommitLock.lock(); + + // Commit to the local repository + super.preWrite(); + super.write(new Monitor()); + super.commit(new Monitor()); + } + finally + { + writeThroughCommitLock.unlock(); + } // Remember commit time in the local repository setLastCommitTimeStamp(timeStamp); |