This is an automated email from the ASF dual-hosted git repository.
danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new ea59a08f4d5 [HUDI-6133] Eliminate one deletion operation if state is
not COMPLETED (#8563)
ea59a08f4d5 is described below
commit ea59a08f4d5ab346526afff77e67b0e29792bf6c
Author: Brisk Wong <[email protected]>
AuthorDate: Tue Jul 4 14:07:28 2023 +0800
[HUDI-6133] Eliminate one deletion operation if state is not COMPLETED
(#8563)
1. Eliminate one deletion operation if state is not COMPLETED;
2. Enable it to run unit tests repeatedly.
---
.../hudi/metaserver/service/TableService.java | 2 +-
.../hudi/metaserver/service/TimelineService.java | 8 ++------
.../hudi/metaserver/store/MetaserverStorage.java | 10 ++++++++++
.../metaserver/store/RelationalDBBasedStorage.java | 21 +++++++++++++++++++++
.../src/main/resources/mybatis/DDLMapper.xml | 16 ++++++++--------
.../src/main/resources/mybatis/TableMapper.xml | 16 ++++++++++++++++
.../src/main/resources/mybatis/TimelineMapper.xml | 8 ++++++++
.../store/TestRelationalDBBasedStore.java | 19 +++++++++++++++++--
8 files changed, 83 insertions(+), 17 deletions(-)
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TableService.java
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TableService.java
index 23325e9582e..450abc574ca 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TableService.java
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TableService.java
@@ -32,7 +32,7 @@ import java.io.Serializable;
* Handle all database / table related requests.
*/
public class TableService implements Serializable {
- private MetaserverStorage store;
+ private final MetaserverStorage store;
public TableService(MetaserverStorage metaserverStorage) {
this.store = metaserverStorage;
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TimelineService.java
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TimelineService.java
index b31ef50fdba..2ba98e86464 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TimelineService.java
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/service/TimelineService.java
@@ -139,12 +139,8 @@ public class TimelineService implements Serializable {
Long tableId = MetaserverTableUtils.getTableId(store, db, tb);
HoodieInstantChangeResult result = new HoodieInstantChangeResult();
if (store.instantExists(tableId, instant)) {
- switch (instant.getState()) {
- case COMPLETED:
- store.deleteInstantAllMeta(tableId, instant.getTimestamp());
- break;
- default:
- store.deleteInstant(tableId, instant);
+ if (instant.getState() == TState.COMPLETED) {
+ store.deleteInstantAllMeta(tableId, instant.getTimestamp());
}
store.deleteInstant(tableId, instant);
} else {
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/MetaserverStorage.java
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/MetaserverStorage.java
index fdd8d9546a7..e545b89ecc3 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/MetaserverStorage.java
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/MetaserverStorage.java
@@ -21,6 +21,7 @@ package org.apache.hudi.metaserver.store;
import org.apache.hudi.ApiMaturityLevel;
import org.apache.hudi.PublicAPIClass;
import org.apache.hudi.common.util.Option;
+import org.apache.hudi.common.util.VisibleForTesting;
import org.apache.hudi.metaserver.thrift.MetaserverStorageException;
import org.apache.hudi.metaserver.thrift.THoodieInstant;
import org.apache.hudi.metaserver.thrift.TState;
@@ -41,15 +42,24 @@ public interface MetaserverStorage extends AutoCloseable {
Long getDatabaseId(String db) throws MetaserverStorageException;
+ @VisibleForTesting
+ boolean deleteDatabase(Long dbId) throws MetaserverStorageException;
+
boolean createTable(Long dbId, Table table) throws
MetaserverStorageException;
Table getTable(String db, String tb) throws MetaserverStorageException;
Long getTableId(String db, String tb) throws MetaserverStorageException;
+ @VisibleForTesting
+ boolean deleteTable(Long tableId) throws MetaserverStorageException;
+
// timeline related
String createNewTimestamp(long tableId) throws MetaserverStorageException;
+ @VisibleForTesting
+ boolean deleteTableTimestamp(Long tableId) throws MetaserverStorageException;
+
boolean createInstant(long tableId, THoodieInstant instant) throws
MetaserverStorageException;
boolean updateInstant(long tableId, THoodieInstant fromInstant,
THoodieInstant toInstant) throws MetaserverStorageException;
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/RelationalDBBasedStorage.java
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/RelationalDBBasedStorage.java
index cccb2a04534..e8ed65a47c0 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/RelationalDBBasedStorage.java
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/java/org/apache/hudi/metaserver/store/RelationalDBBasedStorage.java
@@ -75,6 +75,13 @@ public class RelationalDBBasedStorage implements
MetaserverStorage, Serializable
return ids.isEmpty() ? null : ids.get(0);
}
+ @Override
+ public boolean deleteDatabase(Long dbId) throws MetaserverStorageException {
+ Map<String, Object> params = new HashMap<>();
+ params.put("dbId", dbId);
+ return tableDao.deleteBySql("deleteDB", params) == 1;
+ }
+
@Override
public boolean createTable(Long dbId, Table table) throws
MetaserverStorageException {
Map<String, Object> params = new HashMap<>();
@@ -104,6 +111,13 @@ public class RelationalDBBasedStorage implements
MetaserverStorage, Serializable
return ids.isEmpty() ? null : ids.get(0);
}
+ @Override
+ public boolean deleteTable(Long tableId) throws MetaserverStorageException {
+ Map<String, Object> params = new HashMap<>();
+ params.put("tableId", tableId);
+ return tableDao.deleteBySql("deleteTable", params) == 1;
+ }
+
@Override
public String createNewTimestamp(long tableId) throws
MetaserverStorageException {
String oldTimestamp;
@@ -134,6 +148,13 @@ public class RelationalDBBasedStorage implements
MetaserverStorage, Serializable
return timestamps.isEmpty() ? null : timestamps.get(0);
}
+ @Override
+ public boolean deleteTableTimestamp(Long tableId) throws
MetaserverStorageException {
+ Map<String, Object> params = new HashMap<>();
+ params.put("tableId", tableId);
+ return timelineDao.deleteBySql("deleteTimestamp", params) == 1;
+ }
+
@Override
public boolean createInstant(long tableId, THoodieInstant instant) throws
MetaserverStorageException {
InstantBean instantBean = new InstantBean(tableId, instant);
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/DDLMapper.xml
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/DDLMapper.xml
index 938328130f9..edaa933116f 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/DDLMapper.xml
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/DDLMapper.xml
@@ -20,7 +20,7 @@
<mapper namespace="DDLMapper">
<update id="createDBs">
- CREATE TABLE dbs
+ CREATE TABLE IF NOT EXISTS dbs
(
db_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'uuid',
description VARCHAR(512) COMMENT 'database description',
@@ -34,7 +34,7 @@
</update>
<update id="createTables">
- CREATE TABLE tbls
+ CREATE TABLE IF NOT EXISTS tbls
(
tbl_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'uuid',
db_id BIGINT COMMENT 'database id',
@@ -48,7 +48,7 @@
</update>
<update id="createTableParams">
- CREATE TABLE tbl_params
+ CREATE TABLE IF NOT EXISTS tbl_params
(
tbl_id BIGINT UNSIGNED COMMENT 'tbl id',
param_key VARCHAR(256) COMMENT 'param_key',
@@ -60,7 +60,7 @@
</update>
<update id="createPartitions">
- CREATE TABLE partitions
+ CREATE TABLE IF NOT EXISTS partitions
(
part_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'uuid',
tbl_id BIGINT COMMENT 'table id',
@@ -73,7 +73,7 @@
</update>
<update id="createTableTimestamp">
- CREATE TABLE tbl_timestamp
+ CREATE TABLE IF NOT EXISTS tbl_timestamp
(
tbl_id BIGINT UNSIGNED PRIMARY KEY COMMENT 'uuid',
ts VARCHAR(17) COMMENT 'instant timestamp'
@@ -81,7 +81,7 @@
</update>
<update id="createInstant">
- CREATE TABLE instant
+ CREATE TABLE IF NOT EXISTS instant
(
instant_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT
'uuid',
tbl_id BIGINT COMMENT 'table id',
@@ -96,7 +96,7 @@
</update>
<update id="createInstantMetadata">
- CREATE TABLE instant_meta_data
+ CREATE TABLE IF NOT EXISTS instant_meta_data
(
commit_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT
'uuid',
tbl_id BIGINT COMMENT 'table id',
@@ -110,7 +110,7 @@
</update>
<update id="createFiles">
- CREATE TABLE files
+ CREATE TABLE IF NOT EXISTS files
(
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT
'uuid',
tbl_id BIGINT COMMENT 'table id',
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TableMapper.xml
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TableMapper.xml
index 130b9e3428f..b676c8eaad5 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TableMapper.xml
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TableMapper.xml
@@ -31,6 +31,14 @@
WHERE name=#{databaseName}
</select>
+ <delete id="deleteDB" parameterType="java.util.HashMap">
+ DELETE
+ FROM
+ dbs
+ WHERE
+ db_id = #{dbId}
+ </delete>
+
<!-- table related -->
<insert id="insertTable" parameterType="java.util.Map"
useGeneratedKeys="true" keyProperty="tbl_id">
INSERT INTO tbls (db_id, name, owner_name, location)
@@ -57,4 +65,12 @@
AND dbs.NAME = #{databaseName}
</select>
+ <delete id="deleteTable" parameterType="java.util.HashMap">
+ DELETE
+ FROM
+ tbls
+ WHERE
+ tbl_id = #{tableId}
+ </delete>
+
</mapper>
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TimelineMapper.xml
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TimelineMapper.xml
index db36a47d628..ba81fb6c5bb 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TimelineMapper.xml
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/main/resources/mybatis/TimelineMapper.xml
@@ -43,6 +43,14 @@
tbl_id = #{tableId}
</select>
+ <delete id="deleteTimestamp" parameterType="java.util.HashMap">
+ DELETE
+ FROM
+ tbl_timestamp
+ WHERE
+ tbl_id = #{tableId}
+ </delete>
+
<!-- instant related -->
<insert id="insertInstant" parameterType="java.util.HashMap"
useGeneratedKeys="true" keyProperty="instant_id">
INSERT INTO instant (tbl_id, action, ts, state, duration, start_ts)
diff --git
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/test/java/org/apache/hudi/metaserver/store/TestRelationalDBBasedStore.java
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/test/java/org/apache/hudi/metaserver/store/TestRelationalDBBasedStore.java
index 41944d46527..8f13498f41b 100644
---
a/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/test/java/org/apache/hudi/metaserver/store/TestRelationalDBBasedStore.java
+++
b/hudi-platform-service/hudi-metaserver/hudi-metaserver-server/src/test/java/org/apache/hudi/metaserver/store/TestRelationalDBBasedStore.java
@@ -25,6 +25,8 @@ import org.apache.hudi.metaserver.thrift.THoodieInstant;
import org.apache.hudi.metaserver.thrift.TState;
import org.apache.hudi.metaserver.thrift.Table;
import org.apache.thrift.TException;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
@@ -46,10 +48,14 @@ public class TestRelationalDBBasedStore {
private final String db = "test_db";
private final String tb = "test_tb";
- @Test
- public void testAPIs() throws TException {
+ @BeforeEach
+ public void setUp() {
HoodieMetaserver.getEmbeddedMetaserver();
store = HoodieMetaserver.getMetaserverStorage();
+ }
+
+ @Test
+ public void testAPIs() throws TException {
testTableRelatedAPIs();
testTimelineRelatedAPIs();
}
@@ -109,4 +115,13 @@ public class TestRelationalDBBasedStore {
assertFalse(store.getInstantMetadata(tableId, inflight).isPresent());
}
+ @AfterEach
+ public void tearDown() throws MetaserverStorageException {
+ Long tableId = store.getTableId(db, tb);
+ store.deleteTableTimestamp(tableId);
+ store.deleteTable(tableId);
+ Long dbId = store.getDatabaseId(db);
+ store.deleteDatabase(dbId);
+ }
+
}