提交 3b349bd9 authored 作者: Thomas Mueller's avatar Thomas Mueller

When using large transactions or a small log size, the database could get very slow.

上级 cbdbbfd0
...@@ -391,7 +391,7 @@ public class PageDataLeaf extends PageData { ...@@ -391,7 +391,7 @@ public class PageDataLeaf extends PageData {
boolean remove(long key) { boolean remove(long key) {
int i = find(key); int i = find(key);
if (keys[i] != key) { if (keys[i] != key) {
throw DbException.get(ErrorCode.ROW_NOT_FOUND_WHEN_DELETING_1, index.getSQL() + ": " + key); throw DbException.get(ErrorCode.ROW_NOT_FOUND_WHEN_DELETING_1, index.getSQL() + ": " + key + " " + keys[i]);
} }
index.getPageStore().logUndo(this, data); index.getPageStore().logUndo(this, data);
if (entryCount == 1) { if (entryCount == 1) {
......
...@@ -204,6 +204,8 @@ public class PageStore implements CacheWriter { ...@@ -204,6 +204,8 @@ public class PageStore implements CacheWriter {
private Data emptyPage; private Data emptyPage;
private long logSizeBase;
/** /**
* Create a new page store object. * Create a new page store object.
* *
...@@ -334,15 +336,10 @@ public class PageStore implements CacheWriter { ...@@ -334,15 +336,10 @@ public class PageStore implements CacheWriter {
} }
synchronized (database) { synchronized (database) {
database.checkPowerOff(); database.checkPowerOff();
int firstUncommittedSection = getFirstUncommittedSection();
if (firstUncommittedSection <= log.getLogSectionId()) {
// can not truncate currently - avoid switching
return;
}
writeIndexRowCounts(); writeIndexRowCounts();
writeBack(); writeBack();
log.checkpoint(); log.checkpoint();
firstUncommittedSection = getFirstUncommittedSection(); int firstUncommittedSection = getFirstUncommittedSection();
log.removeUntil(firstUncommittedSection); log.removeUntil(firstUncommittedSection);
// write back the free list // write back the free list
writeBack(); writeBack();
...@@ -1115,8 +1112,9 @@ public class PageStore implements CacheWriter { ...@@ -1115,8 +1112,9 @@ public class PageStore implements CacheWriter {
synchronized (database) { synchronized (database) {
checkOpen(); checkOpen();
log.commit(session.getId()); log.commit(session.getId());
if (log.getSize() > maxLogSize) { if (log.getSize() - logSizeBase > maxLogSize) {
checkpoint(); checkpoint();
logSizeBase = log.getSize();
} }
} }
} }
......
...@@ -72,7 +72,7 @@ public class TestPageStore extends TestBase implements DatabaseEventListener { ...@@ -72,7 +72,7 @@ public class TestPageStore extends TestBase implements DatabaseEventListener {
long before = System.currentTimeMillis(); long before = System.currentTimeMillis();
stat.execute("select nextval('SEQ') from system_range(1, 100000)"); stat.execute("select nextval('SEQ') from system_range(1, 100000)");
long after = System.currentTimeMillis(); long after = System.currentTimeMillis();
// it's hard to test - basically it shouldn't to too many checkpoint operations // it's hard to test - basically it shouldn't checkpoint too often
assertTrue(after - before < 10000); assertTrue(after - before < 10000);
stat.execute("drop table test"); stat.execute("drop table test");
stat.execute("drop sequence seq"); stat.execute("drop sequence seq");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论