This is an automated email from the ASF dual-hosted git repository. liyang pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 768a5ececcd855b0f796881d42b36b17088c61d5 Author: Jiawei Li <1019037...@qq.com> AuthorDate: Thu Sep 21 14:20:24 2023 +0800 KYLIN-5815 Failed to add primaryKey of table when upgrading concurrently --- .../common/persistence/metadata/JdbcEpochStore.java | 20 ++++++++++++-------- .../common/persistence/metadata/jdbc/JdbcUtil.java | 10 ++++++++++ .../persistence/metadata/jdbc/JdbcUtilTest.java | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/JdbcEpochStore.java b/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/JdbcEpochStore.java index 97b50d2969..2d510801b6 100644 --- a/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/JdbcEpochStore.java +++ b/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/JdbcEpochStore.java @@ -41,6 +41,7 @@ import org.apache.commons.dbcp2.BasicDataSource; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.Singletons; import org.apache.kylin.common.exception.KylinException; +import org.apache.kylin.common.persistence.metadata.jdbc.JdbcUtil; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; @@ -122,17 +123,20 @@ public class JdbcEpochStore extends EpochStore { } return dataSource.getConnection(); } - + @Override public void createIfNotExist() throws Exception { if (isTableExists(getConnection(jdbcTemplate), table)) { - if (!isPrimaryKeyExists(getConnection(jdbcTemplate), table)) { - withTransaction(transactionManager, () -> { - jdbcTemplate.execute(getAddPrimarykeySql(table)); - return 1; - }); - log.info("Succeed to add table primary key: {}", table); - } + JdbcUtil.retry(() -> { + if (!isPrimaryKeyExists(getConnection(jdbcTemplate), table)) { + withTransaction(transactionManager, () -> { + jdbcTemplate.execute(getAddPrimarykeySql(table)); + return 1; + }); + log.info("Succeed to add table primary key: {}", table); + } + return 1; + }); return; } String fileName = "metadata-jdbc-default.properties"; diff --git a/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtil.java b/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtil.java index 51b61c348a..265777c1a3 100644 --- a/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtil.java +++ b/src/core-common/src/main/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtil.java @@ -260,4 +260,14 @@ public class JdbcUtil { val dataSource = BasicDataSourceFactory.createDataSource(props); return new JdbcTemplate(dataSource); } + + public static <T> T retry(Callback<T> func) throws Exception { + try { + return func.handle(); + } catch (Exception e) { + log.error("occur exception, retry", e); + return func.handle(); + } + } + } diff --git a/src/core-common/src/test/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtilTest.java b/src/core-common/src/test/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtilTest.java index ab0f7926c9..a3d05f453d 100644 --- a/src/core-common/src/test/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtilTest.java +++ b/src/core-common/src/test/java/org/apache/kylin/common/persistence/metadata/jdbc/JdbcUtilTest.java @@ -20,6 +20,8 @@ package org.apache.kylin.common.persistence.metadata.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.HashSet; +import java.util.Set; import org.junit.Assert; import org.junit.Before; @@ -51,4 +53,19 @@ public class JdbcUtilTest { null); Assert.assertFalse(JdbcUtil.isColumnExists(connection, table, "not_exists")); } + + @Test + public void testRetry() throws Exception { + Set set = new HashSet(); + int result = JdbcUtil.retry(() -> { + boolean shouldThrowException = set.isEmpty(); + set.add(true); + if (shouldThrowException) { + throw new Exception("test"); + } + return 1; + }); + Assert.assertEquals(1, result); + + } }