[ 
https://issues.apache.org/jira/browse/IGNITE-19247?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alexander Belyak updated IGNITE-19247:
--------------------------------------
    Description: 
{color:#0033b3}import {color}{color:#000000}java.sql.Connection{color};
{color:#0033b3}import {color}{color:#000000}java.sql.DriverManager{color};
{color:#0033b3}import {color}{color:#000000}java.sql.PreparedStatement{color};
{color:#0033b3}import {color}{color:#000000}java.sql.ResultSet{color};
{color:#0033b3}import {color}{color:#000000}java.sql.SQLException{color};
{color:#0033b3}import {color}{color:#000000}java.sql.Statement{color};

{color:#0033b3}public class {color}{color:#000000}TimeoutExceptionReproducer 
{color}{
{color:#0033b3}private static final {color}{color:#000000}String 
{color}{color:#871094}DB_URL {color}= 
{color:#067d17}"jdbc:ignite:thin://172.24.1.2:10800"{color};
{color:#0033b3}private static final int {color}{color:#871094}COLUMNS {color}= 
{color:#1750eb}10{color};

{color:#0033b3}private static final {color}{color:#000000}String 
{color}{color:#871094}TABLE_NAME {color}= {color:#067d17}"K"{color};
{color:#0033b3}private static final int {color}{color:#871094}ROWS {color}= 
{color:#1750eb}1000{color};

{color:#0033b3}private static final int {color}{color:#871094}TABLES {color}= 
{color:#1750eb}10{color};

{color:#0033b3}private static final int {color}{color:#871094}BATCH_SIZE 
{color}= {color:#1750eb}10{color};

{color:#0033b3}private static final int {color}{color:#871094}SLEEP {color}= 
{color:#1750eb}30{color};

{color:#0033b3}private static final int {color}{color:#871094}RETRY {color}= 
{color:#1750eb}10{color};

{color:#0033b3}private static {color}{color:#000000}String 
{color}{color:#00627a}getCreateSql{color}({color:#000000}String 
{color}tableName) {
{color:#000000}StringBuilder sql {color}= {color:#0033b3}new 
{color}StringBuilder({color:#067d17}"create table 
"{color}).append(tableName).append({color:#067d17}" (id int primary 
key"{color});

{color:#0033b3}for {color}({color:#0033b3}int {color}i = 
{color:#1750eb}0{color}; i < {color:#871094}COLUMNS{color}; i++) {
{color:#000000}sql{color}.append({color:#067d17}", 
col"{color}).append(i).append({color:#067d17}" varchar NOT NULL"{color});
}

{color:#000000}sql{color}.append({color:#067d17}")"{color});

{color:#0033b3}return {color}{color:#000000}sql{color}.toString();
}

{color:#0033b3}private static final void {color}{color:#00627a}s{color}() {
{color:#0033b3}if {color}({color:#871094}SLEEP {color}> 
{color:#1750eb}0{color}) {
{color:#0033b3}try {color}{
{color:#000000}Thread{color}.sleep({color:#871094}SLEEP{color});
} {color:#0033b3}catch {color}({color:#000000}InterruptedException {color}e) {
{color:#8c8c8c}// NoOp
{color}{color:#8c8c8c} {color}}
}
}

{color:#0033b3}private static void 
{color}{color:#00627a}createTables{color}({color:#000000}Connection 
{color}connection, {color:#000000}String {color}tableName) 
{color:#0033b3}throws {color}{color:#000000}SQLException {color}{
{color:#0033b3}try {color}({color:#000000}Statement stmt {color}= 
connection.createStatement()) {
{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"Creating
 " {color}+ tableName);

{color:#000000}stmt{color}.executeUpdate({color:#067d17}"{color}{color:#067d17}drop
 table if exists {color}{color:#067d17}" {color}+ tableName );
s();
{color:#000000}stmt{color}.executeUpdate(getCreateSql(tableName));
s();
}
}

{color:#0033b3}private static {color}{color:#000000}String 
{color}{color:#00627a}getInsertSql{color}({color:#000000}String 
{color}tableName) {
{color:#000000}StringBuilder sql {color}= {color:#0033b3}new 
{color}StringBuilder({color:#067d17}"insert into 
"{color}).append(tableName).append({color:#067d17}" values(?"{color});

{color:#0033b3}for {color}({color:#0033b3}int {color}i = 
{color:#1750eb}0{color}; i < {color:#871094}COLUMNS{color}; i++) {
{color:#000000}sql{color}.append({color:#067d17}", ?"{color});
}

{color:#000000}sql{color}.append({color:#067d17}")"{color});

{color:#0033b3}return {color}{color:#000000}sql{color}.toString();
}

{color:#0033b3}private static void 
{color}{color:#00627a}insertBatch{color}({color:#000000}PreparedStatement 
{color}ps) {
{color:#0033b3}int {color}retryCounter = {color:#1750eb}0{color};
{color:#0033b3}while{color}(retryCounter <= {color:#871094}RETRY{color}) {
{color:#0033b3}try {color}{
ps.executeBatch();

{color:#0033b3}return{color};
} {color:#0033b3}catch {color}({color:#000000}SQLException {color}e) {
{color:#000000}System{color}.{color:#871094}err{color}.println(retryCounter + 
{color:#067d17}" error while executing " {color}+ ps + {color:#067d17}":" 
{color}+ e);

retryCounter++;
}
}
}

{color:#0033b3}private static void 
{color}{color:#00627a}insertData{color}({color:#000000}Connection 
{color}connection, {color:#000000}String {color}tableName) 
{color:#0033b3}throws {color}{color:#000000}SQLException {color}{
{color:#0033b3}long {color}ts = 
{color:#000000}System{color}.currentTimeMillis();
{color:#0033b3}try {color}({color:#000000}PreparedStatement ps {color}= 
connection.prepareStatement(getInsertSql(tableName))) {
{color:#0033b3}int {color}batch = {color:#1750eb}0{color};

{color:#0033b3}for {color}({color:#0033b3}int {color}i = 
{color:#1750eb}0{color}; i < {color:#871094}ROWS{color}; i++) {
{color:#000000}ps{color}.setInt({color:#1750eb}1{color}, i);

{color:#0033b3}for {color}({color:#0033b3}int {color}j = 
{color:#1750eb}2{color}; j < {color:#871094}COLUMNS {color}+ 
{color:#1750eb}2{color}; j++) {
{color:#000000}ps{color}.setString(j, {color:#067d17}"value" {color}+ i + 
{color:#067d17}"_" {color}+ j);
}

{color:#000000}ps{color}.addBatch();
batch++;

{color:#0033b3}if {color}(batch == {color:#871094}BATCH_SIZE{color}) {
batch = {color:#1750eb}0{color};
insertBatch({color:#000000}ps{color});
{color:#000000}ps{color}.clearBatch();

{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"Batch
 " {color}+ {color:#871094}BATCH_SIZE {color}+ {color:#067d17}" took " {color}+ 
({color:#000000}System{color}.currentTimeMillis() - ts) + {color:#067d17}" to 
get " {color}+ i + {color:#067d17}" rows"{color});

s();
ts = {color:#000000}System{color}.currentTimeMillis();
}
}

{color:#0033b3}if {color}(batch > {color:#1750eb}0{color}) {
insertBatch({color:#000000}ps{color});
{color:#000000}ps{color}.clearBatch();
s();
}
}
}

{color:#0033b3}private static int 
{color}{color:#00627a}testData{color}({color:#000000}Connection 
{color}connection, {color:#000000}String {color}tableName) 
{color:#0033b3}throws {color}{color:#000000}SQLException {color}{
{color:#0033b3}try {color}({color:#000000}Statement stmt {color}= 
connection.createStatement();
{color:#000000}ResultSet rs {color}= 
{color:#000000}stmt{color}.executeQuery({color:#067d17}"{color}{color:#067d17}select
 count(*) from {color}{color:#067d17}" {color}+ tableName);) {
{color:#000000}rs{color}.next();

{color:#0033b3}int {color}{color:#000000}count {color}= 
{color:#000000}rs{color}.getInt({color:#1750eb}1{color});

{color:#0033b3}int {color}{color:#000000}result {color}= {color:#871094}ROWS 
{color}- {color:#000000}count{color};

{color:#0033b3}if {color}({color:#000000}result {color}== 
{color:#1750eb}0{color}) {
{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"Found
 " {color}+ {color:#000000}count {color}+ {color:#067d17}" rows in " {color}+ 
tableName);
} {color:#0033b3}else {color}{
{color:#000000}System{color}.{color:#871094}err{color}.println({color:#067d17}"Found
 " {color}+ {color:#000000}count {color}+ {color:#067d17}" rows in " {color}+ 
tableName + {color:#067d17}" instead of " {color}+ {color:#871094}ROWS{color});
}

s();

{color:#0033b3}return {color}{color:#000000}result{color};
}
}

{color:#0033b3}public static void 
{color}{color:#00627a}main{color}({color:#000000}String{color}[] args) 
{color:#0033b3}throws {color}{color:#000000}SQLException {color}{
{color:#0033b3}int {color}lostRows = {color:#1750eb}0{color};
{color:#0033b3}try {color}({color:#000000}Connection connection {color}= 
{color:#000000}DriverManager{color}.getConnection({color:#871094}DB_URL{color}))
 {
{color:#0033b3}for {color}({color:#0033b3}int {color}i = 
{color:#1750eb}0{color}; i < {color:#871094}TABLES{color}; i++) {
{color:#000000}String tableName {color}= {color:#871094}TABLE_NAME {color}+ i;
createTables({color:#000000}connection{color}, {color:#000000}tableName{color});

insertData({color:#000000}connection{color}, {color:#000000}tableName{color});

lostRows += testData({color:#000000}connection{color}, 
{color:#000000}tableName{color});
}
}

{color:#000000}System{color}.exit(lostRows);
}
}

  was:import java.sql.Connection; import java.sql.DriverManager; import 
java.sql.PreparedStatement; import java.sql.ResultSet; 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 = 10; 
private static final String TABLE_NAME = "K"; private static final int ROWS = 
10; private static final int TABLES = 10; private static final int BATCH_SIZE = 
10; private static final int SLEEP = 30; 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 final void s() \{ if 
(SLEEP > 0) { try { Thread.sleep(SLEEP); } catch (InterruptedException e) \{ // 
NoOp } } } 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 ); s(); 
stmt.executeUpdate(getCreateSql(tableName)); s(); } } 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(); 
System.out.println("Batch " + BATCH_SIZE + " took " + 
(System.currentTimeMillis() - ts) + " to get " + i + " rows"); s(); ts = 
System.currentTimeMillis(); } } if (batch > 0) \{ batch = 0; ps.executeBatch(); 
ps.clearBatch(); s(); } } } private static int testData(Connection connection, 
String tableName) throws SQLException \{ try (Statement stmt = 
connection.createStatement(); ResultSet rs = stmt.executeQuery("select count(*) 
from " + tableName);) { rs.next(); int count = rs.getInt(1); int result = ROWS 
- count; if (result == 0) { System.out.println("Found " + count + " rows in " + 
tableName); } else \{ System.err.println("Found " + count + " rows in " + 
tableName + " instead of " + ROWS); } s(); return result; } } public static 
void main(String[] args) throws SQLException \{ int lostRows = 0; 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); lostRows += testData(connection, 
tableName); } } System.exit(lostRows); } }


> 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
>
>
> {color:#0033b3}import {color}{color:#000000}java.sql.Connection{color};
> {color:#0033b3}import {color}{color:#000000}java.sql.DriverManager{color};
> {color:#0033b3}import {color}{color:#000000}java.sql.PreparedStatement{color};
> {color:#0033b3}import {color}{color:#000000}java.sql.ResultSet{color};
> {color:#0033b3}import {color}{color:#000000}java.sql.SQLException{color};
> {color:#0033b3}import {color}{color:#000000}java.sql.Statement{color};
> {color:#0033b3}public class {color}{color:#000000}TimeoutExceptionReproducer 
> {color}{
> {color:#0033b3}private static final {color}{color:#000000}String 
> {color}{color:#871094}DB_URL {color}= 
> {color:#067d17}"jdbc:ignite:thin://172.24.1.2:10800"{color};
> {color:#0033b3}private static final int {color}{color:#871094}COLUMNS 
> {color}= {color:#1750eb}10{color};
> {color:#0033b3}private static final {color}{color:#000000}String 
> {color}{color:#871094}TABLE_NAME {color}= {color:#067d17}"K"{color};
> {color:#0033b3}private static final int {color}{color:#871094}ROWS {color}= 
> {color:#1750eb}1000{color};
> {color:#0033b3}private static final int {color}{color:#871094}TABLES {color}= 
> {color:#1750eb}10{color};
> {color:#0033b3}private static final int {color}{color:#871094}BATCH_SIZE 
> {color}= {color:#1750eb}10{color};
> {color:#0033b3}private static final int {color}{color:#871094}SLEEP {color}= 
> {color:#1750eb}30{color};
> {color:#0033b3}private static final int {color}{color:#871094}RETRY {color}= 
> {color:#1750eb}10{color};
> {color:#0033b3}private static {color}{color:#000000}String 
> {color}{color:#00627a}getCreateSql{color}({color:#000000}String 
> {color}tableName) {
> {color:#000000}StringBuilder sql {color}= {color:#0033b3}new 
> {color}StringBuilder({color:#067d17}"create table 
> "{color}).append(tableName).append({color:#067d17}" (id int primary 
> key"{color});
> {color:#0033b3}for {color}({color:#0033b3}int {color}i = 
> {color:#1750eb}0{color}; i < {color:#871094}COLUMNS{color}; i++) {
> {color:#000000}sql{color}.append({color:#067d17}", 
> col"{color}).append(i).append({color:#067d17}" varchar NOT NULL"{color});
> }
> {color:#000000}sql{color}.append({color:#067d17}")"{color});
> {color:#0033b3}return {color}{color:#000000}sql{color}.toString();
> }
> {color:#0033b3}private static final void {color}{color:#00627a}s{color}() {
> {color:#0033b3}if {color}({color:#871094}SLEEP {color}> 
> {color:#1750eb}0{color}) {
> {color:#0033b3}try {color}{
> {color:#000000}Thread{color}.sleep({color:#871094}SLEEP{color});
> } {color:#0033b3}catch {color}({color:#000000}InterruptedException {color}e) {
> {color:#8c8c8c}// NoOp
> {color}{color:#8c8c8c} {color}}
> }
> }
> {color:#0033b3}private static void 
> {color}{color:#00627a}createTables{color}({color:#000000}Connection 
> {color}connection, {color:#000000}String {color}tableName) 
> {color:#0033b3}throws {color}{color:#000000}SQLException {color}{
> {color:#0033b3}try {color}({color:#000000}Statement stmt {color}= 
> connection.createStatement()) {
> {color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"Creating
>  " {color}+ tableName);
> {color:#000000}stmt{color}.executeUpdate({color:#067d17}"{color}{color:#067d17}drop
>  table if exists {color}{color:#067d17}" {color}+ tableName );
> s();
> {color:#000000}stmt{color}.executeUpdate(getCreateSql(tableName));
> s();
> }
> }
> {color:#0033b3}private static {color}{color:#000000}String 
> {color}{color:#00627a}getInsertSql{color}({color:#000000}String 
> {color}tableName) {
> {color:#000000}StringBuilder sql {color}= {color:#0033b3}new 
> {color}StringBuilder({color:#067d17}"insert into 
> "{color}).append(tableName).append({color:#067d17}" values(?"{color});
> {color:#0033b3}for {color}({color:#0033b3}int {color}i = 
> {color:#1750eb}0{color}; i < {color:#871094}COLUMNS{color}; i++) {
> {color:#000000}sql{color}.append({color:#067d17}", ?"{color});
> }
> {color:#000000}sql{color}.append({color:#067d17}")"{color});
> {color:#0033b3}return {color}{color:#000000}sql{color}.toString();
> }
> {color:#0033b3}private static void 
> {color}{color:#00627a}insertBatch{color}({color:#000000}PreparedStatement 
> {color}ps) {
> {color:#0033b3}int {color}retryCounter = {color:#1750eb}0{color};
> {color:#0033b3}while{color}(retryCounter <= {color:#871094}RETRY{color}) {
> {color:#0033b3}try {color}{
> ps.executeBatch();
> {color:#0033b3}return{color};
> } {color:#0033b3}catch {color}({color:#000000}SQLException {color}e) {
> {color:#000000}System{color}.{color:#871094}err{color}.println(retryCounter + 
> {color:#067d17}" error while executing " {color}+ ps + {color:#067d17}":" 
> {color}+ e);
> retryCounter++;
> }
> }
> }
> {color:#0033b3}private static void 
> {color}{color:#00627a}insertData{color}({color:#000000}Connection 
> {color}connection, {color:#000000}String {color}tableName) 
> {color:#0033b3}throws {color}{color:#000000}SQLException {color}{
> {color:#0033b3}long {color}ts = 
> {color:#000000}System{color}.currentTimeMillis();
> {color:#0033b3}try {color}({color:#000000}PreparedStatement ps {color}= 
> connection.prepareStatement(getInsertSql(tableName))) {
> {color:#0033b3}int {color}batch = {color:#1750eb}0{color};
> {color:#0033b3}for {color}({color:#0033b3}int {color}i = 
> {color:#1750eb}0{color}; i < {color:#871094}ROWS{color}; i++) {
> {color:#000000}ps{color}.setInt({color:#1750eb}1{color}, i);
> {color:#0033b3}for {color}({color:#0033b3}int {color}j = 
> {color:#1750eb}2{color}; j < {color:#871094}COLUMNS {color}+ 
> {color:#1750eb}2{color}; j++) {
> {color:#000000}ps{color}.setString(j, {color:#067d17}"value" {color}+ i + 
> {color:#067d17}"_" {color}+ j);
> }
> {color:#000000}ps{color}.addBatch();
> batch++;
> {color:#0033b3}if {color}(batch == {color:#871094}BATCH_SIZE{color}) {
> batch = {color:#1750eb}0{color};
> insertBatch({color:#000000}ps{color});
> {color:#000000}ps{color}.clearBatch();
> {color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"Batch
>  " {color}+ {color:#871094}BATCH_SIZE {color}+ {color:#067d17}" took " 
> {color}+ ({color:#000000}System{color}.currentTimeMillis() - ts) + 
> {color:#067d17}" to get " {color}+ i + {color:#067d17}" rows"{color});
> s();
> ts = {color:#000000}System{color}.currentTimeMillis();
> }
> }
> {color:#0033b3}if {color}(batch > {color:#1750eb}0{color}) {
> insertBatch({color:#000000}ps{color});
> {color:#000000}ps{color}.clearBatch();
> s();
> }
> }
> }
> {color:#0033b3}private static int 
> {color}{color:#00627a}testData{color}({color:#000000}Connection 
> {color}connection, {color:#000000}String {color}tableName) 
> {color:#0033b3}throws {color}{color:#000000}SQLException {color}{
> {color:#0033b3}try {color}({color:#000000}Statement stmt {color}= 
> connection.createStatement();
> {color:#000000}ResultSet rs {color}= 
> {color:#000000}stmt{color}.executeQuery({color:#067d17}"{color}{color:#067d17}select
>  count(*) from {color}{color:#067d17}" {color}+ tableName);) {
> {color:#000000}rs{color}.next();
> {color:#0033b3}int {color}{color:#000000}count {color}= 
> {color:#000000}rs{color}.getInt({color:#1750eb}1{color});
> {color:#0033b3}int {color}{color:#000000}result {color}= {color:#871094}ROWS 
> {color}- {color:#000000}count{color};
> {color:#0033b3}if {color}({color:#000000}result {color}== 
> {color:#1750eb}0{color}) {
> {color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"Found
>  " {color}+ {color:#000000}count {color}+ {color:#067d17}" rows in " {color}+ 
> tableName);
> } {color:#0033b3}else {color}{
> {color:#000000}System{color}.{color:#871094}err{color}.println({color:#067d17}"Found
>  " {color}+ {color:#000000}count {color}+ {color:#067d17}" rows in " {color}+ 
> tableName + {color:#067d17}" instead of " {color}+ 
> {color:#871094}ROWS{color});
> }
> s();
> {color:#0033b3}return {color}{color:#000000}result{color};
> }
> }
> {color:#0033b3}public static void 
> {color}{color:#00627a}main{color}({color:#000000}String{color}[] args) 
> {color:#0033b3}throws {color}{color:#000000}SQLException {color}{
> {color:#0033b3}int {color}lostRows = {color:#1750eb}0{color};
> {color:#0033b3}try {color}({color:#000000}Connection connection {color}= 
> {color:#000000}DriverManager{color}.getConnection({color:#871094}DB_URL{color}))
>  {
> {color:#0033b3}for {color}({color:#0033b3}int {color}i = 
> {color:#1750eb}0{color}; i < {color:#871094}TABLES{color}; i++) {
> {color:#000000}String tableName {color}= {color:#871094}TABLE_NAME {color}+ i;
> createTables({color:#000000}connection{color}, 
> {color:#000000}tableName{color});
> insertData({color:#000000}connection{color}, {color:#000000}tableName{color});
> lostRows += testData({color:#000000}connection{color}, 
> {color:#000000}tableName{color});
> }
> }
> {color:#000000}System{color}.exit(lostRows);
> }
> }



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to