提交 9447abe0 authored 作者: andrei's avatar andrei

Look Ma, no more locks!

上级 05ad3781
...@@ -10,9 +10,9 @@ import org.h2.mvstore.DataUtils; ...@@ -10,9 +10,9 @@ import org.h2.mvstore.DataUtils;
import org.h2.mvstore.MVMap; import org.h2.mvstore.MVMap;
import org.h2.mvstore.Page; import org.h2.mvstore.Page;
import org.h2.mvstore.type.DataType; import org.h2.mvstore.type.DataType;
import java.util.BitSet;
import java.util.AbstractMap; import java.util.AbstractMap;
import java.util.BitSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
...@@ -99,8 +99,6 @@ public class TransactionMap<K, V> { ...@@ -99,8 +99,6 @@ public class TransactionMap<K, V> {
*/ */
public long sizeAsLong() { public long sizeAsLong() {
TransactionStore store = transaction.store; TransactionStore store = transaction.store;
store.rwLock.readLock().lock();
try {
MVMap<Long, Object[]> undo = transaction.store.undoLog; MVMap<Long, Object[]> undo = transaction.store.undoLog;
BitSet committingTransactions; BitSet committingTransactions;
...@@ -167,9 +165,6 @@ public class TransactionMap<K, V> { ...@@ -167,9 +165,6 @@ public class TransactionMap<K, V> {
transaction.store.store.removeMap(temp); transaction.store.store.removeMap(temp);
} }
return size; return size;
} finally {
transaction.store.rwLock.readLock().unlock();
}
} }
/** /**
...@@ -420,8 +415,6 @@ public class TransactionMap<K, V> { ...@@ -420,8 +415,6 @@ public class TransactionMap<K, V> {
private VersionedValue getValue(K key, long maxLog) { private VersionedValue getValue(K key, long maxLog) {
TransactionStore store = transaction.store; TransactionStore store = transaction.store;
store.rwLock.readLock().lock();
try {
BitSet committingTransactions; BitSet committingTransactions;
MVMap.RootReference mapRootReference; MVMap.RootReference mapRootReference;
MVMap.RootReference undoLogRootReference; MVMap.RootReference undoLogRootReference;
...@@ -436,9 +429,6 @@ public class TransactionMap<K, V> { ...@@ -436,9 +429,6 @@ public class TransactionMap<K, V> {
Page mapRootPage = mapRootReference.root; Page mapRootPage = mapRootReference.root;
VersionedValue data = map.get(mapRootPage, key); VersionedValue data = map.get(mapRootPage, key);
return getValue(mapRootPage, undoRootPage, key, maxLog, data, store.committingTransactions.get()); return getValue(mapRootPage, undoRootPage, key, maxLog, data, store.committingTransactions.get());
} finally {
store.rwLock.readLock().unlock();
}
} }
/** /**
......
...@@ -13,7 +13,6 @@ import java.util.Iterator; ...@@ -13,7 +13,6 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.h2.mvstore.DataUtils; import org.h2.mvstore.DataUtils;
import org.h2.mvstore.MVMap; import org.h2.mvstore.MVMap;
import org.h2.mvstore.MVStore; import org.h2.mvstore.MVStore;
...@@ -54,12 +53,6 @@ public class TransactionStore { ...@@ -54,12 +53,6 @@ public class TransactionStore {
*/ */
final MVMap<Long, Object[]> undoLog; final MVMap<Long, Object[]> undoLog;
/**
* the reader/writer lock for the undo-log. Allows us to process multiple
* selects in parallel.
*/
final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
/** /**
* The map of maps. * The map of maps.
*/ */
...@@ -169,8 +162,6 @@ public class TransactionStore { ...@@ -169,8 +162,6 @@ public class TransactionStore {
store.removeMap(temp); store.removeMap(temp);
} }
} }
rwLock.writeLock().lock();
try {
if (!undoLog.isEmpty()) { if (!undoLog.isEmpty()) {
Long key = undoLog.firstKey(); Long key = undoLog.firstKey();
while (key != null) { while (key != null) {
...@@ -200,9 +191,6 @@ public class TransactionStore { ...@@ -200,9 +191,6 @@ public class TransactionStore {
} }
} }
} }
} finally {
rwLock.writeLock().unlock();
}
init = true; init = true;
} }
} }
...@@ -277,8 +265,6 @@ public class TransactionStore { ...@@ -277,8 +265,6 @@ public class TransactionStore {
if(!init) { if(!init) {
init(); init();
} }
rwLock.readLock().lock();
try {
ArrayList<Transaction> list = new ArrayList<>(); ArrayList<Transaction> list = new ArrayList<>();
int transactionId = 0; int transactionId = 0;
BitSet bitSet = openTransactions.get(); BitSet bitSet = openTransactions.get();
...@@ -291,9 +277,6 @@ public class TransactionStore { ...@@ -291,9 +277,6 @@ public class TransactionStore {
} }
} }
return list; return list;
} finally {
rwLock.readLock().unlock();
}
} }
/** /**
...@@ -387,8 +370,6 @@ public class TransactionStore { ...@@ -387,8 +370,6 @@ public class TransactionStore {
*/ */
long addUndoLogRecord(int transactionId, long logId, Object[] undoLogRecord) { long addUndoLogRecord(int transactionId, long logId, Object[] undoLogRecord) {
Long undoKey = getOperationId(transactionId, logId); Long undoKey = getOperationId(transactionId, logId);
rwLock.writeLock().lock();
try {
if (logId == 0) { if (logId == 0) {
if (undoLog.containsKey(undoKey)) { if (undoLog.containsKey(undoKey)) {
throw DataUtils.newIllegalStateException( throw DataUtils.newIllegalStateException(
...@@ -399,9 +380,6 @@ public class TransactionStore { ...@@ -399,9 +380,6 @@ public class TransactionStore {
} }
} }
undoLog.put(undoKey, undoLogRecord); undoLog.put(undoKey, undoLogRecord);
} finally {
rwLock.writeLock().unlock();
}
return undoKey; return undoKey;
} }
...@@ -413,8 +391,6 @@ public class TransactionStore { ...@@ -413,8 +391,6 @@ public class TransactionStore {
*/ */
public void removeUndoLogRecord(int transactionId, long logId) { public void removeUndoLogRecord(int transactionId, long logId) {
Long undoKey = getOperationId(transactionId, logId); Long undoKey = getOperationId(transactionId, logId);
rwLock.writeLock().lock();
try {
Object[] old = undoLog.remove(undoKey); Object[] old = undoLog.remove(undoKey);
if (old == null) { if (old == null) {
throw DataUtils.newIllegalStateException( throw DataUtils.newIllegalStateException(
...@@ -422,9 +398,6 @@ public class TransactionStore { ...@@ -422,9 +398,6 @@ public class TransactionStore {
"Transaction {0} was concurrently rolled back", "Transaction {0} was concurrently rolled back",
transactionId); transactionId);
} }
} finally {
rwLock.writeLock().unlock();
}
} }
/** /**
...@@ -455,8 +428,6 @@ public class TransactionStore { ...@@ -455,8 +428,6 @@ public class TransactionStore {
flipCommittingTransactionsBit(transactionId, true); flipCommittingTransactionsBit(transactionId, true);
CommitDecisionMaker commitDecisionMaker = new CommitDecisionMaker(); CommitDecisionMaker commitDecisionMaker = new CommitDecisionMaker();
// TODO could synchronize on blocks (100 at a time or so)
rwLock.writeLock().lock();
try { try {
for (long logId = 0; logId < maxLogId; logId++) { for (long logId = 0; logId < maxLogId; logId++) {
Long undoKey = getOperationId(transactionId, logId); Long undoKey = getOperationId(transactionId, logId);
...@@ -481,7 +452,6 @@ public class TransactionStore { ...@@ -481,7 +452,6 @@ public class TransactionStore {
undoLog.remove(undoKey); undoLog.remove(undoKey);
} }
} finally { } finally {
rwLock.writeLock().unlock();
flipCommittingTransactionsBit(transactionId, false); flipCommittingTransactionsBit(transactionId, false);
} }
} }
...@@ -635,9 +605,6 @@ public class TransactionStore { ...@@ -635,9 +605,6 @@ public class TransactionStore {
* @param toLogId the log id to roll back to * @param toLogId the log id to roll back to
*/ */
void rollbackTo(Transaction t, long maxLogId, long toLogId) { void rollbackTo(Transaction t, long maxLogId, long toLogId) {
// TODO could synchronize on blocks (100 at a time or so)
rwLock.writeLock().lock();
try {
int transactionId = t.getId(); int transactionId = t.getId();
RollbackDecisionMaker decisionMaker = new RollbackDecisionMaker(this, transactionId, toLogId, t.listener); RollbackDecisionMaker decisionMaker = new RollbackDecisionMaker(this, transactionId, toLogId, t.listener);
for (long logId = maxLogId - 1; logId >= toLogId; logId--) { for (long logId = maxLogId - 1; logId >= toLogId; logId--) {
...@@ -645,9 +612,6 @@ public class TransactionStore { ...@@ -645,9 +612,6 @@ public class TransactionStore {
undoLog.operate(undoKey, null, decisionMaker); undoLog.operate(undoKey, null, decisionMaker);
decisionMaker.reset(); decisionMaker.reset();
} }
} finally {
rwLock.writeLock().unlock();
}
} }
/** /**
...@@ -667,8 +631,6 @@ public class TransactionStore { ...@@ -667,8 +631,6 @@ public class TransactionStore {
private Change current; private Change current;
private void fetchNext() { private void fetchNext() {
rwLock.writeLock().lock();
try {
int transactionId = t.getId(); int transactionId = t.getId();
while (logId >= toLogId) { while (logId >= toLogId) {
Long undoKey = getOperationId(transactionId, logId); Long undoKey = getOperationId(transactionId, logId);
...@@ -692,9 +654,6 @@ public class TransactionStore { ...@@ -692,9 +654,6 @@ public class TransactionStore {
return; return;
} }
} }
} finally {
rwLock.writeLock().unlock();
}
current = null; current = null;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论