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