Commit 0ad85ca8 authored by terrymanu's avatar terrymanu
Browse files

remove metadata when drop table for proxy

parent c638623b
Loading
Loading
Loading
Loading
+39 −10
Original line number Diff line number Diff line
@@ -18,6 +18,13 @@
package io.shardingsphere.shardingproxy.backend;

import com.google.common.base.Optional;
import io.shardingsphere.core.metadata.table.TableMetaData;
import io.shardingsphere.core.metadata.table.TableMetaDataFactory;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.AlterTableStatement;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.CreateTableStatement;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.DropTableStatement;
import io.shardingsphere.core.parsing.parser.sql.SQLStatement;
import io.shardingsphere.shardingproxy.runtime.schema.LogicSchema;
import io.shardingsphere.shardingproxy.transport.mysql.constant.ServerErrorCode;
import io.shardingsphere.shardingproxy.transport.mysql.packet.command.CommandResponsePackets;
import io.shardingsphere.shardingproxy.transport.mysql.packet.generic.ErrPacket;
@@ -70,23 +77,45 @@ public abstract class AbstractBackendHandler implements BackendHandler {
        return Optional.absent();
    }
    
    /**
     * default next implement for adapter .
     *
     * @return false
     */
    @Override
    public boolean next() throws SQLException {
        return false;
    }
    
    /**
     * default {@code getResultValue} implement for adapter.
     *
     * @return result packet
     */
    @Override
    public ResultPacket getResultValue() throws SQLException {
        return null;
    }
    
    protected final void refreshTableMetaData(final LogicSchema logicSchema, final SQLStatement sqlStatement) {
        if (sqlStatement instanceof CreateTableStatement) {
            refreshTableMetaData(logicSchema, (CreateTableStatement) sqlStatement);
        } else if (sqlStatement instanceof AlterTableStatement) {
            refreshTableMetaData(logicSchema, (AlterTableStatement) sqlStatement);
        } else if (sqlStatement instanceof DropTableStatement) {
            refreshTableMetaData(logicSchema, (DropTableStatement) sqlStatement);
        }
    }
    
    private void refreshTableMetaData(final LogicSchema logicSchema, final CreateTableStatement createTableStatement) {
        logicSchema.getMetaData().getTable().put(createTableStatement.getTables().getSingleTableName(), TableMetaDataFactory.newInstance(createTableStatement));
    }
    
    private void refreshTableMetaData(final LogicSchema logicSchema, final AlterTableStatement alterTableStatement) {
        String logicTableName = alterTableStatement.getTables().getSingleTableName();
        TableMetaData newTableMetaData = TableMetaDataFactory.newInstance(alterTableStatement, logicSchema.getMetaData().getTable().get(logicTableName));
        Optional<String> newTableName = alterTableStatement.getNewTableName();
        if (newTableName.isPresent()) {
            logicSchema.getMetaData().getTable().put(newTableName.get(), newTableMetaData);
            logicSchema.getMetaData().getTable().remove(logicTableName);
        } else {
            logicSchema.getMetaData().getTable().put(logicTableName, newTableMetaData);
        }
    }
    
    private void refreshTableMetaData(final LogicSchema logicSchema, final DropTableStatement dropTableStatement) {
        for (String each : dropTableStatement.getTables().getTableNames()) {
            logicSchema.getMetaData().getTable().remove(each);
        }
    }
}
+2 −36
Original line number Diff line number Diff line
@@ -17,26 +17,17 @@

