未验证 提交 b2d8d5d8 编写于 作者: L Liang Zhang 提交者: GitHub

Move StateMachine into infra module (#8186)

* Move RuntimeStateType to infra module

* Update javadoc

* Rename StateType

* Move StateMachine into infra module

* Add StateMachineTest
上级 f232469e
/*
* 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.shardingsphere.infra.state;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.concurrent.atomic.AtomicReference;
/**
* State machine.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class StateMachine {
private static final AtomicReference<StateType> CURRENT_STATE = new AtomicReference<>(StateType.OK);
/**
* Switch state.
*
* @param type state type
*/
public static void switchState(final StateType type) {
CURRENT_STATE.set(type);
}
/**
* Get current state.
*
* @return current state
*/
public static StateType getCurrentState() {
return CURRENT_STATE.get();
}
}
......@@ -15,12 +15,12 @@
* limitations under the License.
*/
package org.apache.shardingsphere.proxy.frontend.state;
package org.apache.shardingsphere.infra.state;
/**
* Proxy state type.
* State type.
*/
public enum ProxyStateType {
public enum StateType {
OK, LOCK, CIRCUIT_BREAK
}
/*
* 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.shardingsphere.infra.state;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public final class StateMachineTest {
private StateType originalStateType;
@Before
public void setUp() {
originalStateType = StateMachine.getCurrentState();
}
@After
public void tearDown() {
StateMachine.switchState(originalStateType);
}
@Test
public void assertSwitchState() {
StateMachine.switchState(StateType.CIRCUIT_BREAK);
assertThat(StateMachine.getCurrentState(), is(StateType.CIRCUIT_BREAK));
}
}
......@@ -20,6 +20,8 @@ package org.apache.shardingsphere.proxy.frontend.state;
import io.netty.channel.ChannelHandlerContext;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.state.StateMachine;
import org.apache.shardingsphere.infra.state.StateType;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine;
import org.apache.shardingsphere.proxy.frontend.state.impl.CircuitBreakProxyState;
......@@ -28,7 +30,6 @@ import org.apache.shardingsphere.proxy.frontend.state.impl.OKProxyState;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;
/**
* Proxy state machine.
......@@ -36,15 +37,12 @@ import java.util.concurrent.atomic.AtomicReference;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ProxyStateMachine {
private static final Map<ProxyStateType, ProxyState> PROXY_STATE_MAP = new ConcurrentHashMap<>(3, 1);
private static final AtomicReference<ProxyState> CURRENT_STATE = new AtomicReference<>();
private static final Map<StateType, ProxyState> PROXY_STATE_MAP = new ConcurrentHashMap<>(3, 1);
static {
PROXY_STATE_MAP.put(ProxyStateType.OK, new OKProxyState());
PROXY_STATE_MAP.put(ProxyStateType.LOCK, new LockProxyState());
PROXY_STATE_MAP.put(ProxyStateType.CIRCUIT_BREAK, new CircuitBreakProxyState());
CURRENT_STATE.set(PROXY_STATE_MAP.get(ProxyStateType.OK));
PROXY_STATE_MAP.put(StateType.OK, new OKProxyState());
PROXY_STATE_MAP.put(StateType.LOCK, new LockProxyState());
PROXY_STATE_MAP.put(StateType.CIRCUIT_BREAK, new CircuitBreakProxyState());
}
/**
......@@ -57,15 +55,6 @@ public final class ProxyStateMachine {
*/
public static void execute(final ChannelHandlerContext context, final Object message,
final DatabaseProtocolFrontendEngine databaseProtocolFrontendEngine, final BackendConnection backendConnection) {
CURRENT_STATE.get().execute(context, message, databaseProtocolFrontendEngine, backendConnection);
}
/**
* Switch proxy state.
*
* @param type proxy state type
*/
public static void switchState(final ProxyStateType type) {
CURRENT_STATE.set(PROXY_STATE_MAP.get(type));
PROXY_STATE_MAP.get(StateMachine.getCurrentState()).execute(context, message, databaseProtocolFrontendEngine, backendConnection);
}
}
......@@ -22,12 +22,12 @@ import io.netty.channel.ChannelHandlerContext;
import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
import org.apache.shardingsphere.governance.core.event.GovernanceEventBus;
import org.apache.shardingsphere.governance.core.registry.event.CircuitStateChangedEvent;
import org.apache.shardingsphere.infra.state.StateMachine;
import org.apache.shardingsphere.infra.state.StateType;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.exception.CircuitBreakException;
import org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine;
import org.apache.shardingsphere.proxy.frontend.state.ProxyState;
import org.apache.shardingsphere.proxy.frontend.state.ProxyStateMachine;
import org.apache.shardingsphere.proxy.frontend.state.ProxyStateType;
import java.util.Optional;
......@@ -55,10 +55,10 @@ public final class CircuitBreakProxyState implements ProxyState {
@Subscribe
public synchronized void renew(final CircuitStateChangedEvent event) {
if (event.isCircuitBreak()) {
ProxyStateMachine.switchState(ProxyStateType.CIRCUIT_BREAK);
StateMachine.switchState(StateType.CIRCUIT_BREAK);
} else {
// TODO check previous state, maybe lock
ProxyStateMachine.switchState(ProxyStateType.OK);
StateMachine.switchState(StateType.OK);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册