/* * 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.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import org.h2.constant.ErrorCode; import org.h2.test.TestBase; import org.h2.test.utils.FilePathUnstable; /** * Test simulated disk full problems. */ public class TestDiskFull extends TestBase { private FilePathUnstable fs; /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase.createCaller().init().test(); } public void test() throws Exception { fs = FilePathUnstable.register(); test(Integer.MAX_VALUE); int max = Integer.MAX_VALUE - fs.getDiskFullCount() + 10; for (int i = 0; i < max; i++) { test(i); } } private boolean test(int x) throws SQLException { deleteDb("memFS:", null); fs.setDiskFullCount(x); String url = "jdbc:h2:unstable:memFS:diskFull" + x + ";FILE_LOCK=NO;TRACE_LEVEL_FILE=0;WRITE_DELAY=10;" + "LOCK_TIMEOUT=100;CACHE_SIZE=4096"; Connection conn = null; Statement stat = null; boolean opened = false; try { conn = DriverManager.getConnection(url); stat = conn.createStatement(); opened = true; for (int j = 0; j < 5; j++) { stat.execute("create table test(id int primary key, name varchar)"); stat.execute("insert into test values(1, 'Hello')"); stat.execute("create index idx_name on test(name)"); stat.execute("insert into test values(2, 'World')"); stat.execute("update test set name='Hallo' where id=1"); stat.execute("delete from test where id=2"); stat.execute("checkpoint"); stat.execute("insert into test values(3, space(10000))"); stat.execute("update test set name='Hallo' where id=3"); stat.execute("drop table test"); } conn.close(); conn = null; return fs.getDiskFullCount() > 0; } catch (SQLException e) { if (e.getErrorCode() == ErrorCode.TABLE_OR_VIEW_ALREADY_EXISTS_1) { throw e; } if (stat != null) { try { fs.setDiskFullCount(0); stat.execute("create table if not exists test(id int primary key, name varchar)"); stat.execute("insert into test values(4, space(10000))"); stat.execute("update test set name='Hallo' where id=3"); conn.close(); } catch (SQLException e2) { if (e2.getErrorCode() != ErrorCode.IO_EXCEPTION_1 && e2.getErrorCode() != ErrorCode.IO_EXCEPTION_2) { throw e2; } } } } finally { if (conn != null) { try { if (stat != null) { stat.execute("shutdown immediately"); } } catch (Exception e2) { // ignore } try { conn.close(); } catch (Exception e2) { // ignore } } } fs.setDiskFullCount(0); try { conn = null; conn = DriverManager.getConnection(url); } catch (SQLException e) { if (!opened) { return false; } throw e; } stat = conn.createStatement(); stat.execute("script to 'memFS:test.sql'"); conn.close(); return false; } }