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

MULTI_THREADED did not work correctly.

上级 822498a8
...@@ -434,7 +434,9 @@ public class PageStore implements CacheWriter { ...@@ -434,7 +434,9 @@ public class PageStore implements CacheWriter {
maxMove = Integer.MAX_VALUE; maxMove = Integer.MAX_VALUE;
} }
for (int x = lastUsed, j = 0; x > MIN_PAGE_COUNT && j < maxMove; x--, j++) { for (int x = lastUsed, j = 0; x > MIN_PAGE_COUNT && j < maxMove; x--, j++) {
synchronized (database) {
compact(x); compact(x);
}
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (now > start + maxCompactTime) { if (now > start + maxCompactTime) {
break; break;
...@@ -523,7 +525,6 @@ public class PageStore implements CacheWriter { ...@@ -523,7 +525,6 @@ public class PageStore implements CacheWriter {
if (p != null) { if (p != null) {
return p; return p;
} }
}
Data data = createData(); Data data = createData();
readPage(pageId, data); readPage(pageId, data);
int type = data.readByte(); int type = data.readByte();
...@@ -535,7 +536,6 @@ public class PageStore implements CacheWriter { ...@@ -535,7 +536,6 @@ public class PageStore implements CacheWriter {
if (!checksumTest(data.getBytes(), pageId, pageSize)) { if (!checksumTest(data.getBytes(), pageId, pageSize)) {
throw DbException.get(ErrorCode.FILE_CORRUPTED_1, "wrong checksum"); throw DbException.get(ErrorCode.FILE_CORRUPTED_1, "wrong checksum");
} }
Page p;
switch (type & ~Page.FLAG_LAST) { switch (type & ~Page.FLAG_LAST) {
case Page.TYPE_FREE_LIST: case Page.TYPE_FREE_LIST:
p = PageFreeList.read(this, data, pageId); p = PageFreeList.read(this, data, pageId);
...@@ -592,6 +592,7 @@ public class PageStore implements CacheWriter { ...@@ -592,6 +592,7 @@ public class PageStore implements CacheWriter {
cache.put(p); cache.put(p);
return p; return p;
} }
}
private int getFirstUncommittedSection() { private int getFirstUncommittedSection() {
trace.debug("getFirstUncommittedSection"); trace.debug("getFirstUncommittedSection");
...@@ -729,6 +730,7 @@ public class PageStore implements CacheWriter { ...@@ -729,6 +730,7 @@ public class PageStore implements CacheWriter {
*/ */
public void close() { public void close() {
trace.debug("close"); trace.debug("close");
synchronized (database) {
if (log != null) { if (log != null) {
log.close(); log.close();
log = null; log = null;
...@@ -741,6 +743,7 @@ public class PageStore implements CacheWriter { ...@@ -741,6 +743,7 @@ public class PageStore implements CacheWriter {
} }
} }
} }
}
public void flushLog() { public void flushLog() {
if (file != null) { if (file != null) {
...@@ -845,6 +848,7 @@ public class PageStore implements CacheWriter { ...@@ -845,6 +848,7 @@ public class PageStore implements CacheWriter {
return list; return list;
} }
} }
synchronized (database) {
int p = PAGE_ID_FREE_LIST_ROOT + i * freeListPagesPerList; int p = PAGE_ID_FREE_LIST_ROOT + i * freeListPagesPerList;
while (p >= pageCount) { while (p >= pageCount) {
increaseFileSize(INCREMENT_PAGES); increaseFileSize(INCREMENT_PAGES);
...@@ -862,6 +866,7 @@ public class PageStore implements CacheWriter { ...@@ -862,6 +866,7 @@ public class PageStore implements CacheWriter {
freeLists.set(i, list); freeLists.set(i, list);
return list; return list;
} }
}
private void freePage(int pageId) { private void freePage(int pageId) {
PageFreeList list = getFreeListForPage(pageId); PageFreeList list = getFreeListForPage(pageId);
......
...@@ -8,9 +8,13 @@ package org.h2.test.db; ...@@ -8,9 +8,13 @@ package org.h2.test.db;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement; import java.sql.Statement;
import java.util.ArrayList;
import java.util.Random;
import org.h2.test.TestBase; import org.h2.test.TestBase;
import org.h2.util.JdbcUtils; import org.h2.util.JdbcUtils;
import org.h2.util.New;
/** /**
* A multi-threaded test case. * A multi-threaded test case.
...@@ -41,6 +45,8 @@ public class TestMultiThreadedKernel extends TestBase { ...@@ -41,6 +45,8 @@ public class TestMultiThreadedKernel extends TestBase {
return; return;
} }
deleteDb("multiThreadedKernel"); deleteDb("multiThreadedKernel");
testCache();
deleteDb("multiThreadedKernel");
final String url = getURL("multiThreadedKernel;DB_CLOSE_DELAY=-1;MULTI_THREADED=1", true); final String url = getURL("multiThreadedKernel;DB_CLOSE_DELAY=-1;MULTI_THREADED=1", true);
final String user = getUser(), password = getPassword(); final String user = getUser(), password = getPassword();
int len = 3; int len = 3;
...@@ -82,4 +88,46 @@ public class TestMultiThreadedKernel extends TestBase { ...@@ -82,4 +88,46 @@ public class TestMultiThreadedKernel extends TestBase {
deleteDb("multiThreadedKernel"); 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论