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);
+
+    }
 }

Reply via email to