提交 4c28636c authored 作者: Thomas Mueller's avatar Thomas Mueller

MULTI_THREADED did not work correctly.

上级 822498a8
......@@ -434,7 +434,9 @@ public class PageStore implements CacheWriter {
maxMove = Integer.MAX_VALUE;
}
for (int x = lastUsed, j = 0; x > MIN_PAGE_COUNT && j < maxMove; x--, j++) {
synchronized (database) {
compact(x);
}
long now = System.currentTimeMillis();
if (now > start + maxCompactTime) {
break;
......@@ -523,7 +525,6 @@ public class PageStore implements CacheWriter {
if (p != null) {
return p;
}
}
Data data = createData();
readPage(pageId, data);
int type = data.readByte();
......@@ -535,7 +536,6 @@ public class PageStore implements CacheWriter {
if (!checksumTest(data.getBytes(), pageId, pageSize)) {
throw DbException.get(ErrorCode.FILE_CORRUPTED_1, "wrong checksum");
}
Page p;
switch (type & ~Page.FLAG_LAST) {
case Page.TYPE_FREE_LIST:
p = PageFreeList.read(this, data, pageId);
......@@ -592,6 +592,7 @@ public class PageStore implements CacheWriter {
cache.put(p);
return p;
}
}
private int getFirstUncommittedSection() {
trace.debug("getFirstUncommittedSection");
......@@ -729,6 +730,7 @@ public class PageStore implements CacheWriter {
*/
public void close() {
trace.debug("close");
synchronized (database) {
if (log != null) {
log.close();
log = null;
......@@ -741,6 +743,7 @@ public class PageStore implements CacheWriter {
}
}
}
}
public void flushLog() {
if (file != null) {
......@@ -845,6 +848,7 @@ public class PageStore implements CacheWriter {
return list;
}
}
synchronized (database) {
int p = PAGE_ID_FREE_LIST_ROOT + i * freeListPagesPerList;
while (p >= pageCount) {
increaseFileSize(INCREMENT_PAGES);
......@@ -862,6 +866,7 @@ public class PageStore implements CacheWriter {
freeLists.set(i, list);
return list;
}
}
private void freePage(int pageId) {
PageFreeList list = getFreeListForPage(pageId);
......
......@@ -8,9 +8,13 @@ package org.h2.test.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Random;
import org.h2.test.TestBase;
import org.h2.util.JdbcUtils;
import org.h2.util.New;
/**
* A multi-threaded test case.
......@@ -41,6 +45,8 @@ public class TestMultiThreadedKernel extends TestBase {
return;
}
deleteDb("multiThreadedKernel");
testCache();
deleteDb("multiThreadedKernel");
final String url = getURL("multiThreadedKernel;DB_CLOSE_DELAY=-1;MULTI_THREADED=1", true);
final String user = getUser(), password = getPassword();
int len = 3;
......@@ -82,4 +88,46 @@ public class TestMultiThreadedKernel extends TestBase {
deleteDb("multiThreadedKernel");
}
private void testCache() throws Exception {
ArrayList<Thread> list = New.arrayList();
int size = 3;
final int count = 100;
final boolean[] stopped = { false };
String url = getURL("multiThreadedKernel;MULTI_THREADED=TRUE;CACHE_SIZE=1", true);
for (int i = 0; i < size; i++) {
final Connection conn = DriverManager.getConnection(url, getUser(), getPassword());
if (i == 0) {
Statement stat = conn.createStatement();
stat.execute("create table test(id int primary key, name varchar) "
+ "as select x, space(3000) from system_range(1, " + count + ")");
}
final Random random = new Random(i);
final int x = i;
Thread t = new Thread() {
public void run() {
try {
PreparedStatement prep = conn.prepareStatement(
"select * from test where id = ?");
Statement stat = conn.createStatement();
while (!stopped[0]) {
prep.setInt(1, random.nextInt(count));
prep.execute();
stat.execute("create table test" + x + "(id int)");
stat.execute("drop table test" + x);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
list.add(t);
}
Thread.sleep(1000);
stopped[0] = true;
for (Thread t : list) {
t.join();
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论