SQL: Add test for concurrent JDBC queries. (#4290)

This commit is contained in:
Gian Merlino 2017-05-19 04:25:15 +09:00 committed by Fangjin Yang
parent 5c0a7ad2f8
commit 8ca7f9410e
1 changed files with 49 additions and 3 deletions

View File

@ -19,11 +19,17 @@
package io.druid.sql.avatica;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import io.druid.java.util.common.Pair;
import io.druid.server.DruidNode;
import io.druid.sql.calcite.planner.Calcites;
@ -57,11 +63,13 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Executors;
public class DruidAvaticaHandlerTest
{
@ -76,7 +84,7 @@ public class DruidAvaticaHandlerTest
@Override
public int getMaxStatementsPerConnection()
{
return 2;
return 4;
}
};
@ -353,15 +361,48 @@ public class DruidAvaticaHandlerTest
);
}
@Test(timeout = 30000)
public void testConcurrentQueries() throws Exception
{
final List<ListenableFuture<Integer>> futures = new ArrayList<>();
final ListeningExecutorService exec = MoreExecutors.listeningDecorator(
Executors.newFixedThreadPool(AVATICA_CONFIG.getMaxStatementsPerConnection())
);
for (int i = 0; i < 2000; i++) {
final String query = String.format("SELECT COUNT(*) + %s AS ci FROM foo", i);
futures.add(
exec.submit(() -> {
try (
final Statement statement = client.createStatement();
final ResultSet resultSet = statement.executeQuery(query)
) {
final List<Map<String, Object>> rows = getRows(resultSet);
return ((Number) Iterables.getOnlyElement(rows).get("ci")).intValue();
}
catch (SQLException e) {
throw Throwables.propagate(e);
}
})
);
}
final List<Integer> integers = Futures.allAsList(futures).get();
for (int i = 0; i < 2000; i++) {
Assert.assertEquals(i + 6, (int) integers.get(i));
}
}
@Test
public void testTooManyStatements() throws Exception
{
final Statement statement1 = client.createStatement();
final Statement statement2 = client.createStatement();
final Statement statement3 = client.createStatement();
final Statement statement4 = client.createStatement();
expectedException.expect(AvaticaClientRuntimeException.class);
expectedException.expectMessage("Too many open statements, limit is[2]");
final Statement statement3 = client.createStatement();
expectedException.expectMessage("Too many open statements, limit is[4]");
final Statement statement5 = client.createStatement();
}
@Test
@ -372,6 +413,11 @@ public class DruidAvaticaHandlerTest
client.createStatement().close();
client.createStatement().close();
client.createStatement().close();
client.createStatement().close();
client.createStatement().close();
client.createStatement().close();
client.createStatement().close();
client.createStatement().close();
Assert.assertTrue(true);
}