Search in sources :

Example 46 with Task

use of org.h2.util.Task in project h2database by h2database.

the class TestMultiConn method testConcurrentShutdownQuery.

private void testConcurrentShutdownQuery() throws Exception {
    Connection conn1 = getConnection("multiConn");
    Connection conn2 = getConnection("multiConn");
    final Statement stat1 = conn1.createStatement();
    stat1.execute("CREATE ALIAS SLEEP FOR \"java.lang.Thread.sleep(long)\"");
    final Statement stat2 = conn2.createStatement();
    stat1.execute("SET THROTTLE 100");
    Task t = new Task() {

        @Override
        public void call() throws Exception {
            stat2.executeQuery("CALL SLEEP(100)");
            Thread.sleep(10);
            stat2.executeQuery("CALL SLEEP(100)");
        }
    };
    t.execute();
    Thread.sleep(50);
    stat1.execute("SHUTDOWN");
    conn1.close();
    try {
        conn2.close();
    } catch (SQLException e) {
    // ignore
    }
    try {
        t.get();
    } catch (Exception e) {
    // ignore
    }
}
Also used : Task(org.h2.util.Task) SQLException(java.sql.SQLException) Statement(java.sql.Statement) Connection(java.sql.Connection) SQLException(java.sql.SQLException)

Example 47 with Task

use of org.h2.util.Task in project h2database by h2database.

the class TestBackup method testConcurrentBackup.

private void testConcurrentBackup() throws SQLException {
    if (config.networked || !config.big) {
        return;
    }
    deleteDb("backup");
    String url = getURL("backup;multi_threaded=true", true);
    Connection conn = getConnection(url);
    final Statement stat = conn.createStatement();
    stat.execute("create table test(id int primary key, name varchar)");
    stat.execute("insert into test select x, 'Hello' from system_range(1, 2)");
    conn.setAutoCommit(false);
    Connection conn1;
    conn1 = getConnection(url);
    final AtomicLong updateEnd = new AtomicLong();
    final Statement stat1 = conn.createStatement();
    Task task = new Task() {

        @Override
        public void call() throws Exception {
            while (!stop) {
                if (System.nanoTime() < updateEnd.get()) {
                    stat.execute("update test set name = 'Hallo'");
                    stat1.execute("checkpoint");
                    stat.execute("update test set name = 'Hello'");
                    stat.execute("commit");
                    stat.execute("checkpoint");
                } else {
                    Thread.sleep(10);
                }
            }
        }
    };
    Connection conn2;
    conn2 = getConnection(url + ";database_event_listener='" + BackupListener.class.getName() + "'");
    Statement stat2 = conn2.createStatement();
    task.execute();
    for (int i = 0; i < 10; i++) {
        updateEnd.set(System.nanoTime() + TimeUnit.SECONDS.toNanos(2));
        stat2.execute("backup to '" + getBaseDir() + "/backup.zip'");
        stat2.execute("checkpoint");
        Restore.execute(getBaseDir() + "/backup.zip", getBaseDir() + "/t" + i, "backup");
        Connection conn3 = getConnection("t" + i + "/backup");
        Statement stat3 = conn3.createStatement();
        stat3.execute("script");
        ResultSet rs = stat3.executeQuery("select * from test where name='Hallo'");
        while (rs.next()) {
            fail();
        }
        conn3.close();
    }
    task.get();
    conn2.close();
    conn.close();
    conn1.close();
}
Also used : AtomicLong(java.util.concurrent.atomic.AtomicLong) Task(org.h2.util.Task) Statement(java.sql.Statement) Connection(java.sql.Connection) ResultSet(java.sql.ResultSet)

Example 48 with Task

use of org.h2.util.Task in project h2database by h2database.

the class TestNetUtils method testAnonymousTlsSession.

/**
 * With default settings, H2 client SSL socket should be able to connect
 * to an H2 server SSL socket using an anonymous cipher suite
 * (no SSL certificate is needed).
 */
