[ 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)