/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.store;
import java.util.Random;
import org.h2.mvstore.MVMap;
import org.h2.mvstore.MVStore;
import org.h2.store.fs.FileUtils;
import org.h2.test.TestBase;
import org.h2.test.utils.FilePathUnstable;
/**
* Tests the MVStore.
*/
public class TestKillProcessWhileWriting extends TestBase {
private String fileName;
private int seed;
private FilePathUnstable fs;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase test = TestBase.createCaller().init();
test.config.big = true;
test.test();
}
@Override
public void test() throws Exception {
fs = FilePathUnstable.register();
fs.setPartialWrites(false);
test("unstable:memFS:killProcess.h3");
if (config.big) {
try {
fs.setPartialWrites(true);
test("unstable:memFS:killProcess.h3");
} finally {
fs.setPartialWrites(false);
}
}
FileUtils.delete("unstable:memFS:killProcess.h3");
}
private void test(String fileName) throws Exception {
for (seed = 0; seed < 10; seed++) {
this.fileName = fileName;
FileUtils.delete(fileName);
test(Integer.MAX_VALUE, seed);
int max = Integer.MAX_VALUE - fs.getDiskFullCount() + 10;
assertTrue("" + (max - 10), max > 0);
for (int i = 0; i < max; i++) {
test(i, seed);
}
}
}
private void test(int x, int seed) throws Exception {
FileUtils.delete(fileName);
fs.setDiskFullCount(x, seed);
try {
write();
verify();
} catch (Exception e) {
if (x == Integer.MAX_VALUE) {
throw e;
}
fs.setDiskFullCount(0, seed);
verify();
}
}
private int write() {
MVStore s;
MVMap<Integer, byte[]> m;
s = new MVStore.Builder().
fileName(fileName).
pageSplitSize(50).
autoCommitDisabled().
open();
m = s.openMap("data");
Random r = new Random(seed);
int op = 0;
try {
for (; op < 100; op++) {
int k = r.nextInt(100);
byte[] v = new byte[r.nextInt(100) * 100];
int type = r.nextInt(10);
switch (type) {
case 0:
case 1:
case 2:
case 3:
m.put(k, v);
break;
case 4:
case 5:
m.remove(k);
break;
case 6:
s.commit();
break;
case 7:
s.compact(80, 1024);
break;
case 8:
m.clear();
break;
case 9:
s.close();
s = new MVStore.Builder().
fileName(fileName).
pageSplitSize(50).
autoCommitDisabled().
open();
m = s.openMap("data");
break;
}
}
s.close();
return 0;
} catch (Exception e) {
s.closeImmediately();
return op;
}
}
private void verify() {
MVStore s;
MVMap<Integer, byte[]> m;
FileUtils.delete(fileName);
s = new MVStore.Builder().
fileName(fileName).open();
m = s.openMap("data");
for (int i = 0; i < 100; i++) {
byte[] x = m.get(i);
if (x == null) {
break;
}
assertEquals(i * 100, x.length);
}
s.close();
}
}