private void testAnonymousTlsSession() throws Exception {
    assertTrue("Failed assumption: the default value of ENABLE_ANONYMOUS_TLS" + " property should be true", SysProperties.ENABLE_ANONYMOUS_TLS);
    boolean ssl = true;
    Task task = null;
    ServerSocket serverSocket = null;
    Socket socket = null;
    try {
        serverSocket = NetUtils.createServerSocket(PORT, ssl);
        serverSocket.setSoTimeout(WAIT_LONGER_MILLIS);
        task = createServerSocketTask(serverSocket);
        task.execute(TASK_PREFIX + "AnonEnabled");
        Thread.sleep(WAIT_MILLIS);
        socket = NetUtils.createLoopbackSocket(PORT, ssl);
        assertTrue("loopback anon socket should be connected", socket.isConnected());
        SSLSession session = ((SSLSocket) socket).getSession();
        assertTrue("TLS session should be valid when anonymous TLS is enabled", session.isValid());
        // in case of handshake failure:
        // the cipher suite is the pre-handshake SSL_NULL_WITH_NULL_NULL
        assertContains(session.getCipherSuite(), "_anon_");
    } finally {
        closeSilently(socket);
        closeSilently(serverSocket);
        if (task != null) {
            // SSL server socket should succeed using an anonymous cipher
            // suite, and not throw javax.net.ssl.SSLHandshakeException
            assertNull(task.getException());
            task.join();
        }
    }
}
Also used : Task(org.h2.util.Task) SSLSocket(javax.net.ssl.SSLSocket) SSLSession(javax.net.ssl.SSLSession) ServerSocket(java.net.ServerSocket) SSLServerSocket(javax.net.ssl.SSLServerSocket) Socket(java.net.Socket) SSLSocket(javax.net.ssl.SSLSocket) ServerSocket(java.net.ServerSocket) SSLServerSocket(javax.net.ssl.SSLServerSocket)

Example 49 with Task

use of org.h2.util.Task in project h2database by h2database.

the class TestNetUtils method testTlsSessionWithServerSideAnonymousDisabled.

/**
 * TLS connections (without trusted certificates) should fail if the server
 * does not allow anonymous TLS.
 * The global property ENABLE_ANONYMOUS_TLS cannot be modified for the test;
 * instead, the server socket is altered.
 */
private void testTlsSessionWithServerSideAnonymousDisabled() throws Exception {
    boolean ssl = true;
    Task task = null;
    ServerSocket serverSocket = null;
    Socket socket = null;
    try {
        serverSocket = NetUtils.createServerSocket(PORT, ssl);
        serverSocket.setSoTimeout(WAIT_LONGER_MILLIS);
        // emulate the situation ENABLE_ANONYMOUS_TLS=false on server side
        String[] defaultCipherSuites = SSLContext.getDefault().getServerSocketFactory().getDefaultCipherSuites();
        ((SSLServerSocket) serverSocket).setEnabledCipherSuites(defaultCipherSuites);
        task = createServerSocketTask(serverSocket);
        task.execute(TASK_PREFIX + "AnonDisabled");
        Thread.sleep(WAIT_MILLIS);
        socket = NetUtils.createLoopbackSocket(PORT, ssl);
        assertTrue("loopback socket should be connected", socket.isConnected());
        // Java 6 API does not have getHandshakeSession() which could
        // reveal the actual cipher selected in the attempted handshake
        SSLSession session = ((SSLSocket) socket).getSession();
        assertFalse("TLS session should be invalid when the server" + "disables anonymous TLS", session.isValid());
        // the SSL handshake should fail, because non-anon ciphers require
        // a trusted certificate
        assertEquals("SSL_NULL_WITH_NULL_NULL", session.getCipherSuite());
    } finally {
        closeSilently(socket);
        closeSilently(serverSocket);
        if (task != null) {
            assertNotNull(task.getException());
            assertEquals(javax.net.ssl.SSLHandshakeException.class.getName(), task.getException().getClass().getName());
            assertContains(task.getException().getMessage(), "certificate_unknown");
            task.join();
        }
    }
}
Also used : Task(org.h2.util.Task) SSLSocket(javax.net.ssl.SSLSocket) SSLSession(javax.net.ssl.SSLSession) ServerSocket(java.net.ServerSocket) SSLServerSocket(javax.net.ssl.SSLServerSocket) SSLServerSocket(javax.net.ssl.SSLServerSocket) Socket(java.net.Socket) SSLSocket(javax.net.ssl.SSLSocket) ServerSocket(java.net.ServerSocket) SSLServerSocket(javax.net.ssl.SSLServerSocket)

