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

New experimental page store.

上级 9658fe81
...@@ -103,9 +103,9 @@ public class PageFreeList extends Record { ...@@ -103,9 +103,9 @@ public class PageFreeList extends Record {
+ " expected type:" + Page.TYPE_FREE_LIST); + " expected type:" + Page.TYPE_FREE_LIST);
} }
for (int i = 0; i < pageCount; i += 8) { for (int i = 0; i < pageCount; i += 8) {
used.setByte(i, data.readByte()); used.setByte(i, data.readByte() & 255);
} }
full = used.nextClearBit(0) >= pageCount * 8; full = false;
} }
public int getByteCount(DataPage dummy) { public int getByteCount(DataPage dummy) {
......
...@@ -144,11 +144,18 @@ public class PageLog { ...@@ -144,11 +144,18 @@ public class PageLog {
* Free up all pages allocated by the log. * Free up all pages allocated by the log.
*/ */
void free() throws SQLException { void free() throws SQLException {
if (this.firstTrunkPage != 0) { while (this.firstTrunkPage != 0) {
// first remove all old log pages // first remove all old log pages
PageStreamTrunk t = new PageStreamTrunk(store, this.firstTrunkPage); PageStreamTrunk t = new PageStreamTrunk(store, this.firstTrunkPage);
try {
t.read(); t.read();
} catch (SQLException e) {
store.freePage(firstTrunkPage, false, null);
// EOF
break;
}
t.free(); t.free();
firstTrunkPage = t.getNextTrunk();
} }
} }
...@@ -525,8 +532,9 @@ public class PageLog { ...@@ -525,8 +532,9 @@ public class PageLog {
void close() throws SQLException { void close() throws SQLException {
try { try {
trace.debug("log close"); trace.debug("log close");
if (out != null) { if (pageOut != null) {
out.close(); pageOut.close();
pageOut = null;
} }
out = null; out = null;
} catch (IOException e) { } catch (IOException e) {
......
...@@ -93,10 +93,6 @@ public class PageOutputStream extends OutputStream { ...@@ -93,10 +93,6 @@ public class PageOutputStream extends OutputStream {
} }
int len = PageStreamTrunk.getPagesAddressed(store.getPageSize()); int len = PageStreamTrunk.getPagesAddressed(store.getPageSize());
int[] pageIds = new int[len]; int[] pageIds = new int[len];
if (reservedPages.size() < len) {
int test;
System.out.println("stop");
}
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
pageIds[i] = reservedPages.get(i); pageIds[i] = reservedPages.get(i);
} }
...@@ -161,6 +157,11 @@ public class PageOutputStream extends OutputStream { ...@@ -161,6 +157,11 @@ public class PageOutputStream extends OutputStream {
public void close() throws IOException { public void close() throws IOException {
flush(); flush();
try {
freeReserve();
} catch (SQLException e) {
throw Message.convertToIOException(e);
}
store = null; store = null;
} }
...@@ -207,4 +208,13 @@ public class PageOutputStream extends OutputStream { ...@@ -207,4 +208,13 @@ public class PageOutputStream extends OutputStream {
return pages * store.getPageSize(); return pages * store.getPageSize();
} }
private void freeReserve() throws SQLException {
for (int i = 0; i < reservedPages.size(); i++) {
int p = reservedPages.get(i);
store.freePage(p, false, null);
}
reservedPages = new IntArray();
remaining = 0;
}
} }
...@@ -181,7 +181,8 @@ public class PageStore implements CacheWriter { ...@@ -181,7 +181,8 @@ public class PageStore implements CacheWriter {
private PageScanIndex metaIndex; private PageScanIndex metaIndex;
private HashMap<Integer, Index> metaObjects; private HashMap<Integer, Index> metaObjects;
private int systemTableHeadPos; private int systemTableHeadPos;
private long maxLogSize = Constants.DEFAULT_MAX_LOG_SIZE; // TODO reduce DEFAULT_MAX_LOG_SIZE, and don't divide here
private long maxLogSize = Constants.DEFAULT_MAX_LOG_SIZE / 10;
/** /**
* Create a new page store object. * Create a new page store object.
...@@ -309,6 +310,10 @@ public class PageStore implements CacheWriter { ...@@ -309,6 +310,10 @@ public class PageStore implements CacheWriter {
} }
log.checkpoint(); log.checkpoint();
switchLog(); switchLog();
// write back the free list
for (CacheObject rec : list) {
writeBack(rec);
}
byte[] empty = new byte[pageSize]; byte[] empty = new byte[pageSize];
// TODO avoid to write empty pages // TODO avoid to write empty pages
for (int i = PAGE_ID_FREE_LIST_ROOT; i < pageCount; i++) { for (int i = PAGE_ID_FREE_LIST_ROOT; i < pageCount; i++) {
...@@ -452,6 +457,7 @@ public class PageStore implements CacheWriter { ...@@ -452,6 +457,7 @@ public class PageStore implements CacheWriter {
public void close() throws SQLException { public void close() throws SQLException {
try { try {
trace.debug("close"); trace.debug("close");
log.close();
if (file != null) { if (file != null) {
file.close(); file.close();
} }
......
...@@ -826,7 +826,7 @@ public class Recover extends Tool implements DataHandler { ...@@ -826,7 +826,7 @@ public class Recover extends Tool implements DataHandler {
break; break;
case Page.TYPE_FREE_LIST: case Page.TYPE_FREE_LIST:
writer.println("-- page " + page + ": free list " + (last ? "(last)" : "")); writer.println("-- page " + page + ": free list " + (last ? "(last)" : ""));
free += dumpPageFreeList(writer, s, pageSize, page); free += dumpPageFreeList(writer, s, pageSize, page, pageCount);
break; break;
case Page.TYPE_STREAM_TRUNK: case Page.TYPE_STREAM_TRUNK:
writer.println("-- page " + page + ": log trunk"); writer.println("-- page " + page + ": log trunk");
...@@ -1052,22 +1052,26 @@ public class Recover extends Tool implements DataHandler { ...@@ -1052,22 +1052,26 @@ public class Recover extends Tool implements DataHandler {
writer.println("-- [" + entryCount + "] child: " + children[entryCount] + " rowCount: " + rowCount); writer.println("-- [" + entryCount + "] child: " + children[entryCount] + " rowCount: " + rowCount);
} }
private int dumpPageFreeList(PrintWriter writer, DataPage s, int pageSize, long pageId) { private int dumpPageFreeList(PrintWriter writer, DataPage s, int pageSize, long pageId, long pageCount) {
int pagesAddressed = PageFreeList.getPagesAddressed(pageSize); int pagesAddressed = PageFreeList.getPagesAddressed(pageSize);
BitField used = new BitField(); BitField used = new BitField();
for (int i = 0; i < pagesAddressed; i += 8) { for (int i = 0; i < pagesAddressed; i += 8) {
used.setByte(i, s.readByte()); used.setByte(i, s.readByte() & 255);
} }
int free = 0; int free = 0;
for (int i = 0; i < pagesAddressed; i++) { for (long i = 0, j = pageId; i < pagesAddressed && j < pageCount; i++, j++) {
if (i % 80 == 0) { if (i == 0 || j % 100 == 0) {
if (i > 0) { if (i > 0) {
writer.println(); writer.println();
} }
writer.print("-- " + (i + pageId) + " "); writer.print("-- " + j + " ");
} else if (j % 20 == 0) {
writer.print(" - ");
} else if (j % 10 == 0) {
writer.print(' ');
} }
writer.print(used.get(i) ? '1' : '0'); writer.print(used.get((int) i) ? '1' : '0');
if (!used.get(i)) { if (!used.get((int) i)) {
free++; free++;
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论