This is an automated email from the ASF dual-hosted git repository.

jshao pushed a commit to branch branch-0.6
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-0.6 by this push:
     new dde4d5105 [#3173] fix(doris-catalog): Fix the bug when create doris 
table with empty property (#4402)
dde4d5105 is described below

commit dde4d510508de906a48d6a57fa4ea7a87a523d80
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Aug 6 22:38:21 2024 +0800

    [#3173] fix(doris-catalog): Fix the bug when create doris table with empty 
property (#4402)
    
    ### What changes were proposed in this pull request?
    
    
    Automatically set the property `replication_num` to `1` if the number of
    backend servers is less than 3, this will mostly happen in the test
    environment or Gravitino CI docker image.
    
    ### Why are the changes needed?
    
    Improve user experience when they create the Doris catalog with
    Gravitino CI Doris image.
    
    Fix: #3173
    
    ### Does this PR introduce _any_ user-facing change?
    
    N/A
    
    ### How was this patch tested?
    
    Existing UT and IT can cover this change.
    
    Co-authored-by: Qi Yu <[email protected]>
---
 .../gravitino/catalog/doris/DorisCatalog.java      |  9 ++++
 .../doris/DorisTablePropertiesMetadata.java        | 54 ++++++++++++++++++++++
 .../doris/operation/DorisTableOperations.java      | 42 +++++++++++++++++
 .../gravitino/catalog/doris/TestDorisCatalog.java  | 45 ++++++++++++++++++
 .../doris/integration/test/CatalogDorisIT.java     |  4 +-
 .../doris/operation/TestDorisTableOperations.java  |  1 -
 .../TestDorisTablePartitionOperations.java         |  2 +-
 docs/gravitino-server-config.md                    |  2 +-
 docs/jdbc-doris-catalog.md                         | 19 ++++----
 .../test/web/ui/CatalogsPageDorisTest.java         |  1 -
 10 files changed, 163 insertions(+), 16 deletions(-)

diff --git 
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/DorisCatalog.java
 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/DorisCatalog.java
index 3034d07f3..0a24908d5 100644
--- 
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/DorisCatalog.java
+++ 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/DorisCatalog.java
@@ -32,11 +32,15 @@ import 
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
 import org.apache.gravitino.catalog.jdbc.operation.JdbcDatabaseOperations;
 import org.apache.gravitino.catalog.jdbc.operation.JdbcTableOperations;
 import org.apache.gravitino.connector.CatalogOperations;
+import org.apache.gravitino.connector.PropertiesMetadata;
 import org.apache.gravitino.connector.capability.Capability;
 
 /** Implementation of an Apache Doris catalog in Apache Gravitino. */
 public class DorisCatalog extends JdbcCatalog {
 
+  public static final DorisTablePropertiesMetadata DORIS_TABLE_PROPERTIES_META 
=
+      new DorisTablePropertiesMetadata();
+
   @Override
   public String shortName() {
     return "jdbc-doris";
@@ -82,4 +86,9 @@ public class DorisCatalog extends JdbcCatalog {
   protected JdbcColumnDefaultValueConverter 
createJdbcColumnDefaultValueConverter() {
     return new DorisColumnDefaultValueConverter();
   }
+
+  @Override
+  public PropertiesMetadata tablePropertiesMetadata() throws 
UnsupportedOperationException {
+    return DORIS_TABLE_PROPERTIES_META;
+  }
 }
diff --git 
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/DorisTablePropertiesMetadata.java
 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/DorisTablePropertiesMetadata.java
new file mode 100644
index 000000000..4cad4c035
--- /dev/null
+++ 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/DorisTablePropertiesMetadata.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.doris;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+import java.util.List;
+import java.util.Map;
+import org.apache.gravitino.catalog.jdbc.JdbcTablePropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+public class DorisTablePropertiesMetadata extends JdbcTablePropertiesMetadata {
+
+  public static final String REPLICATION_FACTOR = "replication_num";
+  public static final int DEFAULT_REPLICATION_FACTOR = 1;
+  public static final int DEFAULT_REPLICATION_FACTOR_IN_SERVER_SIDE = 3;
+
+  private static final Map<String, PropertyEntry<?>> PROPERTIES_METADATA;
+
+  static {
+    List<PropertyEntry<?>> propertyEntries =
+        ImmutableList.of(
+            PropertyEntry.integerOptionalPropertyEntry(
+                REPLICATION_FACTOR,
+                "The number of replications for the table. If not specified 
and the number of backend server less than 3,"
+                    + " the default value will be used",
+                false /* immutable */,
+                DEFAULT_REPLICATION_FACTOR, /* default value */
+                false /* hidden */));
+
+    PROPERTIES_METADATA = Maps.uniqueIndex(propertyEntries, 
PropertyEntry::getName);
+  }
+
+  @Override
+  protected Map<String, PropertyEntry<?>> specificPropertyEntries() {
+    return PROPERTIES_METADATA;
+  }
+}
diff --git 
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
index 21795d803..27b2e9c68 100644
--- 
a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
+++ 
b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java
@@ -18,6 +18,9 @@
  */
 package org.apache.gravitino.catalog.doris.operation;
 
+import static 
org.apache.gravitino.catalog.doris.DorisCatalog.DORIS_TABLE_PROPERTIES_META;
+import static 
org.apache.gravitino.catalog.doris.DorisTablePropertiesMetadata.DEFAULT_REPLICATION_FACTOR_IN_SERVER_SIDE;
+import static 
org.apache.gravitino.catalog.doris.DorisTablePropertiesMetadata.REPLICATION_FACTOR;
 import static 
org.apache.gravitino.catalog.doris.utils.DorisUtils.generatePartitionSqlFragment;
 import static org.apache.gravitino.rel.Column.DEFAULT_VALUE_NOT_SET;
 
@@ -32,6 +35,7 @@ import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -154,6 +158,7 @@ public class DorisTableOperations extends 
JdbcTableOperations {
       sqlBuilder.append(" BUCKETS ").append(distribution.number());
     }
 
+    properties = appendNecessaryProperties(properties);
     // Add table properties
     
sqlBuilder.append(NEW_LINE).append(DorisUtils.generatePropertiesSql(properties));
 
@@ -164,6 +169,43 @@ public class DorisTableOperations extends 
JdbcTableOperations {
     return result;
   }
 
+  private Map<String, String> appendNecessaryProperties(Map<String, String> 
properties) {
+    Map<String, String> resultMap;
+    if (properties == null) {
+      resultMap = new HashMap<>();
+    } else {
+      resultMap = new HashMap<>(properties);
+    }
+
+    // If the backend server is less than 
DEFAULT_REPLICATION_FACTOR_IN_SERVER_SIDE (3), we need to
+    // set the property 'replication_num' to 1 explicitly.
+    if (!properties.containsKey(REPLICATION_FACTOR)) {
+      // Try to check the number of backend servers.
+      String query = "select count(*) from information_schema.backends where 
Alive = 'true'";
+
+      try (Connection connection = dataSource.getConnection();
+          Statement statement = connection.createStatement();
+          ResultSet resultSet = statement.executeQuery(query)) {
+        while (resultSet.next()) {
+          int backendCount = resultSet.getInt(1);
+          if (backendCount < DEFAULT_REPLICATION_FACTOR_IN_SERVER_SIDE) {
+            resultMap.put(
+                REPLICATION_FACTOR,
+                DORIS_TABLE_PROPERTIES_META
+                    .propertyEntries()
+                    .get(REPLICATION_FACTOR)
+                    .getDefaultValue()
+                    .toString());
+          }
+        }
+      } catch (Exception e) {
+        throw new RuntimeException("Failed to get the number of backend 
servers", e);
+      }
+    }
+
+    return resultMap;
+  }
+
   private static void validateIncrementCol(JdbcColumn[] columns) {
     // Get all auto increment column
     List<JdbcColumn> autoIncrementCols =
diff --git 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/TestDorisCatalog.java
 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/TestDorisCatalog.java
new file mode 100644
index 000000000..039a15b0d
--- /dev/null
+++ 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/TestDorisCatalog.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.catalog.doris;
+
+import static 
org.apache.gravitino.catalog.doris.DorisTablePropertiesMetadata.REPLICATION_FACTOR;
+
+import java.util.Map;
+import org.apache.gravitino.connector.PropertyEntry;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class TestDorisCatalog {
+
+  @Test
+  void testDorisTablePropertiesMetadata() {
+    DorisTablePropertiesMetadata dorisTablePropertiesMetadata = new 
DorisTablePropertiesMetadata();
+    Map<String, PropertyEntry<?>> propertyEntryMap =
+        dorisTablePropertiesMetadata.specificPropertyEntries();
+    Assertions.assertTrue(propertyEntryMap.containsKey(REPLICATION_FACTOR));
+
+    PropertyEntry<?> propertyEntry = propertyEntryMap.get(REPLICATION_FACTOR);
+    Assertions.assertEquals(REPLICATION_FACTOR, propertyEntry.getName());
+    Assertions.assertFalse(propertyEntry.isImmutable());
+    Assertions.assertEquals(
+        DorisTablePropertiesMetadata.DEFAULT_REPLICATION_FACTOR, 
propertyEntry.getDefaultValue());
+    Assertions.assertFalse(propertyEntry.isHidden());
+  }
+}
diff --git 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/integration/test/CatalogDorisIT.java
 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/integration/test/CatalogDorisIT.java
index 7bc073a0b..fcfad401d 100644
--- 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/integration/test/CatalogDorisIT.java
+++ 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/integration/test/CatalogDorisIT.java
@@ -205,9 +205,7 @@ public class CatalogDorisIT extends AbstractIT {
   }
 
   private Map<String, String> createTableProperties() {
-    Map<String, String> properties = Maps.newHashMap();
-    properties.put("replication_allocation", "tag.location.default: 1");
-    return properties;
+    return ImmutableMap.of();
   }
 
   private Distribution createDistribution() {
diff --git 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
index a252a610b..07e6209d9 100644
--- 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
+++ 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java
@@ -91,7 +91,6 @@ public class TestDorisTableOperations extends TestDoris {
 
   private static Map<String, String> createProperties() {
     Map<String, String> properties = Maps.newHashMap();
-    properties.put("replication_allocation", "tag.location.default: 1");
     return properties;
   }
 
diff --git 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTablePartitionOperations.java
 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTablePartitionOperations.java
index 0494082bd..40cb3254b 100644
--- 
a/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTablePartitionOperations.java
+++ 
b/catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTablePartitionOperations.java
@@ -74,7 +74,7 @@ public class TestDorisTablePartitionOperations extends 
TestDoris {
   }
 
   private static Map<String, String> createProperties() {
-    return ImmutableMap.of("replication_allocation", "tag.location.default: 
1");
+    return ImmutableMap.of();
   }
 
   @Test
diff --git a/docs/gravitino-server-config.md b/docs/gravitino-server-config.md
index 88e473ded..4f3fba6c7 100644
--- a/docs/gravitino-server-config.md
+++ b/docs/gravitino-server-config.md
@@ -58,7 +58,7 @@ The following table lists the storage configuration items:
 | `gravitino.entity.store.kv.deleteAfterTimeMs`     | It is deprecated since 
Gravitino 0.5.0. Please use `gravitino.entity.store.deleteAfterTimeMs` instead. 
                                                                                
                                                             | `604800000`(7 
days)              | No                                               | 0.3.0   
      |
 | `gravitino.entity.store.deleteAfterTimeMs`        | The maximum time in 
milliseconds that deleted and old-version data is kept. Set to at least 10 
minutes and no longer than 30 days.                                             
                                                                     | 
`604800000`(7 days)              | No                                           
    | 0.5.0         |
 | `gravitino.entity.store.versionRetentionCount`    | The Count of versions 
allowed to be retained, including the current version, used to delete old 
versions data. Set to at least 1 and no greater than 10.                        
                                                                    | `1`       
                       | No                                               | 
0.5.0         |
-| `gravitino.entity.store.relational`               | Detailed implementation 
of Relational storage. `MySQL` is currently supported, and the implementation 
is `JDBCBackend`.                                                               
                                                              | `JDBCBackend`   
                 | No                                               | 0.5.0     
    |
+| `gravitino.entity.store.relational`               | Detailed implementation 
of Relational storage. `H2` and `MySQL` is currently supported, and the 
implementation is `JDBCBackend`.                                                
                                                                    | 
`JDBCBackend`                    | No                                           
    | 0.5.0         |
 | `gravitino.entity.store.relational.jdbcUrl`       | The database url that 
the `JDBCBackend` needs to connect to. If you use `MySQL`, you should firstly 
initialize the database tables yourself by executing the ddl scripts in the 
`${GRAVITINO_HOME}/scripts/mysql/` directory.                       | `jdbc:h2` 
                       | No                                               | 
0.5.0         |
 | `gravitino.entity.store.relational.jdbcDriver`    | The jdbc driver name 
that the `JDBCBackend` needs to use. You should place the driver Jar package in 
the `${GRAVITINO_HOME}/libs/` directory.                                        
                                                               | 
`org.h2.Driver`                  | Yes if the jdbc connection url is not 
`jdbc:h2`  | 0.5.0         |
 | `gravitino.entity.store.relational.jdbcUser`      | The username that the 
`JDBCBackend` needs to use when connecting the database. It is required for 
`MySQL`.                                                                        
                                                                  | `gravitino` 
                     | Yes if the jdbc connection url is not `jdbc:h2`  | 0.5.0 
        |
diff --git a/docs/jdbc-doris-catalog.md b/docs/jdbc-doris-catalog.md
index 9ea70362a..1548455af 100644
--- a/docs/jdbc-doris-catalog.md
+++ b/docs/jdbc-doris-catalog.md
@@ -41,15 +41,16 @@ more details.
 
 Besides the [common catalog 
properties](./gravitino-server-config.md#gravitino-catalog-properties-configuration),
 the Doris catalog has the following properties:
 
-| Configuration item   | Description                                           
                              | Default value | Required | Since Version |
-|----------------------|-------------------------------------------------------------------------------------|---------------|----------|---------------|
-| `jdbc-url`           | JDBC URL for connecting to the database. For example, 
`jdbc:mysql://localhost:9030` | (none)        | Yes      | 0.5.0         |
-| `jdbc-driver`        | The driver of the JDBC connection. For example, 
`com.mysql.jdbc.Driver`.            | (none)        | Yes      | 0.5.0         |
-| `jdbc-user`          | The JDBC user name.                                   
                              | (none)        | Yes      | 0.5.0         |
-| `jdbc-password`      | The JDBC password.                                    
                              | (none)        | Yes      | 0.5.0         |
-| `jdbc.pool.min-size` | The minimum number of connections in the pool. `2` by 
default.                      | `2`           | No       | 0.5.0         |
-| `jdbc.pool.max-size` | The maximum number of connections in the pool. `10` 
by default.                     | `10`          | No       | 0.5.0         |
-
+| Configuration item   | Description                                           
                                                                                
                                                                                
                                                                                
                                                                                
                           | Default value | Required | Since Version |
+|----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------|
+| `jdbc-url`           | JDBC URL for connecting to the database. For example, 
`jdbc:mysql://localhost:9030`                                                   
                                                                                
                                                                                
                                                                                
                           | (none)        | Yes      | 0.5.0         |
+| `jdbc-driver`        | The driver of the JDBC connection. For example, 
`com.mysql.jdbc.Driver`.                                                        
                                                                                
                                                                                
                                                                                
                                 | (none)        | Yes      | 0.5.0         |
+| `jdbc-user`          | The JDBC user name.                                   
                                                                                
                                                                                
                                                                                
                                                                                
                           | (none)        | Yes      | 0.5.0         |
+| `jdbc-password`      | The JDBC password.                                    
                                                                                
                                                                                
                                                                                
                                                                                
                           | (none)        | Yes      | 0.5.0         |
+| `jdbc.pool.min-size` | The minimum number of connections in the pool. `2` by 
default.                                                                        
                                                                                
                                                                                
                                                                                
                           | `2`           | No       | 0.5.0         |
+| `jdbc.pool.max-size` | The maximum number of connections in the pool. `10` 
by default.                                                                     
                                                                                
                                                                                
                                                                                
                             | `10`          | No       | 0.5.0         |
+| `jdbc.pool.max-size` | The maximum number of connections in the pool. `10` 
by default.                                                                     
                                                                                
                                                                                
                                                                                
                             | `10`          | No       | 0.5.0         |
+| `replication_num`    | The number of replications for the table. If not 
specified and the number of backend servers less than 3, then the default value 
is 1; If not specified and the number of backend servers greater or equals to 
3, the default value (3) in Doris server will be used. For more, please see the 
[doc](https://doris.apache.org/docs/1.2/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE/)
 | `1` or `3`    | No       | 0.6.0         |
 Before using the Doris Catalog, you must download the corresponding JDBC 
driver to the `catalogs/jdbc-doris/libs` directory.
 Gravitino doesn't package the JDBC driver for Doris due to licensing issues.
 
diff --git 
a/integration-test/src/test/java/org/apache/gravitino/integration/test/web/ui/CatalogsPageDorisTest.java
 
b/integration-test/src/test/java/org/apache/gravitino/integration/test/web/ui/CatalogsPageDorisTest.java
index 72a4afbf5..1fcd754b9 100644
--- 
a/integration-test/src/test/java/org/apache/gravitino/integration/test/web/ui/CatalogsPageDorisTest.java
+++ 
b/integration-test/src/test/java/org/apache/gravitino/integration/test/web/ui/CatalogsPageDorisTest.java
@@ -121,7 +121,6 @@ public class CatalogsPageDorisTest extends AbstractWebIT {
       String tableName,
       String colName) {
     Map<String, String> properties = Maps.newHashMap();
-    properties.put("replication_allocation", "tag.location.default: 1");
     Column column = Column.of(colName, Types.IntegerType.get(), "column 
comment");
     Catalog catalog_doris = metalake.loadCatalog(catalogName);
     catalog_doris

Reply via email to