package io.shardingsphere.shardingproxy.backend.jdbc;

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import io.shardingsphere.api.config.rule.ShardingRuleConfiguration;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.constant.SQLType;
import io.shardingsphere.core.constant.properties.ShardingPropertiesConstant;
import io.shardingsphere.core.merger.MergeEngineFactory;
import io.shardingsphere.core.merger.MergedResult;
import io.shardingsphere.core.merger.dal.show.ShowTablesMergedResult;
import io.shardingsphere.core.metadata.table.ColumnMetaData;
import io.shardingsphere.core.metadata.table.TableMetaData;
import io.shardingsphere.core.metadata.table.executor.TableMetaDataLoader;
import io.shardingsphere.core.parsing.antlr.sql.segment.definition.column.ColumnDefinitionSegment;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.CreateTableStatement;
import io.shardingsphere.core.parsing.parser.constant.DerivedColumn;
import io.shardingsphere.core.parsing.parser.sql.SQLStatement;
import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.core.rule.ShardingRule;
import io.shardingsphere.shardingproxy.backend.AbstractBackendHandler;
import io.shardingsphere.shardingproxy.backend.BackendExecutorContext;
import io.shardingsphere.shardingproxy.backend.ResultPacket;
import io.shardingsphere.shardingproxy.backend.jdbc.connection.BackendConnection;
import io.shardingsphere.shardingproxy.backend.jdbc.connection.ConnectionStatus;
@@ -44,8 +35,6 @@ import io.shardingsphere.shardingproxy.backend.jdbc.execute.JDBCExecuteEngine;
import io.shardingsphere.shardingproxy.backend.jdbc.execute.response.ExecuteQueryResponse;
import io.shardingsphere.shardingproxy.backend.jdbc.execute.response.ExecuteResponse;
import io.shardingsphere.shardingproxy.backend.jdbc.execute.response.ExecuteUpdateResponse;
import io.shardingsphere.shardingproxy.runtime.GlobalRegistry;
import io.shardingsphere.shardingproxy.runtime.metadata.ProxyTableMetaDataConnectionManager;
import io.shardingsphere.shardingproxy.runtime.schema.LogicSchema;
import io.shardingsphere.shardingproxy.runtime.schema.ShardingSchema;
import io.shardingsphere.shardingproxy.transport.mysql.constant.ServerErrorCode;
@@ -74,8 +63,6 @@ import java.util.List;
@RequiredArgsConstructor
public final class JDBCBackendHandler extends AbstractBackendHandler {
    
    private static final GlobalRegistry GLOBAL_REGISTRY = GlobalRegistry.getInstance();
    
    private final LogicSchema logicSchema;
    
