/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.synth; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.Random; import org.h2.test.TestBase; import org.h2.test.utils.SelfDestructor; /** * Standalone recovery test. A new process is started and then killed while it * executes random statements. */ public class TestKillRestart extends TestBase { public void test() throws Exception { if (config.networked) { return; } if (getBaseDir().indexOf(':') > 0) { return; } deleteDb("killRestart"); String url = getURL("killRestart", true); // String url = getURL( // "killRestart;CACHE_SIZE=2048;WRITE_DELAY=0", true); String user = getUser(), password = getPassword(); String selfDestruct = SelfDestructor.getPropertyString(60); String[] procDef = { "java", selfDestruct, "-cp", getClassPath(), getClass().getName(), "-url", url, "-user", user, "-password", password }; int len = getSize(2, 15); for (int i = 0; i < len; i++) { Process p = Runtime.getRuntime().exec(procDef); InputStream in = p.getInputStream(); OutputCatcher catcher = new OutputCatcher(in); catcher.start(); while (true) { String s = catcher.readLine(60 * 1000); // System.out.println("> " + s); if (s == null) { fail("No reply from process"); } else if (!s.startsWith("#")) { // System.out.println(s); fail("Expected: #..., got: " + s); } else if (s.startsWith("#Running")) { Thread.sleep(100); printTime("killing: " + i); p.destroy(); p.waitFor(); break; } else if (s.startsWith("#Fail")) { fail("Failed: " + s); } } } deleteDb("killRestart"); } /** * This method is called when executing this application from the command * line. * * @param args the command line parameters */ public static void main(String... args) { SelfDestructor.startCountdown(60); String driver = "org.h2.Driver"; String url = "jdbc:h2:test", user = "sa", password = "sa"; for (int i = 0; i < args.length; i++) { if ("-url".equals(args[i])) { url = args[++i]; } else if ("-driver".equals(args[i])) { driver = args[++i]; } else if ("-user".equals(args[i])) { user = args[++i]; } else if ("-password".equals(args[i])) { password = args[++i]; } } System.out.println("#Started; driver: " + driver + " url: " + url + " user: " + user + " password: " + password); try { Class.forName(driver); System.out.println("#Opening..."); Connection conn = DriverManager.getConnection(url, user, password); Statement stat = conn.createStatement(); stat.execute("CREATE TABLE IF NOT EXISTS TEST(ID IDENTITY, NAME VARCHAR)"); stat.execute("CREATE TABLE IF NOT EXISTS TEST2(ID IDENTITY, NAME VARCHAR)"); ResultSet rs = stat.executeQuery("SELECT * FROM TEST"); while (rs.next()) { rs.getLong("ID"); rs.getString("NAME"); } rs = stat.executeQuery("SELECT * FROM TEST2"); while (rs.next()) { rs.getLong("ID"); rs.getString("NAME"); } stat.execute("DROP ALL OBJECTS DELETE FILES"); System.out.println("#Closing with delete..."); conn.close(); System.out.println("#Starting..."); conn = DriverManager.getConnection(url, user, password); stat = conn.createStatement(); stat.execute("DROP ALL OBJECTS"); stat.execute("CREATE TABLE TEST(ID IDENTITY, NAME VARCHAR)"); stat.execute("CREATE TABLE TEST2(ID IDENTITY, NAME VARCHAR)"); stat.execute("CREATE TABLE TEST_META(ID INT)"); PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST(NAME) VALUES(?)"); PreparedStatement prep2 = conn.prepareStatement("INSERT INTO TEST2(NAME) VALUES(?)"); Random r = new Random(0); // Runnable stopper = new Runnable() { // public void run() { // try { // Thread.sleep(500); // } catch (InterruptedException e) { // } // System.out.println("#Halt..."); // Runtime.getRuntime().halt(0); // } // }; // new Thread(stopper).start(); for (int i = 0; i < 2000; i++) { if (i == 100) { System.out.println("#Running..."); } if (r.nextInt(100) < 10) { conn.createStatement().execute("ALTER TABLE TEST_META ALTER COLUMN ID INT DEFAULT 10"); } if (r.nextBoolean()) { if (r.nextBoolean()) { prep.setString(1, new String(new char[r.nextInt(30) * 10])); prep.execute(); } else { prep2.setString(1, new String(new char[r.nextInt(30) * 10])); prep2.execute(); } } else { if (r.nextBoolean()) { conn.createStatement().execute("UPDATE TEST SET NAME = NULL"); } else { conn.createStatement().execute("UPDATE TEST2 SET NAME = NULL"); } } } } catch (Throwable e) { e.printStackTrace(System.out); System.out.println("#Fail: " + e.toString()); } } }