1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
19
20 import org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
21 import org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired;
22 import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement;
23 import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
24 import org.apache.shardingsphere.infra.lock.GlobalLockNames;
25 import org.apache.shardingsphere.infra.lock.LockContext;
26 import org.apache.shardingsphere.infra.state.cluster.ClusterState;
27 import org.apache.shardingsphere.mode.lock.GlobalLockDefinition;
28 import org.apache.shardingsphere.mode.manager.ContextManager;
29 import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.cluster.event.ClusterStatusChangedEvent;
30
31
32
33
34 @DistSQLExecutorClusterModeRequired
35 public final class UnlockClusterExecutor implements DistSQLUpdateExecutor<UnlockClusterStatement> {
36
37 @Override
38 @SuppressWarnings({"unchecked", "rawtypes"})
39 public void executeUpdate(final UnlockClusterStatement sqlStatement, final ContextManager contextManager) {
40 checkState(contextManager);
41 LockContext lockContext = contextManager.getInstanceContext().getLockContext();
42 GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK.getLockName());
43 if (lockContext.tryLock(lockDefinition, 3000L)) {
44 try {
45 checkState(contextManager);
46 contextManager.getInstanceContext().getEventBusContext().post(new ClusterStatusChangedEvent(ClusterState.OK));
47
48 } finally {
49 lockContext.unlock(lockDefinition);
50 }
51 }
52 }
53
54 private void checkState(final ContextManager contextManager) {
55 ShardingSpherePreconditions.checkState(ClusterState.OK != contextManager.getClusterStateContext().getCurrentState(), () -> new IllegalStateException("Cluster is not locked"));
56 }
57
58 @Override
59 public Class<UnlockClusterStatement> getType() {
60 return UnlockClusterStatement.class;
61 }
62 }