提交 ad794494 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Fix incorrect reads from the undo log

上级 2f95302e
...@@ -1286,7 +1286,12 @@ public class TransactionStore { ...@@ -1286,7 +1286,12 @@ public class TransactionStore {
// transaction (possibly one with the same id) // transaction (possibly one with the same id)
data = map.get(key); data = map.get(key);
} else { } else {
if (map.getId() == (int) d[0]) {
data = (VersionedValue) d[2]; data = (VersionedValue) d[2];
} else {
// this entry does not belong to this map, try again
data = map.get(key);
}
} }
} }
} }
......
...@@ -12,6 +12,7 @@ import java.sql.SQLException; ...@@ -12,6 +12,7 @@ import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.ArrayList; import java.util.ArrayList;
import org.h2.jdbc.JdbcSQLException; import org.h2.jdbc.JdbcSQLException;
import org.h2.message.DbException;
import org.h2.test.TestBase; import org.h2.test.TestBase;
import org.h2.util.IOUtils; import org.h2.util.IOUtils;
...@@ -80,9 +81,11 @@ public class TestMvccMultiThreaded2 extends TestBase { ...@@ -80,9 +81,11 @@ public class TestMvccMultiThreaded2 extends TestBase {
@SuppressWarnings("unused") @SuppressWarnings("unused")
int minProcessed = Integer.MAX_VALUE, maxProcessed = 0, totalProcessed = 0; int minProcessed = Integer.MAX_VALUE, maxProcessed = 0, totalProcessed = 0;
boolean allOk = true;
for (SelectForUpdate sfu : threads) { for (SelectForUpdate sfu : threads) {
// make sure all threads have stopped by joining with them // make sure all threads have stopped by joining with them
sfu.join(); sfu.join();
allOk &= sfu.ok;
totalProcessed += sfu.iterationsProcessed; totalProcessed += sfu.iterationsProcessed;
if (sfu.iterationsProcessed > maxProcessed) { if (sfu.iterationsProcessed > maxProcessed) {
maxProcessed = sfu.iterationsProcessed; maxProcessed = sfu.iterationsProcessed;
...@@ -102,6 +105,8 @@ public class TestMvccMultiThreaded2 extends TestBase { ...@@ -102,6 +105,8 @@ public class TestMvccMultiThreaded2 extends TestBase {
IOUtils.closeSilently(conn); IOUtils.closeSilently(conn);
deleteDb(getTestName()); deleteDb(getTestName());
assertTrue(allOk);
} }
/** /**
...@@ -111,6 +116,8 @@ public class TestMvccMultiThreaded2 extends TestBase { ...@@ -111,6 +116,8 @@ public class TestMvccMultiThreaded2 extends TestBase {
public int iterationsProcessed; public int iterationsProcessed;
public boolean ok;
SelectForUpdate() { SelectForUpdate() {
} }
...@@ -149,11 +156,13 @@ public class TestMvccMultiThreaded2 extends TestBase { ...@@ -149,11 +156,13 @@ public class TestMvccMultiThreaded2 extends TestBase {
} }
} catch (SQLException e) { } catch (SQLException e) {
TestBase.logError("SQL error from thread "+getName(), e); TestBase.logError("SQL error from thread "+getName(), e);
throw DbException.convert(e);
} catch (Exception e) { } catch (Exception e) {
TestBase.logError("General error from thread "+getName(), e); TestBase.logError("General error from thread "+getName(), e);
throw e; throw e;
} }
IOUtils.closeSilently(conn); IOUtils.closeSilently(conn);
ok = true;
} }
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论