提交 3065d6bd authored 作者: Thomas Mueller's avatar Thomas Mueller

To test recovery, append ;RECOVER_TEST=64 to the database URL.

上级 7b61f73c
...@@ -11,6 +11,7 @@ import java.util.Properties; ...@@ -11,6 +11,7 @@ import java.util.Properties;
import org.h2.Driver; import org.h2.Driver;
import org.h2.engine.Constants; import org.h2.engine.Constants;
import org.h2.store.fs.FileSystemDisk; import org.h2.store.fs.FileSystemDisk;
import org.h2.store.fs.RecordingFileSystem;
import org.h2.test.bench.TestPerformance; import org.h2.test.bench.TestPerformance;
import org.h2.test.db.TestAlter; import org.h2.test.db.TestAlter;
import org.h2.test.db.TestAlterSchemaRename; import org.h2.test.db.TestAlterSchemaRename;
...@@ -161,7 +162,6 @@ import org.h2.test.unit.TestValue; ...@@ -161,7 +162,6 @@ import org.h2.test.unit.TestValue;
import org.h2.test.unit.TestValueHashMap; import org.h2.test.unit.TestValueHashMap;
import org.h2.test.unit.TestValueMemory; import org.h2.test.unit.TestValueMemory;
import org.h2.test.utils.OutputCatcher; import org.h2.test.utils.OutputCatcher;
import org.h2.test.utils.RecordingFileSystem;
import org.h2.test.utils.SelfDestructor; import org.h2.test.utils.SelfDestructor;
import org.h2.tools.DeleteDbFiles; import org.h2.tools.DeleteDbFiles;
import org.h2.tools.Server; import org.h2.tools.Server;
...@@ -380,7 +380,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1` ...@@ -380,7 +380,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
System.setProperty("h2.lobInDatabase", "true"); System.setProperty("h2.lobInDatabase", "true");
System.setProperty("h2.analyzeAuto", "100"); System.setProperty("h2.analyzeAuto", "100");
System.setProperty("h2.pageSize", "64"); System.setProperty("h2.pageSize", "64");
// System.setProperty("reopenShift", "9"); System.setProperty("h2.reopenShift", "0");
RecordingFileSystem.register(); RecordingFileSystem.register();
test.record = true; test.record = true;
TestReopen reopen = new TestReopen(); TestReopen reopen = new TestReopen();
......
...@@ -33,8 +33,8 @@ import org.h2.message.DbException; ...@@ -33,8 +33,8 @@ import org.h2.message.DbException;
import org.h2.message.TraceSystem; import org.h2.message.TraceSystem;
import org.h2.store.FileLock; import org.h2.store.FileLock;
import org.h2.store.fs.FileSystemSplit; import org.h2.store.fs.FileSystemSplit;
import org.h2.store.fs.RecordingFileSystem;
import org.h2.test.utils.ProxyCodeGenerator; import org.h2.test.utils.ProxyCodeGenerator;
import org.h2.test.utils.RecordingFileSystem;
import org.h2.test.utils.ResultVerifier; import org.h2.test.utils.ResultVerifier;
import org.h2.tools.DeleteDbFiles; import org.h2.tools.DeleteDbFiles;
import org.h2.util.IOUtils; import org.h2.util.IOUtils;
......
...@@ -10,8 +10,8 @@ import java.sql.Connection; ...@@ -10,8 +10,8 @@ import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.Statement; import java.sql.Statement;
import java.util.Random; import java.util.Random;
import org.h2.store.fs.RecordingFileSystem;
import org.h2.test.unit.TestReopen; import org.h2.test.unit.TestReopen;
import org.h2.test.utils.RecordingFileSystem;
import org.h2.tools.DeleteDbFiles; import org.h2.tools.DeleteDbFiles;
/** /**
......
...@@ -36,6 +36,7 @@ public class TestRecovery extends TestBase { ...@@ -36,6 +36,7 @@ public class TestRecovery extends TestBase {
} }
public void test() throws Exception { public void test() throws Exception {
testRecoverTestMode();
testRecoverClob(); testRecoverClob();
testRecoverFulltext(); testRecoverFulltext();
testRedoTransactions(); testRedoTransactions();
...@@ -45,6 +46,21 @@ public class TestRecovery extends TestBase { ...@@ -45,6 +46,21 @@ public class TestRecovery extends TestBase {
testRunScript(); testRunScript();
} }
private void testRecoverTestMode() throws Exception {
if (config.memory) {
return;
}
String recoverTestLog = getBaseDir() + "/recovery.h2.db.log";
IOUtils.delete(recoverTestLog);
deleteDb("recovery");
Connection conn = getConnection("recovery;RECOVER_TEST=1");
Statement stat = conn.createStatement();
stat.execute("create table test(id int, name varchar)");
stat.execute("drop all objects delete files");
conn.close();
assertTrue(IOUtils.exists(recoverTestLog));
}
private void testRecoverClob() throws Exception { private void testRecoverClob() throws Exception {
DeleteDbFiles.execute(getBaseDir(), "recovery", true); DeleteDbFiles.execute(getBaseDir(), "recovery", true);
Connection conn = getConnection("recovery"); Connection conn = getConnection("recovery");
......
...@@ -15,13 +15,14 @@ import org.h2.engine.Constants; ...@@ -15,13 +15,14 @@ import org.h2.engine.Constants;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.store.fs.Recorder;
import org.h2.store.fs.RecordingFileSystem;
import org.h2.test.TestBase; import org.h2.test.TestBase;
import org.h2.test.utils.Recorder;
import org.h2.test.utils.RecordingFileSystem;
import org.h2.tools.Recover; import org.h2.tools.Recover;
import org.h2.util.IOUtils; import org.h2.util.IOUtils;
import org.h2.util.New; import org.h2.util.New;
import org.h2.util.Profiler; import org.h2.util.Profiler;
import org.h2.util.Utils;
/** /**
* A test that calls another test, and after each write operation to the * A test that calls another test, and after each write operation to the
...@@ -29,11 +30,12 @@ import org.h2.util.Profiler; ...@@ -29,11 +30,12 @@ import org.h2.util.Profiler;
*/ */
public class TestReopen extends TestBase implements Recorder { public class TestReopen extends TestBase implements Recorder {
private static final int MAX_FILE_SIZE = 8 * 1024 * 1024; // TODO this is largely a copy of org.h2.util.RecoverTester
private String testDatabase = "memFS:" + TestBase.BASE_TEST_DIR + "/reopen"; private String testDatabase = "memFS:" + TestBase.BASE_TEST_DIR + "/reopen";
private long lastCheck; private int writeCount = Utils.getProperty("h2.reopenOffset", 0);
private int writeCount = Integer.parseInt(System.getProperty("reopenOffset", "0")); private int testEvery = 1 << Utils.getProperty("h2.reopenShift", 6);
private int testEvery = 1 << Integer.parseInt(System.getProperty("reopenShift", "8")); private long maxFileSize = Utils.getProperty("h2.reopenMaxFileSize", Integer.MAX_VALUE) * 1024L * 1024;
private int verifyCount; private int verifyCount;
private HashSet<String> knownErrors = New.hashSet(); private HashSet<String> knownErrors = New.hashSet();
private volatile boolean testing; private volatile boolean testing;
...@@ -83,20 +85,15 @@ public class TestReopen extends TestBase implements Recorder { ...@@ -83,20 +85,15 @@ public class TestReopen extends TestBase implements Recorder {
private synchronized void logDb(String fileName) { private synchronized void logDb(String fileName) {
writeCount++; writeCount++;
if ((writeCount & 1023) == 0) {
long now = System.currentTimeMillis();
if (now > lastCheck + 5000) {
System.out.println("+ write #" + writeCount + " verify #" + verifyCount);
lastCheck = now;
}
}
if ((writeCount & (testEvery - 1)) != 0) { if ((writeCount & (testEvery - 1)) != 0) {
return; return;
} }
if (IOUtils.length(fileName) > MAX_FILE_SIZE) { if (IOUtils.length(fileName) > maxFileSize) {
// System.out.println(fileName + " " + IOUtils.length(fileName)); // System.out.println(fileName + " " + IOUtils.length(fileName));
return; return;
} }
System.out.println("+ write #" + writeCount + " verify #" + verifyCount);
try { try {
IOUtils.copy(fileName, testDatabase + Constants.SUFFIX_PAGE_FILE); IOUtils.copy(fileName, testDatabase + Constants.SUFFIX_PAGE_FILE);
verifyCount++; verifyCount++;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论