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
}
}
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();
}
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();
}
}
}
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();
}
}
}
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");
}
Aggregations