Unverified 提交 1ca74da1 authored 作者: Andrei Tokar's avatar Andrei Tokar 提交者: GitHub

Merge pull request #1414 from h2database/defrag-compact

DEFRAG and COMPACT mixup
...@@ -1839,7 +1839,7 @@ but only for at most the time defined by the database setting ""h2.maxCompactTim ...@@ -1839,7 +1839,7 @@ but only for at most the time defined by the database setting ""h2.maxCompactTim
SHUTDOWN IMMEDIATELY closes the database files without any cleanup and without compacting. SHUTDOWN IMMEDIATELY closes the database files without any cleanup and without compacting.
SHUTDOWN DEFRAG re-orders the pages when closing the database so that table scans are faster. SHUTDOWN DEFRAG re-orders the pages when closing the database so that table scans are faster. In case of MVStore it is currently equvalent to COMPACT.
Admin rights are required to execute this command. Admin rights are required to execute this command.
"," ","
......
...@@ -1519,16 +1519,22 @@ public class Database implements DataHandler { ...@@ -1519,16 +1519,22 @@ public class Database implements DataHandler {
} }
} }
reconnectModified(false); reconnectModified(false);
if (store != null && store.getMvStore() != null && !store.getMvStore().isClosed()) { if (store != null) {
long maxCompactTime = dbSettings.maxCompactTime; MVStore mvStore = store.getMvStore();
if (compactMode == CommandInterface.SHUTDOWN_COMPACT) { if (mvStore != null && !mvStore.isClosed()) {
store.compactFile(dbSettings.maxCompactTime); boolean compactFully =
} else if (compactMode == CommandInterface.SHUTDOWN_DEFRAG) { compactMode == CommandInterface.SHUTDOWN_COMPACT ||
maxCompactTime = Long.MAX_VALUE; compactMode == CommandInterface.SHUTDOWN_DEFRAG ||
} else if (getSettings().defragAlways) { getSettings().defragAlways;
maxCompactTime = Long.MAX_VALUE; if (!compactFully && !mvStore.isReadOnly()) {
try {
store.compactFile(dbSettings.maxCompactTime);
} catch (Throwable t) {
trace.error(t, "compactFile");
}
}
store.close(compactFully);
} }
store.close(maxCompactTime);
} }
if (systemSession != null) { if (systemSession != null) {
systemSession.close(); systemSession.close();
......
...@@ -360,19 +360,18 @@ public class MVTableEngine implements TableEngine { ...@@ -360,19 +360,18 @@ public class MVTableEngine implements TableEngine {
* fill rate are compacted, but old chunks are kept for some time, so * fill rate are compacted, but old chunks are kept for some time, so
* most likely the database file will not shrink. * most likely the database file will not shrink.
* *
* @param maxCompactTime the maximum time in milliseconds to compact * @param compactFully true if storage need to be compacted after closer
*/ */
public void close(long maxCompactTime) { public void close(boolean compactFully) {
try { try {
if (!mvStore.isClosed() && mvStore.getFileStore() != null) { FileStore fileStore = mvStore.getFileStore();
boolean compactFully = false; if (!mvStore.isClosed() && fileStore != null) {
if (!mvStore.getFileStore().isReadOnly()) { if (fileStore.isReadOnly()) {
compactFully = false;
} else {
transactionStore.close(); transactionStore.close();
if (maxCompactTime == Long.MAX_VALUE) {
compactFully = true;
}
} }
String fileName = mvStore.getFileStore().getFileName(); String fileName = fileStore.getFileName();
mvStore.close(); mvStore.close();
if (compactFully && FileUtils.exists(fileName)) { if (compactFully && FileUtils.exists(fileName)) {
// the file could have been deleted concurrently, // the file could have been deleted concurrently,
......
...@@ -740,8 +740,7 @@ public class TestMVTableEngine extends TestDb { ...@@ -740,8 +740,7 @@ public class TestMVTableEngine extends TestDb {
conn.close(); conn.close();
long sizeNew = FileUtils.size(getBaseDir() + "/" + getTestName() long sizeNew = FileUtils.size(getBaseDir() + "/" + getTestName()
+ Constants.SUFFIX_MV_FILE); + Constants.SUFFIX_MV_FILE);
println("new: " + sizeNew + " old: " + sizeOld); assertTrue("new: " + sizeNew + " old: " + sizeOld, sizeNew < sizeOld);
// assertTrue("new: " + sizeNew + " old: " + sizeOld, sizeNew < sizeOld);
} }
private void testTwoPhaseCommit() throws Exception { private void testTwoPhaseCommit() throws Exception {
...@@ -1436,7 +1435,7 @@ public class TestMVTableEngine extends TestDb { ...@@ -1436,7 +1435,7 @@ public class TestMVTableEngine extends TestDb {
reverse += testReverseDeletePerformance(true); reverse += testReverseDeletePerformance(true);
direct += testReverseDeletePerformance(false); direct += testReverseDeletePerformance(false);
} }
assertTrue("direct: " + direct + ", reverse: " + reverse, 2 * Math.abs(reverse - direct) < reverse + direct); assertTrue("direct: " + direct + ", reverse: " + reverse, 3 * Math.abs(reverse - direct) < 2 * (reverse + direct));
} }
private long testReverseDeletePerformance(boolean reverse) throws Exception { private long testReverseDeletePerformance(boolean reverse) throws Exception {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论