This is an automated email from the ASF dual-hosted git repository.
menghaoran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 57841557119 Optimize param check in refresh table meta data executor
(#34209)
57841557119 is described below
commit 57841557119e3a54fc1561241453feb3fb15c6af
Author: Raigor <[email protected]>
AuthorDate: Mon Dec 30 19:43:23 2024 +0800
Optimize param check in refresh table meta data executor (#34209)
---
.../updatable/RefreshTableMetaDataExecutor.java | 29 ++++++++--
.../distsql/DistSQLUpdateBackendHandlerTest.java | 65 ++++++++++++++++++----
2 files changed, 77 insertions(+), 17 deletions(-)
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
index 2d0ecfd4159..c94dc4e7a03 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
@@ -19,12 +19,14 @@ package
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
import lombok.Setter;
import
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorDatabaseAware;
-import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
-import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.RefreshTableMetaDataStatement;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -43,8 +45,8 @@ public final class RefreshTableMetaDataExecutor implements
DistSQLUpdateExecutor
@Override
public void executeUpdate(final RefreshTableMetaDataStatement
sqlStatement, final ContextManager contextManager) throws SQLException {
- checkStorageUnit(contextManager.getStorageUnits(database.getName()),
sqlStatement);
String schemaName = getSchemaName(sqlStatement);
+ checkBeforeUpdate(sqlStatement, schemaName);
if (sqlStatement.getStorageUnitName().isPresent()) {
if (sqlStatement.getTableName().isPresent()) {
contextManager.reloadTable(database, schemaName,
sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get());
@@ -60,6 +62,16 @@ public final class RefreshTableMetaDataExecutor implements
DistSQLUpdateExecutor
}
}
+ private String getSchemaName(final RefreshTableMetaDataStatement
sqlStatement) {
+ return sqlStatement.getSchemaName().isPresent() ?
sqlStatement.getSchemaName().get() : new
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName());
+ }
+
+ private void checkBeforeUpdate(final RefreshTableMetaDataStatement
sqlStatement, final String schemaName) {
+ checkStorageUnit(database.getResourceMetaData().getStorageUnits(),
sqlStatement);
+ checkSchema(schemaName);
+ checkTable(sqlStatement, schemaName);
+ }
+
private void checkStorageUnit(final Map<String, StorageUnit> storageUnits,
final RefreshTableMetaDataStatement sqlStatement) {
ShardingSpherePreconditions.checkNotEmpty(storageUnits, () -> new
EmptyStorageUnitException(database.getName()));
if (sqlStatement.getStorageUnitName().isPresent()) {
@@ -68,8 +80,15 @@ public final class RefreshTableMetaDataExecutor implements
DistSQLUpdateExecutor
}
}
- private String getSchemaName(final RefreshTableMetaDataStatement
sqlStatement) {
- return sqlStatement.getSchemaName().isPresent() ?
sqlStatement.getSchemaName().get() : new
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName());
+ private void checkSchema(final String schemaName) {
+
ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), ()
-> new SchemaNotFoundException(schemaName));
+ }
+
+ private void checkTable(final RefreshTableMetaDataStatement sqlStatement,
final String schemaName) {
+ if (sqlStatement.getTableName().isPresent()) {
+ String tableName = sqlStatement.getTableName().get();
+
ShardingSpherePreconditions.checkState(database.getSchema(schemaName).containsTable(tableName),
() -> new TableNotFoundException(tableName));
+ }
}
@Override
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java
index 0e6a9d9bb36..e22e7a1a619 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java
@@ -19,9 +19,14 @@ package
org.apache.shardingsphere.proxy.backend.handler.distsql;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.RefreshTableMetaDataStatement;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -30,8 +35,11 @@ import
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResp
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.test.mock.AutoMockExtension;
import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
import java.sql.SQLException;
import java.util.Collections;
@@ -39,7 +47,7 @@ import java.util.Collections;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -49,29 +57,62 @@ class DistSQLUpdateBackendHandlerTest {
private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
- @Test
- void assertEmptyResource() {
- ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private ContextManager contextManager;
+
+ @BeforeEach
+ void setUp() {
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-
when(contextManager.getStorageUnits("foo_db")).thenReturn(Collections.emptyMap());
- when(contextManager.getDatabase("foo_db")).thenReturn(new
ShardingSphereDatabase("foo_db", mock(), mock(), mock(),
Collections.emptyList()));
+ }
+
+ @Test
+ void assertEmptyStorageUnit() {
+ when(contextManager.getDatabase("foo_db")).thenReturn(new
ShardingSphereDatabase("foo_db", databaseType, mock(), mock(),
Collections.emptyList()));
DistSQLUpdateBackendHandler backendHandler = new
DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement(),
mockConnectionSession("foo_db"));
assertThrows(EmptyStorageUnitException.class, backendHandler::execute);
}
@Test
- void assertMissingRequiredResources() {
- ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ void assertMissingRequiredStorageUnit() {
+ ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
mock(StorageUnit.class)));
+ when(contextManager.getDatabase("foo_db")).thenReturn(new
ShardingSphereDatabase("foo_db", databaseType, resourceMetaData, mock(),
Collections.emptyList()));
DistSQLUpdateBackendHandler backendHandler = new
DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement("t_order",
"ds_1", null), mockConnectionSession("foo_db"));
assertThrows(MissingRequiredStorageUnitsException.class,
backendHandler::execute);
}
+ @Test
+ void assertSchemaNotFound() {
+ ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
mock(StorageUnit.class)));
+ when(contextManager.getDatabase("foo_db")).thenReturn(new
ShardingSphereDatabase("foo_db", databaseType, resourceMetaData, mock(),
Collections.emptyList()));
+ DistSQLUpdateBackendHandler backendHandler = new
DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement("t_order",
"ds_0", "bar_db"), mockConnectionSession("foo_db"));
+ assertThrows(SchemaNotFoundException.class, backendHandler::execute);
+ }
+
+ @Test
+ void assertTableNotFound() {
+ ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
mock(StorageUnit.class)));
+ ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ when(database.containsSchema("foo_db")).thenReturn(true);
+ when(database.getSchema("foo_db")).thenReturn(schema);
+ when(database.getResourceMetaData()).thenReturn(resourceMetaData);
+ when(contextManager.getDatabase("foo_db")).thenReturn(database);
+ DistSQLUpdateBackendHandler backendHandler = new
DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement("t_order",
"ds_0", "foo_db"), mockConnectionSession("foo_db"));
+ assertThrows(TableNotFoundException.class, backendHandler::execute);
+ }
+
@Test
void assertUpdate() throws SQLException {
- ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
- when(contextManager.getDatabase("foo_db")).thenReturn(new
ShardingSphereDatabase("foo_db", databaseType, mock(), mock(),
Collections.emptyList()));
+ ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
mock(StorageUnit.class)));
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ when(database.containsSchema(any())).thenReturn(true);
+ when(database.getProtocolType()).thenReturn(databaseType);
+ when(database.getResourceMetaData()).thenReturn(resourceMetaData);
+ when(contextManager.getDatabase("foo_db")).thenReturn(database);
ResponseHeader actual = new DistSQLUpdateBackendHandler(new
RefreshTableMetaDataStatement(), mockConnectionSession("foo_db")).execute();
assertThat(actual, instanceOf(UpdateResponseHeader.class));
}