    private final String sql;
@@ -105,33 +92,12 @@ public final class JDBCBackendHandler extends AbstractBackendHandler {
                    ServerErrorCode.ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE, sqlStatement.getTables().isSingleTable() ? sqlStatement.getTables().getSingleTableName() : "unknown_table"));
        }
        executeResponse = executeEngine.execute(routeResult);
        if (logicSchema instanceof ShardingSchema && SQLType.DDL == sqlStatement.getType() && !sqlStatement.getTables().isEmpty()) {
            String logicTableName = sqlStatement.getTables().getSingleTableName();
            if (routeResult.getSqlStatement() instanceof CreateTableStatement) {
                createTable(logicTableName, logicSchema, (CreateTableStatement) routeResult.getSqlStatement());
            }else {
                // TODO refresh table meta data by SQL parse result
                TableMetaDataLoader tableMetaDataLoader = new TableMetaDataLoader(logicSchema.getMetaData().getDataSource(), BackendExecutorContext.getInstance().getExecuteEngine(),
                        new ProxyTableMetaDataConnectionManager(logicSchema.getBackendDataSource()), 
                        GLOBAL_REGISTRY.getShardingProperties().<Integer>getValue(ShardingPropertiesConstant.MAX_CONNECTIONS_SIZE_PER_QUERY),
                        GLOBAL_REGISTRY.getShardingProperties().<Boolean>getValue(ShardingPropertiesConstant.CHECK_TABLE_METADATA_ENABLED));
                logicSchema.getMetaData().getTable().put(logicTableName, tableMetaDataLoader.load(logicTableName, ((ShardingSchema) logicSchema).getShardingRule()));
            }
        if (logicSchema instanceof ShardingSchema) {
            refreshTableMetaData(logicSchema, routeResult.getSqlStatement());
        }
        return merge(sqlStatement);
    }
    
    private void createTable(final String logicTableName, final LogicSchema logicSchema, final CreateTableStatement createTableStatement) {
        TableMetaData tableMetaData = new TableMetaData(Lists.transform(createTableStatement.getColumnDefinitions(), new Function<ColumnDefinitionSegment, ColumnMetaData>() {
            
            @Override
            public ColumnMetaData apply(final ColumnDefinitionSegment input) {
                return new ColumnMetaData(input.getColumnName(), input.getDataType(), input.isPrimaryKey());
            }
        }));
        logicSchema.getMetaData().getTable().put(logicTableName, tableMetaData);
    }
    
    private boolean isUnsupportedXA(final SQLType sqlType) {
        BackendConnection connection = executeEngine.getBackendConnection();
        return TransactionType.XA == connection.getTransactionType() && SQLType.DDL == sqlType && ConnectionStatus.TRANSACTION == connection.getStateHandler().getStatus();
+3 −18
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import io.shardingsphere.core.constant.properties.ShardingPropertiesConstant;
import io.shardingsphere.core.merger.MergeEngineFactory;
import io.shardingsphere.core.merger.MergedResult;
import io.shardingsphere.core.merger.QueryResult;
import io.shardingsphere.core.metadata.table.executor.TableMetaDataLoader;
import io.shardingsphere.core.parsing.SQLJudgeEngine;
import io.shardingsphere.core.parsing.parser.sql.SQLStatement;
import io.shardingsphere.core.routing.RouteUnit;
@@ -33,7 +32,6 @@ import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.core.routing.StatementRoutingEngine;
import io.shardingsphere.core.routing.router.masterslave.MasterSlaveRouter;
import io.shardingsphere.shardingproxy.backend.AbstractBackendHandler;
import io.shardingsphere.shardingproxy.backend.BackendExecutorContext;
import io.shardingsphere.shardingproxy.backend.ResultPacket;
import io.shardingsphere.shardingproxy.backend.netty.client.BackendNettyClientManager;
import io.shardingsphere.shardingproxy.backend.netty.client.response.mysql.MySQLQueryResult;
@@ -41,7 +39,6 @@ import io.shardingsphere.shardingproxy.backend.netty.future.FutureRegistry;
import io.shardingsphere.shardingproxy.backend.netty.future.SynchronizedFuture;
import io.shardingsphere.shardingproxy.runtime.ChannelRegistry;
import io.shardingsphere.shardingproxy.runtime.GlobalRegistry;
import io.shardingsphere.shardingproxy.runtime.metadata.ProxyTableMetaDataConnectionManager;
import io.shardingsphere.shardingproxy.runtime.schema.LogicSchema;
import io.shardingsphere.shardingproxy.runtime.schema.MasterSlaveSchema;
import io.shardingsphere.shardingproxy.runtime.schema.ShardingSchema;
@@ -102,7 +99,7 @@ public final class NettyBackendHandler extends AbstractBackendHandler {
    private MergedResult mergedResult;
    
    @Override
    protected CommandResponsePackets execute0() throws InterruptedException, ExecutionException, TimeoutException, SQLException {
    protected CommandResponsePackets execute0() throws InterruptedException, ExecutionException, TimeoutException {
        return logicSchema instanceof MasterSlaveSchema ? executeForMasterSlave() : executeForSharding();
    }
    
@@ -122,7 +119,7 @@ public final class NettyBackendHandler extends AbstractBackendHandler {
        return merge(new SQLJudgeEngine(sql).judge(), packets, queryResults);
    }
    
    private CommandResponsePackets executeForSharding() throws InterruptedException, ExecutionException, TimeoutException, SQLException {
    private CommandResponsePackets executeForSharding() throws InterruptedException, ExecutionException, TimeoutException {
        StatementRoutingEngine routingEngine = new StatementRoutingEngine(
                ((ShardingSchema) logicSchema).getShardingRule(), logicSchema.getMetaData().getTable(), databaseType,
                GLOBAL_REGISTRY.getShardingProperties().<Boolean>getValue(ShardingPropertiesConstant.SQL_SHOW), logicSchema.getMetaData().getDataSource());
@@ -151,9 +148,7 @@ public final class NettyBackendHandler extends AbstractBackendHandler {
        }
        SQLStatement sqlStatement = routeResult.getSqlStatement();
        CommandResponsePackets result = merge(sqlStatement, packets, queryResults);
        if (SQLType.DDL == sqlStatement.getType() && !sqlStatement.getTables().isEmpty()) {
            refreshTableMetaData(sqlStatement.getTables().getSingleTableName());
        }
        refreshTableMetaData(logicSchema, sqlStatement);
        return result;
    }
    
@@ -212,16 +207,6 @@ public final class NettyBackendHandler extends AbstractBackendHandler {
        return packets.get(0);
    }
    
    // TODO :jiaqi use sql packet to refresh meta data
    // TODO refresh table meta data by SQL parse result
    private void refreshTableMetaData(final String logicTableName) throws SQLException {
        TableMetaDataLoader tableMetaDataLoader = new TableMetaDataLoader(
                logicSchema.getMetaData().getDataSource(), BackendExecutorContext.getInstance().getExecuteEngine(), new ProxyTableMetaDataConnectionManager(logicSchema.getBackendDataSource()), 
                GLOBAL_REGISTRY.getShardingProperties().<Integer>getValue(ShardingPropertiesConstant.MAX_CONNECTIONS_SIZE_PER_QUERY), 
                GLOBAL_REGISTRY.getShardingProperties().<Boolean>getValue(ShardingPropertiesConstant.CHECK_TABLE_METADATA_ENABLED));
        logicSchema.getMetaData().getTable().put(logicTableName, tableMetaDataLoader.load(logicTableName, ((ShardingSchema) logicSchema).getShardingRule()));
    }
    
    @Override
    public boolean next() throws SQLException {
        if (null == mergedResult || !mergedResult.next()) {