From ff2497d999f830f31748fa0543fb05616a0fb8be Mon Sep 17 00:00:00 2001 From: The-Gamer-01 <58755323+The-Gamer-01@users.noreply.github.com> Date: Sat, 5 Nov 2022 00:44:21 +0800 Subject: [PATCH] [ISSUE #9449]Add Tenant Capacity mapper. (#9456) --- .../TenantCapacityPersistService.java | 86 +++++++++++------- .../derby/TenantCapacityMapperByDerby.java | 80 +++++++++++++++++ .../mysql/TenantCapacityMapperByMySql.java | 80 +++++++++++++++++ .../mapper/TenantCapacityMapper.java | 89 +++++++++++++++++++ ...baba.nacos.plugin.datasource.mapper.Mapper | 4 +- 5 files changed, 307 insertions(+), 32 deletions(-) create mode 100644 plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/derby/TenantCapacityMapperByDerby.java create mode 100644 plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/mysql/TenantCapacityMapperByMySql.java create mode 100644 plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/mapper/TenantCapacityMapper.java diff --git a/config/src/main/java/com/alibaba/nacos/config/server/service/capacity/TenantCapacityPersistService.java b/config/src/main/java/com/alibaba/nacos/config/server/service/capacity/TenantCapacityPersistService.java index 42b3b6f21..067ea5176 100644 --- a/config/src/main/java/com/alibaba/nacos/config/server/service/capacity/TenantCapacityPersistService.java +++ b/config/src/main/java/com/alibaba/nacos/config/server/service/capacity/TenantCapacityPersistService.java @@ -20,8 +20,11 @@ import com.alibaba.nacos.common.utils.CollectionUtils; import com.alibaba.nacos.config.server.model.capacity.TenantCapacity; import com.alibaba.nacos.config.server.service.datasource.DataSourceService; import com.alibaba.nacos.config.server.service.datasource.DynamicDataSource; -import com.alibaba.nacos.config.server.utils.PropertyUtil; import com.alibaba.nacos.config.server.utils.TimeUtils; +import com.alibaba.nacos.plugin.datasource.MapperManager; +import com.alibaba.nacos.plugin.datasource.constants.TableConstant; +import com.alibaba.nacos.plugin.datasource.mapper.TenantCapacityMapper; +import com.alibaba.nacos.sys.env.EnvUtil; import org.springframework.jdbc.CannotGetJdbcConnectionException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; @@ -35,6 +38,9 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import static com.alibaba.nacos.config.server.utils.LogUtil.FATAL_LOG; @@ -54,10 +60,23 @@ public class TenantCapacityPersistService { private DataSourceService dataSourceService; + private MapperManager mapperManager; + + private String dataSource; + + private static final String DATASOURCE_PLATFORM_PROPERTY = "spring.datasource.platform"; + + private static final String DEFAULT_DATASOURCE_PLATFORM = "derby"; + + /** + * init method. + */ @PostConstruct public void init() { this.dataSourceService = DynamicDataSource.getInstance().getDataSource(); this.jdbcTemplate = dataSourceService.getJdbcTemplate(); + this.mapperManager = MapperManager.instance(); + this.dataSource = EnvUtil.getProperty(DATASOURCE_PLATFORM_PROPERTY, DEFAULT_DATASOURCE_PLATFORM); } private static final class TenantCapacityRowMapper implements RowMapper { @@ -77,9 +96,9 @@ public class TenantCapacityPersistService { } public TenantCapacity getTenantCapacity(String tenantId) { - String sql = - "SELECT id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, tenant_id FROM tenant_capacity " - + "WHERE tenant_id=?"; + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.select(Arrays.asList("id", "quota", "`usage`", + "`max_size`", "max_aggr_count", "max_aggr_size", "tenant_id"), Collections.singletonList("tenant_id")); List list = jdbcTemplate.query(sql, new Object[] {tenantId}, TENANT_CAPACITY_ROW_MAPPER); if (list.isEmpty()) { return null; @@ -94,9 +113,8 @@ public class TenantCapacityPersistService { * @return operate result. */ public boolean insertTenantCapacity(final TenantCapacity tenantCapacity) { - final String sql = - "INSERT INTO tenant_capacity (tenant_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, " - + "gmt_create, gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE tenant_id=?;"; + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + final String sql = tenantCapacityMapper.insertTenantCapacity(); try { GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder(); PreparedStatementCreator preparedStatementCreator = connection -> { @@ -128,9 +146,9 @@ public class TenantCapacityPersistService { * @return operate result. */ public boolean incrementUsageWithDefaultQuotaLimit(TenantCapacity tenantCapacity) { - String sql = - "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` <" - + " ? AND quota = 0"; + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.incrementUsageWithDefaultQuotaLimit(); + try { int affectRow = jdbcTemplate.update(sql, tenantCapacity.getGmtModified(), tenantCapacity.getTenant(), tenantCapacity.getQuota()); @@ -148,9 +166,8 @@ public class TenantCapacityPersistService { * @return operate result. */ public boolean incrementUsageWithQuotaLimit(TenantCapacity tenantCapacity) { - String sql = - "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < " - + "quota AND quota != 0"; + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.incrementUsageWithQuotaLimit(); try { return jdbcTemplate.update(sql, tenantCapacity.getGmtModified(), tenantCapacity.getTenant()) == 1; } catch (CannotGetJdbcConnectionException e) { @@ -167,7 +184,8 @@ public class TenantCapacityPersistService { * @return operate result. */ public boolean incrementUsage(TenantCapacity tenantCapacity) { - String sql = "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ?"; + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.incrementUsage(); try { int affectRow = jdbcTemplate.update(sql, tenantCapacity.getGmtModified(), tenantCapacity.getTenant()); return affectRow == 1; @@ -184,7 +202,8 @@ public class TenantCapacityPersistService { * @return operate result. */ public boolean decrementUsage(TenantCapacity tenantCapacity) { - String sql = "UPDATE tenant_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` > 0"; + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.decrementUsage(); try { return jdbcTemplate.update(sql, tenantCapacity.getGmtModified(), tenantCapacity.getTenant()) == 1; } catch (CannotGetJdbcConnectionException e) { @@ -206,30 +225,36 @@ public class TenantCapacityPersistService { public boolean updateTenantCapacity(String tenant, Integer quota, Integer maxSize, Integer maxAggrCount, Integer maxAggrSize) { List argList = CollectionUtils.list(); - StringBuilder sql = new StringBuilder("UPDATE tenant_capacity SET"); + + List columns = new ArrayList<>(); if (quota != null) { - sql.append(" quota = ?,"); + columns.add("quota"); argList.add(quota); } if (maxSize != null) { - sql.append(" max_size = ?,"); + columns.add("max_size"); argList.add(maxSize); } if (maxAggrCount != null) { - sql.append(" max_aggr_count = ?,"); + columns.add("max_aggr_count"); argList.add(maxAggrCount); } if (maxAggrSize != null) { - sql.append(" max_aggr_size = ?,"); + columns.add("max_aggr_size"); argList.add(maxAggrSize); } - sql.append(" gmt_modified = ?"); + columns.add("gmt_modified"); argList.add(TimeUtils.getCurrentTime()); - sql.append(" WHERE tenant_id = ?"); + List where = new ArrayList<>(); + where.add("tenant_id"); + argList.add(tenant); + + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.update(columns, where); try { - return jdbcTemplate.update(sql.toString(), argList.toArray()) == 1; + return jdbcTemplate.update(sql, argList.toArray()) == 1; } catch (CannotGetJdbcConnectionException e) { FATAL_LOG.error("[db-error]", e); throw e; @@ -248,8 +273,8 @@ public class TenantCapacityPersistService { * @return operate result. */ public boolean correctUsage(String tenant, Timestamp gmtModified) { - String sql = "UPDATE tenant_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE tenant_id = ?), " - + "gmt_modified = ? WHERE tenant_id = ?"; + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.correctUsage(); try { return jdbcTemplate.update(sql, tenant, gmtModified, tenant) == 1; } catch (CannotGetJdbcConnectionException e) { @@ -266,11 +291,8 @@ public class TenantCapacityPersistService { * @return TenantCapacity List. */ public List getCapacityList4CorrectUsage(long lastId, int pageSize) { - String sql = "SELECT id, tenant_id FROM tenant_capacity WHERE id>? LIMIT ?"; - - if (PropertyUtil.isEmbeddedStorage()) { - sql = "SELECT id, tenant_id FROM tenant_capacity WHERE id>? OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY"; - } + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, TableConstant.TENANT_CAPACITY); + String sql = tenantCapacityMapper.getCapacityList4CorrectUsage(); try { return jdbcTemplate.query(sql, new Object[] {lastId, pageSize}, new RowMapper() { @@ -296,9 +318,11 @@ public class TenantCapacityPersistService { */ public boolean deleteTenantCapacity(final String tenant) { try { + TenantCapacityMapper tenantCapacityMapper = mapperManager.findMapper(dataSource, + TableConstant.TENANT_CAPACITY); PreparedStatementCreator preparedStatementCreator = connection -> { PreparedStatement ps = connection - .prepareStatement("DELETE FROM tenant_capacity WHERE tenant_id = ?;"); + .prepareStatement(tenantCapacityMapper.delete(Collections.singletonList("tenant_id"))); ps.setString(1, tenant); return ps; }; diff --git a/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/derby/TenantCapacityMapperByDerby.java b/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/derby/TenantCapacityMapperByDerby.java new file mode 100644 index 000000000..67df4e085 --- /dev/null +++ b/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/derby/TenantCapacityMapperByDerby.java @@ -0,0 +1,80 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.nacos.plugin.datasource.impl.derby; + +import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; +import com.alibaba.nacos.plugin.datasource.constants.TableConstant; +import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; +import com.alibaba.nacos.plugin.datasource.mapper.TenantCapacityMapper; + +/** + * The derby implementation of TenantCapacityMapper. + * + * @author hyx + **/ + +public class TenantCapacityMapperByDerby extends AbstractMapper implements TenantCapacityMapper { + + @Override + public String getTableName() { + return TableConstant.TENANT_CAPACITY; + } + + @Override + public String getDataSource() { + return DataSourceConstant.DERBY; + } + + @Override + public String incrementUsageWithDefaultQuotaLimit() { + return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` <" + + " ? AND quota = 0"; + } + + @Override + public String incrementUsageWithQuotaLimit() { + return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < " + + "quota AND quota != 0"; + } + + @Override + public String incrementUsage() { + return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ?"; + } + + @Override + public String decrementUsage() { + return "UPDATE tenant_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` > 0"; + } + + @Override + public String correctUsage() { + return "UPDATE tenant_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE tenant_id = ?), " + + "gmt_modified = ? WHERE tenant_id = ?"; + } + + @Override + public String getCapacityList4CorrectUsage() { + return "SELECT id, tenant_id FROM tenant_capacity WHERE id>? OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY"; + } + + @Override + public String insertTenantCapacity() { + return "INSERT INTO tenant_capacity (tenant_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, " + + "gmt_create, gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE tenant_id=?;"; + } +} diff --git a/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/mysql/TenantCapacityMapperByMySql.java b/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/mysql/TenantCapacityMapperByMySql.java new file mode 100644 index 000000000..be9a6c00d --- /dev/null +++ b/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/mysql/TenantCapacityMapperByMySql.java @@ -0,0 +1,80 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.nacos.plugin.datasource.impl.mysql; + +import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; +import com.alibaba.nacos.plugin.datasource.constants.TableConstant; +import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; +import com.alibaba.nacos.plugin.datasource.mapper.TenantCapacityMapper; + +/** + * The mysql implementation of TenantCapacityMapper. + * + * @author hyx + **/ + +public class TenantCapacityMapperByMySql extends AbstractMapper implements TenantCapacityMapper { + + @Override + public String getTableName() { + return TableConstant.TENANT_CAPACITY; + } + + @Override + public String getDataSource() { + return DataSourceConstant.MYSQL; + } + + @Override + public String incrementUsageWithDefaultQuotaLimit() { + return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` <" + + " ? AND quota = 0"; + } + + @Override + public String incrementUsageWithQuotaLimit() { + return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < " + + "quota AND quota != 0"; + } + + @Override + public String incrementUsage() { + return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ?"; + } + + @Override + public String decrementUsage() { + return "UPDATE tenant_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` > 0"; + } + + @Override + public String correctUsage() { + return "UPDATE tenant_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE tenant_id = ?), " + + "gmt_modified = ? WHERE tenant_id = ?"; + } + + @Override + public String getCapacityList4CorrectUsage() { + return "SELECT id, tenant_id FROM tenant_capacity WHERE id>? LIMIT ?"; + } + + @Override + public String insertTenantCapacity() { + return "INSERT INTO tenant_capacity (tenant_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, " + + "gmt_create, gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE tenant_id=?;"; + } +} diff --git a/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/mapper/TenantCapacityMapper.java b/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/mapper/TenantCapacityMapper.java new file mode 100644 index 000000000..c6f6c234f --- /dev/null +++ b/plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/mapper/TenantCapacityMapper.java @@ -0,0 +1,89 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.nacos.plugin.datasource.mapper; + +/** + * The tenant capacity info mapper. + * + * @author hyx + **/ + +public interface TenantCapacityMapper extends Mapper { + + /** + * Increment UsageWithDefaultQuotaLimit. + * The default sql: + * UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < ? AND quota = 0 + * + * @return The sql of increment UsageWithDefaultQuotaLimit. + */ + String incrementUsageWithDefaultQuotaLimit(); + + /** + * Increment UsageWithQuotaLimit. + * The default sql: + * UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < quota AND quota != 0 + * + * @return The sql of Increment UsageWithQuotaLimit. + */ + String incrementUsageWithQuotaLimit(); + + /** + * Increment Usage. + * The default sql: + * UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? + * + * @return The sql of increment UsageWithQuotaLimit. + */ + String incrementUsage(); + + /** + * DecrementUsage. + * The default sql: + * UPDATE tenant_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` > 0 + * + * @return The sql of decrementUsage. + */ + String decrementUsage(); + + /** + * Correct Usage. + * The default sql: + * UPDATE tenant_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE tenant_id = ?), gmt_modified = ? WHERE tenant_id = ? + * + * @return The sql of correcting Usage. + */ + String correctUsage(); + + /** + * Get TenantCapacity List, only including id and tenantId value. + * The default sql: + * SELECT id, tenant_id FROM tenant_capacity WHERE id>? LIMIT ? + * + * @return The sql of getting TenantCapacity List, only including id and tenantId value. + */ + String getCapacityList4CorrectUsage(); + + /** + * Insert TenantCapacity. + * The default sql: + * INSERT INTO tenant_capacity (tenant_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, + * gmt_create, gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE tenant_id=?; + * @return The sql of inserting TenantCapacity. + */ + String insertTenantCapacity(); +} diff --git a/plugin/datasource/src/main/resources/META-INF/services/com.alibaba.nacos.plugin.datasource.mapper.Mapper b/plugin/datasource/src/main/resources/META-INF/services/com.alibaba.nacos.plugin.datasource.mapper.Mapper index f8d759444..efe4eb51e 100644 --- a/plugin/datasource/src/main/resources/META-INF/services/com.alibaba.nacos.plugin.datasource.mapper.Mapper +++ b/plugin/datasource/src/main/resources/META-INF/services/com.alibaba.nacos.plugin.datasource.mapper.Mapper @@ -21,6 +21,7 @@ com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoTagMapperByMySql com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigTagsRelationMapperByMySql com.alibaba.nacos.plugin.datasource.impl.mysql.HistoryConfigInfoMapperByMySql com.alibaba.nacos.plugin.datasource.impl.mysql.TenantInfoMapperByMySql +com.alibaba.nacos.plugin.datasource.impl.mysql.TenantCapacityMapperByMySql com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoAggrMapperByDerby com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoBetaMapperByDerby @@ -28,4 +29,5 @@ com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoMapperByDerby com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagMapperByDerby com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagsRelationMapperByDerby com.alibaba.nacos.plugin.datasource.impl.derby.HistoryConfigInfoMapperByDerby -com.alibaba.nacos.plugin.datasource.impl.derby.TenantInfoMapperByDerby \ No newline at end of file +com.alibaba.nacos.plugin.datasource.impl.derby.TenantInfoMapperByDerby +com.alibaba.nacos.plugin.datasource.impl.derby.TenantCapacityMapperByDerby \ No newline at end of file