You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Alexander Belyak (Jira)" <ji...@apache.org> on 2023/04/06 11:30:00 UTC
[jira] [Updated] (IGNITE-19247) Replication is timed out
[ https://issues.apache.org/jira/browse/IGNITE-19247?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexander Belyak updated IGNITE-19247:
--------------------------------------
Description:
Simple example:
{code:java}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class TimeoutExceptionReproducer {
private static final String DB_URL = "jdbc:ignite:thin://172.24.1.2:10800";
private static final int COLUMNS = 100;
private static final String TABLE_NAME = "t1";
private static final int ROWS = 1000;
private static final int TABLES = 1000;
private static final int BATCH_SIZE = 100;
private static String getCreateSql(String tableName) {
StringBuilder sql = new StringBuilder("create table ").append(tableName).append(" (id int primary key");
for (int i = 0; i < COLUMNS; i++) {
sql.append(", col").append(i).append(" varchar NOT NULL");
}
sql.append(")");
return sql.toString();
}
private static void createTables(Connection connection, String tableName) throws SQLException {
try (Statement stmt = connection.createStatement()) {
System.out.println("Creating " + tableName);
stmt.executeUpdate("drop table if exists " + tableName );
stmt.executeUpdate(getCreateSql(tableName));
}
}
private static String getInsertSql(String tableName) {
StringBuilder sql = new StringBuilder("insert into ").append(tableName).append(" values(?");
for (int i = 0; i < COLUMNS; i++) {
sql.append(", ?");
}
sql.append(")");
return sql.toString();
}
private static void insertData(Connection connection, String tableName) throws SQLException {
long ts = System.currentTimeMillis();
try (PreparedStatement ps = connection.prepareStatement(getInsertSql(tableName))) {
int batch = 0;
for (int i = 0; i < ROWS; i++) {
ps.setInt(1, i);
for (int j = 2; j < COLUMNS + 2; j++) {
ps.setString(j, "value" + i + "_" + j);
}
ps.addBatch();
batch++;
if (batch == BATCH_SIZE) {
batch = 0;
ps.executeBatch();
ps.clearBatch();
long nextTs = System.currentTimeMillis();
System.out.println("Batch " + BATCH_SIZE + " took " + (nextTs - ts) + " to get " + i + " rows");
ts = nextTs;
}
}
if (batch > 0) {
batch = 0;
ps.executeBatch();
ps.clearBatch();
}
}
}
public static void main(String[] args) throws SQLException {
try (Connection connection = DriverManager.getConnection(DB_URL)) {
for (int i = 0; i < TABLES; i++) {
String tableName = TABLE_NAME + i;
createTables(connection, tableName);
insertData(connection, tableName);
}
}
}
}
{code}
lead to timeout exception:
{code:java}
Batch 100 took 4228 to get 2899 rows
Batch 100 took 5669 to get 2999 rows
Batch 100 took 3902 to get 3099 rows
Exception in thread "main" java.sql.BatchUpdateException: IGN-REP-3 TraceId:b2c2c9e5-b917-482e-91df-2e0576c443c7 Replication is timed out [replicaGrpId=76c2b69a-a2bc-4d16-838d-5aff014c6004_part_11]
at org.apache.ignite.internal.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:124)
at TimeoutExceptionReproducer.insertData(TimeoutExceptionReproducer.java:64)
at TimeoutExceptionReproducer.main(TimeoutExceptionReproducer.java:84){code}
> Replication is timed out
> ------------------------
>
> Key: IGNITE-19247
> URL: https://issues.apache.org/jira/browse/IGNITE-19247
> Project: Ignite
> Issue Type: Bug
> Components: general
> Affects Versions: 3.0
> Reporter: Alexander Belyak
> Priority: Critical
> Labels: ignite-3
> Fix For: 3.0
>
>
> Simple example:
> {code:java}
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
> import java.sql.Statement;
> public class TimeoutExceptionReproducer {
> private static final String DB_URL = "jdbc:ignite:thin://172.24.1.2:10800";
> private static final int COLUMNS = 100;
> private static final String TABLE_NAME = "t1";
> private static final int ROWS = 1000;
> private static final int TABLES = 1000;
> private static final int BATCH_SIZE = 100;
> private static String getCreateSql(String tableName) {
> StringBuilder sql = new StringBuilder("create table ").append(tableName).append(" (id int primary key");
> for (int i = 0; i < COLUMNS; i++) {
> sql.append(", col").append(i).append(" varchar NOT NULL");
> }
> sql.append(")");
> return sql.toString();
> }
> private static void createTables(Connection connection, String tableName) throws SQLException {
> try (Statement stmt = connection.createStatement()) {
> System.out.println("Creating " + tableName);
> stmt.executeUpdate("drop table if exists " + tableName );
> stmt.executeUpdate(getCreateSql(tableName));
> }
> }
> private static String getInsertSql(String tableName) {
> StringBuilder sql = new StringBuilder("insert into ").append(tableName).append(" values(?");
> for (int i = 0; i < COLUMNS; i++) {
> sql.append(", ?");
> }
> sql.append(")");
> return sql.toString();
> }
> private static void insertData(Connection connection, String tableName) throws SQLException {
> long ts = System.currentTimeMillis();
> try (PreparedStatement ps = connection.prepareStatement(getInsertSql(tableName))) {
> int batch = 0;
> for (int i = 0; i < ROWS; i++) {
> ps.setInt(1, i);
> for (int j = 2; j < COLUMNS + 2; j++) {
> ps.setString(j, "value" + i + "_" + j);
> }
> ps.addBatch();
> batch++;
> if (batch == BATCH_SIZE) {
> batch = 0;
> ps.executeBatch();
> ps.clearBatch();
> long nextTs = System.currentTimeMillis();
> System.out.println("Batch " + BATCH_SIZE + " took " + (nextTs - ts) + " to get " + i + " rows");
> ts = nextTs;
> }
> }
> if (batch > 0) {
> batch = 0;
> ps.executeBatch();
> ps.clearBatch();
> }
> }
> }
> public static void main(String[] args) throws SQLException {
> try (Connection connection = DriverManager.getConnection(DB_URL)) {
> for (int i = 0; i < TABLES; i++) {
> String tableName = TABLE_NAME + i;
> createTables(connection, tableName);
> insertData(connection, tableName);
> }
> }
> }
> }
> {code}
> lead to timeout exception:
> {code:java}
> Batch 100 took 4228 to get 2899 rows
> Batch 100 took 5669 to get 2999 rows
> Batch 100 took 3902 to get 3099 rows
> Exception in thread "main" java.sql.BatchUpdateException: IGN-REP-3 TraceId:b2c2c9e5-b917-482e-91df-2e0576c443c7 Replication is timed out [replicaGrpId=76c2b69a-a2bc-4d16-838d-5aff014c6004_part_11]
> at org.apache.ignite.internal.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:124)
> at TimeoutExceptionReproducer.insertData(TimeoutExceptionReproducer.java:64)
> at TimeoutExceptionReproducer.main(TimeoutExceptionReproducer.java:84){code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)