提交 5dd78b05 authored 作者: Thomas Mueller's avatar Thomas Mueller

After deleting a lot of data (for example by dropping or altering tables, or…

After deleting a lot of data (for example by dropping or altering tables, or indexes, or after a large transaction), opening a large database was very slow. Fixed.
When killing the process after creating and dropping many tables (specially temporary tables), the database could not be opened sometimes.
上级 cafbb9fd
...@@ -220,7 +220,7 @@ public class PageStore implements CacheWriter { ...@@ -220,7 +220,7 @@ public class PageStore implements CacheWriter {
this.accessMode = accessMode; this.accessMode = accessMode;
this.database = database; this.database = database;
trace = database.getTrace(Trace.PAGE_STORE); trace = database.getTrace(Trace.PAGE_STORE);
// if (!fileName.endsWith("reopen.h2.db")) // if (fileName.endsWith("X.h2.db"))
// trace.setLevel(TraceSystem.DEBUG); // trace.setLevel(TraceSystem.DEBUG);
String cacheType = database.getCacheType(); String cacheType = database.getCacheType();
this.cache = CacheLRU.getCache(this, cacheType, cacheSizeDefault); this.cache = CacheLRU.getCache(this, cacheType, cacheSizeDefault);
...@@ -341,6 +341,7 @@ public class PageStore implements CacheWriter { ...@@ -341,6 +341,7 @@ public class PageStore implements CacheWriter {
logFirstTrunkPage = allocatePage(); logFirstTrunkPage = allocatePage();
log.openForWriting(logFirstTrunkPage, false); log.openForWriting(logFirstTrunkPage, false);
recoveryRunning = false; recoveryRunning = false;
freed.set(0, pageCount);
checkpoint(); checkpoint();
removeOldTempIndexes(); removeOldTempIndexes();
} }
...@@ -402,7 +403,7 @@ public class PageStore implements CacheWriter { ...@@ -402,7 +403,7 @@ public class PageStore implements CacheWriter {
// ensure the free list is backed up again // ensure the free list is backed up again
log.checkpoint(); log.checkpoint();
byte[] test = new byte[16];
byte[] empty = new byte[pageSize]; byte[] empty = new byte[pageSize];
for (int i = PAGE_ID_FREE_LIST_ROOT; i < pageCount; i++) { for (int i = PAGE_ID_FREE_LIST_ROOT; i < pageCount; i++) {
if (isUsed(i)) { if (isUsed(i)) {
...@@ -411,10 +412,14 @@ public class PageStore implements CacheWriter { ...@@ -411,10 +412,14 @@ public class PageStore implements CacheWriter {
if (trace.isDebugEnabled()) { if (trace.isDebugEnabled()) {
trace.debug("free " + i); trace.debug("free " + i);
} }
freed.set(i);
file.seek((long) i << pageSizeShift); file.seek((long) i << pageSizeShift);
file.write(empty, 0, pageSize); file.readFully(test, 0, 16);
writeCount++; if (test[0] != 0) {
file.seek((long) i << pageSizeShift);
file.write(empty, 0, pageSize);
writeCount++;
}
freed.set(i);
} }
} }
} }
...@@ -1018,6 +1023,13 @@ public class PageStore implements CacheWriter { ...@@ -1018,6 +1023,13 @@ public class PageStore implements CacheWriter {
freePage(pageId); freePage(pageId);
if (recoveryRunning) { if (recoveryRunning) {
writePage(pageId, createData()); writePage(pageId, createData());
if (reservedPages != null && reservedPages.containsKey(pageId)) {
// re-allocate the page if it is used later on again
int latestPos = reservedPages.get(pageId);
if (latestPos > log.getLogPos()) {
allocatePage(pageId);
}
}
} }
} }
} }
...@@ -1354,7 +1366,6 @@ public class PageStore implements CacheWriter { ...@@ -1354,7 +1366,6 @@ public class PageStore implements CacheWriter {
private void removeMeta(int logPos, Row row) { private void removeMeta(int logPos, Row row) {
int id = row.getValue(0).getInt(); int id = row.getValue(0).getInt();
PageIndex index = metaObjects.get(id); PageIndex index = metaObjects.get(id);
int rootPageId = index.getRootPageId();
index.getTable().removeIndex(index); index.getTable().removeIndex(index);
if (index instanceof PageBtreeIndex || index instanceof PageDelegateIndex) { if (index instanceof PageBtreeIndex || index instanceof PageDelegateIndex) {
if (index.isTemporary()) { if (index.isTemporary()) {
...@@ -1365,13 +1376,6 @@ public class PageStore implements CacheWriter { ...@@ -1365,13 +1376,6 @@ public class PageStore implements CacheWriter {
} }
index.remove(systemSession); index.remove(systemSession);
metaObjects.remove(id); metaObjects.remove(id);
if (reservedPages != null && reservedPages.containsKey(rootPageId)) {
// re-allocate the page if it is used later on again
int latestPos = reservedPages.get(rootPageId);
if (latestPos > logPos) {
allocatePage(rootPageId);
}
}
} }
private void addMeta(Row row, Session session, boolean redo) { private void addMeta(Row row, Session session, boolean redo) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论