Example 50 with Task

use of org.h2.util.Task in project h2database by h2database.

the class TestFileLockSerialized method testBigDatabase.

private void testBigDatabase(boolean withCache) {
    boolean longRun = false;
    final int howMuchRows = longRun ? 2000000 : 500000;
    deleteDb("fileLockSerialized");
    int cacheSizeKb = withCache ? 5000 : 0;
    final CountDownLatch importFinishedLatch = new CountDownLatch(1);
    final CountDownLatch select1FinishedLatch = new CountDownLatch(1);
    final String url = "jdbc:h2:" + getBaseDir() + "/fileLockSerialized" + ";FILE_LOCK=SERIALIZED" + ";OPEN_NEW=TRUE" + ";CACHE_SIZE=" + cacheSizeKb;
    final Task importUpdateTask = new Task() {

        @Override
        public void call() throws Exception {
            Connection conn = getConnection(url);
            Statement stat = conn.createStatement();
            stat.execute("create table test(id int, id2 int)");
            for (int i = 0; i < howMuchRows; i++) {
                stat.execute("insert into test values(" + i + ", " + i + ")");
            }
            importFinishedLatch.countDown();
            select1FinishedLatch.await();
            stat.execute("update test set id2=999 where id=500");
            conn.close();
        }
    };
    importUpdateTask.execute();
    Task selectTask = new Task() {

        @Override
        public void call() throws Exception {
            Connection conn = getConnection(url);
            Statement stat = conn.createStatement();
            importFinishedLatch.await();
            ResultSet rs = stat.executeQuery("select id2 from test where id=500");
            assertTrue(rs.next());
            assertEquals(500, rs.getInt(1));
            rs.close();
            select1FinishedLatch.countDown();
            // wait until the other task finished
            importUpdateTask.get();
            // can't use the exact same query, otherwise it would use
            // the query cache
            rs = stat.executeQuery("select id2 from test where id=500+0");
            assertTrue(rs.next());
            assertEquals(999, rs.getInt(1));
            rs.close();
            conn.close();
        }
    };
    selectTask.execute();
    importUpdateTask.get();
    selectTask.get();
    deleteDb("fileLockSerialized");
}
Also used : Task(org.h2.util.Task) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) Connection(java.sql.Connection) JdbcConnection(org.h2.jdbc.JdbcConnection) ResultSet(java.sql.ResultSet) CountDownLatch(java.util.concurrent.CountDownLatch)

Aggregations

Task (org.h2.util.Task)71 Connection (java.sql.Connection)33 Statement (java.sql.Statement)27 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)24 PreparedStatement (java.sql.PreparedStatement)22 SQLException (java.sql.SQLException)22 MVStore (org.h2.mvstore.MVStore)20 Random (java.util.Random)18 ResultSet (java.sql.ResultSet)14 JdbcConnection (org.h2.jdbc.JdbcConnection)7 IOException (java.io.IOException)5 ServerSocket (java.net.ServerSocket)5 Socket (java.net.Socket)5 ConcurrentModificationException (java.util.ConcurrentModificationException)4 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)4 SSLServerSocket (javax.net.ssl.SSLServerSocket)4 SSLSocket (javax.net.ssl.SSLSocket)4 OutputStream (java.io.OutputStream)3 PipedInputStream (java.io.PipedInputStream)3 PipedOutputStream (java.io.PipedOutputStream)3