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
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.
","
......
......@@ -1519,16 +1519,22 @@ public class Database implements DataHandler {
}
}
reconnectModified(false);
if (store != null && store.getMvStore() != null && !store.getMvStore().isClosed()) {
long maxCompactTime = dbSettings.maxCompactTime;
if (compactMode == CommandInterface.SHUTDOWN_COMPACT) {
store.compactFile(dbSettings.maxCompactTime);
} else if (compactMode == CommandInterface.SHUTDOWN_DEFRAG) {
maxCompactTime = Long.MAX_VALUE;
} else if (getSettings().defragAlways) {
maxCompactTime = Long.MAX_VALUE;
if (store != null) {
MVStore mvStore = store.getMvStore();
if (mvStore != null && !mvStore.isClosed()) {
boolean compactFully =
compactMode == CommandInterface.SHUTDOWN_COMPACT ||
compactMode == CommandInterface.SHUTDOWN_DEFRAG ||
getSettings().defragAlways;
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) {
systemSession.close();
......
......@@ -360,19 +360,18 @@ public class MVTableEngine implements TableEngine {
* fill rate are compacted, but old chunks are kept for some time, so
* 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 {
if (!mvStore.isClosed() && mvStore.getFileStore() != null) {
boolean compactFully = false;
if (!mvStore.getFileStore().isReadOnly()) {
FileStore fileStore = mvStore.getFileStore();
if (!mvStore.isClosed() && fileStore != null) {
if (fileStore.isReadOnly()) {
compactFully = false;
} else {
transactionStore.close();
if (maxCompactTime == Long.MAX_VALUE) {
compactFully = true;
}
}
String fileName = mvStore.getFileStore().getFileName();
String fileName = fileStore.getFileName();
mvStore.close();
if (compactFully && FileUtils.exists(fileName)) {
// the file could have been deleted concurrently,
......
......@@ -740,8 +740,7 @@ public class TestMVTableEngine extends TestDb {
conn.close();
long sizeNew = FileUtils.size(getBaseDir() + "/" + getTestName()
+ 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 {
......@@ -1436,7 +1435,7 @@ public class TestMVTableEngine extends TestDb {
reverse += testReverseDeletePerformance(true);
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 {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论